Source: https://www.cs.ou.edu/~fagg/classes/ame3623_s06/lectures/class_asm.pdf