试图在汇编中执行阶乘但导致堆栈溢出

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 未初始化。