试图在汇编中执行阶乘但导致堆栈溢出
Trying to perform a factorial in assembly but causing stack overflow
好的,所以我正在尝试测试大学课本中的阶乘程序,当我如图所示正确键入它时,它给我一个堆栈溢出错误。
它发生在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
也许这本书的书堆在上升(尽管这很不寻常)。目前,每次推送内容时它都会从 ebp 中减去,因为堆栈实际上是向下增长的。 (这似乎有点违反直觉,但大多数计算机都是这样做的)
那么,发生的事情是,您将 3 压入地址 0 处的堆栈,从 ebp 中减去 4,并且现在 MAX UNSIGNED INT - 3 在 ebp 中。哪个不在堆栈中,所以 "stack overflow" 或者,访问不在堆栈中的内容。
只有我或其他人认为您错过了一个
mov eax, [ebp+8]
在函数的开头(序言之后)?
在将参数与 0 进行比较之前,您没有从堆栈中获取参数。
您可能打算将 3 弹出到 eax 中,否则 eax 未初始化。
好的,所以我正在尝试测试大学课本中的阶乘程序,当我如图所示正确键入它时,它给我一个堆栈溢出错误。
它发生在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
也许这本书的书堆在上升(尽管这很不寻常)。目前,每次推送内容时它都会从 ebp 中减去,因为堆栈实际上是向下增长的。 (这似乎有点违反直觉,但大多数计算机都是这样做的)
那么,发生的事情是,您将 3 压入地址 0 处的堆栈,从 ebp 中减去 4,并且现在 MAX UNSIGNED INT - 3 在 ebp 中。哪个不在堆栈中,所以 "stack overflow" 或者,访问不在堆栈中的内容。
只有我或其他人认为您错过了一个
mov eax, [ebp+8]
在函数的开头(序言之后)? 在将参数与 0 进行比较之前,您没有从堆栈中获取参数。
您可能打算将 3 弹出到 eax 中,否则 eax 未初始化。