1 call factorial | 1 2 addl $4, %esp # scrubs the parameter that was | 2 3 # pushed on the stack | 3 $4 4 movl %eax, %ebx | 4 ret to 2 5 | 5 %ebp is 0, after is 5 6 factorial: | 6 $3 7 pushl %ebp | 7 ret to 18 8 movl %esp, %ebp | 8 %ebp is 5, after is 8 9 | 9 $2 10 movl 8(%ebp), %ebx | 10 ret to 18 11 cmpl $1, %eax | 11 %ebp is 8, after is 11 12 je end_fac | 12 $1 13 | 13 ret to 18 14 decl %eax | 14 %ebp is 11, after is 14 15 pushl %eax | 15 16 | 16 17 call factorial | 17 18 movl 8(%ebp), %ebx | 18 19 imull %ebx, %eax | 19 %esp %ebp 20 | 20 14 11 21 end_fac: | 21 11 8 22 movl %ebp, %esp | 22 8 5 23 popl %ebp | 23 5 0 24 ret | 24 25 | 25 ~ |~
Reference:
http://en.wikipedia.org/wiki/Call_stack
http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point
http://unixwiz.net/techtips/win32-callconv-asm.html
http://en.wikipedia.org/wiki/X86_assembly_language
http://www.xs4all.nl/~smit/asm01001.htm
http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames
No comments:
Post a Comment