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

时间:2015-08-16 02:05:22

标签: assembly floating-point masm irvine32

我遇到了一个我不明白的崩溃。这是可以理解的,因为我对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

1 个答案:

答案 0 :(得分:3)

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

invoke ExitProcess,0

请注意,如果您还没有这样做,则需要包含kernel32.inc并与kernel32.lib相关联。