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的上半部分也为零:
为什么实际上会发生?
根据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或更高版本。