我目前正在编写汇编程序,以递归方式计算数字的阶乘。通过调试器后,我已经看到了正在发生的事情。所以例如3阶乘。
public f ; make sure function name is exported
f:
push ebp ; push frame pointer
mov ebp, esp ; update ebp
push edi
mov ecx, [ebp+8] ; gettting my parameter at p0
mov edi, ecx ; making a copy
cmp edi, 1 ; check if n is greater than 0
jle finished
dec ecx ; subtrack 1 frm parameter
push ecx ; passing new value of n to parameter p0
mov eax, 0
call f
mul edi ; multiplying n * n-1
jmp finished2
finished:
mov eax, 1
finished2:
pop edi
mov esp, ebp
pop ebp
ret
所以我想说我有3个输入,我应该有类似
的东西eax * 3(ecx)
eax * 2(ecx)
但是我注意到在击中基础案例后回来的路上..值2放在正确的位置,但值3从未进入正确的位置。
答案 0 :(得分:0)
使用调试器时,我会使用info reg(在gdb下)来确定寄存器是否具有正确的值
_start: pushl $4, popl %ebx call f f: movl %esp,%ebp movl 8(%ebp), %eax cmpl $1, %eax je finish decl %eax pushl %eax call factorial popl %ebx incl %ebx imul %ebx, %eax finish: movl %ebp, %esp popl %ebp ret