非空寄存器堆栈会导致程序结束时崩溃吗?

Does a non-empty register stack cause a crash at program end?

我遇到了一个我无法理解的崩溃。这是可以理解的,因为我对 Assembly 还不是很了解。我在 Visual Studio 2013 年使用 MASM。

所有代码都在正确执行(我想。我有显示计算进行得很好的打印语句)。但是当事情到了程序的末尾时,它就崩溃了:未处理的异常 5880,program.exe 遇到了断点。

我觉得这意味着我应该清理 FPU 的寄存器堆栈。 所以我做了。我将 FSTP 扔到一个未初始化的变量中,但没有做任何事情。或者更确切地说,它没有解决任何问题。我做了更多的阅读,发现如果 FPU 存在未处理的异常,因为执行了其他非 FPU 指令,这可能会导致 funkiness。所以我试着抛出一个 fwait 让它有时间处理它的业务。它不处理垃圾。

我确定,再一次,我遗漏了一些简单的东西。这就是为什么我非常感谢有人向我指出它。

这是我的代码,如果有帮助的话。

    TITLE Circular Area.asm

INCLUDE Irvine32.inc

.data
prompt BYTE "Please input the radius of the cirle whose area you wish to calculate: " , 0
answer BYTE "The area of the circle is: " , 0
debug BYTE "I'm at least getting this far. So the FPU isn't bugged." , 0

.DATA?
radius DWORD ?
rsquared DWORD ?
answerF REAL8 ?

.code
FINIT
main PROC
    mov EAX, 0

    mov EDX, OFFSET prompt
    call WriteString

    call ReadDec
    mov radius, EAX
    mul radius
    mov rsquared, EAX

    FLDPI
    FIMUL rsquared

    mov EDX, OFFSET answer
    call WriteString
    call WriteFloat

    fwait
main ENDP
END main

您并没有告诉 OS 您希望结束应用程序的执行。由于这似乎是一个 Windows 应用程序,您应该使用 ExitProcess 函数:

invoke ExitProcess,0

请注意,您需要针对 kernel32.lib 添加 kernel32.inc 和 link,如果您还没有这样做的话。