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