Верхние биты 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 или более поздней версии.

Другие вопросы по тегам