【问题标题】:Does a non-empty register stack cause a crash at program end?非空寄存器堆栈是否会导致程序结束时崩溃?
【发布时间】:2015-08-16 02:05:21
【问题描述】:

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

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

我觉得这意味着我应该清理 FPU 的寄存器堆栈。 所以我做了。我向一个未初始化的变量扔了一个 FSTP,但这并没有做任何事情。或者更确切地说,它没有解决任何问题。我做了更多的阅读,发现如果 FPU 存在未处理的异常,因为执行了其他非 FPU 指令,这可能会导致异常。所以我试着抛出一个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

【问题讨论】:

    标签: assembly floating-point masm irvine32


    【解决方案1】:

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

    invoke ExitProcess,0
    

    请注意,如果您还没有这样做,则需要包含 kernel32.inc 并链接到 kernel32.lib

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多