Source: http://www.sce.carleton.ca/courses/sysc-3006/f11/Part6-BasicAssembly.pdf