Верхние биты EBX обнуляются при пошаговом переходе в CodeView
У меня есть следующая простая программа, написанная на 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 с:
Выполнение инструкции (2) не только загружает значение в EAX, но также обнуляет верхнюю половину EBX:
Почему это на самом деле происходит?
1 ответ
Согласно 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 или более поздней версии.