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

时间:2015-06-22 18:57:31

标签: assembly x86 x86-16

好的,所以我正在尝试从我的大学书中测试一个阶乘程序,当我按正确的方式键入它时,它会给我一个堆栈溢出错误。

它发生在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

3 个答案:

答案 0 :(得分:3)

只是我或其他任何人认为你错过了

mov eax, [ebp+8]

在功能开始时(序言之后)? 在将它与0进行比较之前,你没有从堆栈中获取参数。

答案 1 :(得分:1)

也许这本书有一个堆栈上升(但这是不寻常的)。目前,每次推送东西时它都会从ebp中减去,因为堆栈实际上已经减少了。 (这似乎有点违反直觉,但这就是它在大多数计算机中的表现)

那么,发生了什么,是你在地址0上将3推入堆栈,从ebp减去4,并且在ebp中使用MAX UNSIGNED INT - 3。哪个是堆栈,所以"堆栈溢出"或者,访问不在你堆栈中的东西。

答案 2 :(得分:0)

你可能打算将3弹入eax,否则,eax是未初始化的。