Верхние биты EBX обнуляются при однократном переходе в CodeView

#assembly #x86 #masm #x86-16 #code-view

#сборка #x86 #masm #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
  

Меня смущает поведение регистра EBX. После выполнения инструкции (1) EBX устанавливается равным 1 с:

введите описание изображения здесь

Выполнение инструкции (2) не только загружает значение в EAX, но и обнуляет верхнюю половину EBX:

введите описание изображения здесь

Почему это происходит на самом деле?

Комментарии:

1. Это абсолютно ненормально. Где вы это выполняете?

2. Я использую виртуальную машину VirtualBox с установленными Win98 и MASM 6.11. Скриншоты взяты из ProgrammersWorkBench (PWB), который входит в дистрибутив MASM, а также из CodeView debugger. Это происходит только с EBX, все остальные GP-регистры содержат 32-разрядные значения. Сначала я подумал, что это может произойти из-за размера слова сегмента, который установлен на 16 бит, как я использую. МОДЕЛЬ до директивы .386. Но теперь я не вижу никакой зависимости.

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