5

我有以下用 MASM 为 i386 处理器编写的简单程序:

        TITLE   BLA
        .MODEL  SMALL
        .386
        .STACK
        .DATA
        .CODE
MAIN    PROC    FAR
        .STARTUP
        MOV     EBX,0FFFFFFFFH; (1)
        MOV     EAX,0EEEEEEEEH; (2)
       .EXIT
MAIN    ENDP
END

我对 EBX 寄存器的行为感到困惑。在 (1) 指令之后,EBX 设置为 1-s:

在此处输入图像描述

执行 (2) 指令不仅将值加载到 EAX 中,而且将 EBX 的上半部分归零:

在此处输入图像描述

为什么它实际上会发生?

4

1 回答 1

6

根据微软的说法,这是 Codeview 中的一个已知错误。请参阅知识库文章Q87548

症状

在 Microsoft CodeView 版本 4.0、4.01 和 4.05 中单步执行或跟踪代码时,始终保留 32 位寄存器(eax、ebx、edi 等)的下半部分,但上半部分可能已损坏。其他 386 特定的寄存器,例如 gs 和 fs 寄存器,也可能被损坏。制作动画时也会出现此问题。如果不是一次执行一条指令,则不会出现此问题。

地位

Microsoft 已经确认这是 CodeView 版本 4.0、4.01 和 4.05 中的问题。此问题已在 CodeView 4.1 版中得到纠正。

根据这篇文章,修复是获取 Codeview 4.1 或更高版本。

于 2019-03-13T18:22:20.177 回答