Assembly 试图在程序集中执行阶乘,但导致堆栈溢出

Assembly 试图在程序集中执行阶乘,但导致堆栈溢出,assembly,x86,x86-16,Assembly,X86,X86 16,好的,所以我试着从我的大学课本中测试一个阶乘程序,当我按图所示正确键入它时,它会给我一个堆栈溢出错误 它发生在行推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 L

好的,所以我试着从我的大学课本中测试一个阶乘程序,当我按图所示正确键入它时,它会给我一个堆栈溢出错误

它发生在行
推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,在ebp中有MAX UNSIGNED INT-3。它在书堆外,因此“堆栈溢出”或访问不在您的书堆中的内容。

也许这本书的书堆正在上升(不过,这是不寻常的)。目前,每次推送某个对象时,它都会从ebp中减去,因为堆栈实际上会向下增长。(这似乎有点违反直觉,但大多数计算机都是这样做的)


所以,现在发生的事情是,将3推到地址0处的堆栈上,从ebp中减去4,在ebp中有MAX UNSIGNED INT-3。“堆栈溢出”或访问不在堆栈中的内容。

只有我或其他人认为您错过了

mov-eax,[ebp+8]

在函数开始时(开场白之后)?
在将参数与0进行比较之前,您无法从堆栈中获取参数。

只有我或其他人认为您遗漏了一个参数

mov-eax,[ebp+8]

在函数开始时(开场白之后)?
在将其与0进行比较之前,您没有从堆栈中获取参数。

您可能打算将3弹出到eax中,否则,eax未初始化。

您可能打算将3弹出到eax中,否则,eax未初始化。

EBP不是堆栈指针,ESP是。此外,如果可以访问从0开始的内存位置,则使用0初始化堆栈指针是完全有效的。将堆栈放在段的远端是一个古老的(realmode)技巧。EBP不是堆栈指针,ESP是。此外,如果可以访问从0开始的内存位置,则使用0初始化堆栈指针是完全有效的。将堆栈放在段的远端是一个古老的(realmode)技巧。