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)技巧。