在CodeView中单步执行时,EBX的高位被清零

Kir*_*ill 5 x86 assembly masm code-view x86-16

我有以下用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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

在此处输入图片说明

为什么实际上会发生?

Mic*_*tch 6

根据Microsoft的说法,这是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或更高版本。

  • 哇!直接比赛!非常感谢你! (2认同)