我有以下用于i386处理器的用MASM编写的简单程序:
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的上半部分也为零:
为什么会真正发生?
答案 0 :(得分:4)
根据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或更高版本。