好的,所以我正在尝试从我的大学书中测试一个阶乘程序,当我按正确的方式键入它时,它会给我一个堆栈溢出错误。
它发生在push ebp
行。有谁能告诉我出了什么问题?
.code
main PROC
mov ebp,0
push 3
call Factorial
call WriteDec
call Crlf
exit
main ENDP
Factorial PROC
push ebp
mov ebp,esp
cmp eax,0
ja L1
mov eax,1
jmp L2
L1:
dec eax
push eax
call Factorial
ReturnFact:
mov ebx,[ebp+8]
mul ebx
L2:
pop ebp
ret 4
Factorial ENDP
答案 0 :(得分:3)
只是我或其他任何人认为你错过了
mov eax, [ebp+8]
在功能开始时(序言之后)? 在将它与0进行比较之前,你没有从堆栈中获取参数。
答案 1 :(得分:1)
也许这本书有一个堆栈上升(但这是不寻常的)。目前,每次推送东西时它都会从ebp中减去,因为堆栈实际上已经减少了。 (这似乎有点违反直觉,但这就是它在大多数计算机中的表现)
那么,发生了什么,是你在地址0上将3推入堆栈,从ebp减去4,并且在ebp中使用MAX UNSIGNED INT - 3。哪个是堆栈,所以"堆栈溢出"或者,访问不在你堆栈中的东西。
答案 2 :(得分:0)
你可能打算将3弹入eax,否则,eax是未初始化的。