Какое значение будет в EAX после выполнения каждой инструкции?

Я пытаюсь отслеживать регистр EAX через каждый фрагмент кода в программе MASM32. Мне нужна помощь, чтобы объяснить, почему это такая ценность. Вот что у меня есть:

.DATA
 alfa BYTE 96h

.CODE
 start:

 MOV EAX,0  ; move 0 to eax 
 MOV AL,alfa ; move 96h to AL, this says the value of eax is now positive 150
 MOVZX EAX,alfa ; still says EAX is 96h and value is  positive 150
 MOVSX EAX,alfa  ; says value is negative 106 and eax register is FFFFFF96

 call DumpRegs
 call WriteInt
exit
END start

Я использую DumpRegs для отображения регистров и WriteInt для печати значения EAX. У меня есть несколько вопросов:

  1. Когда MOV AL, alfa, он перемещает alfa в регистр EAX, разве AL не является 8-битным регистром? почему он это делает? Почему WriteInt говорит, что значение +150?
  2. Что делают MOVZX и MOVSX?
  3. Что делает MOVZX EAX, alfa? Ни одно из значений не изменилось?
  4. MOVSX EAX, alfa, почему это -106 и регистр EAX FFFFFF96? Это потому, что он отрицательный?

person user2673161    schedule 11.03.2014    source источник
comment
Что делает каждая инструкция, следует объяснить в руководстве по процессору. Если в руководстве к процессору что-то непонятно, просьба уточнить.   -  person Raymond Chen    schedule 11.03.2014


Ответы (1)


Вы инициализируете eax равным 0, поэтому значение равно 0

mov eax, 0
EAX-----
    AX--
    AHAL
00000000

mov al, 96h

EAX-----
    AX--
    AHAL
00000096

Остальная часть регистра не изменяется при обращении к AL, поэтому остается неизменной.

Чтобы проиллюстрировать это:

mov eax, -1
EAX-----
    AX--
    AHAL
ffffffff

mov al, 96h

EAX-----
    AX--
    AHAL
ffffff96

movesx загружает значение с расширением знака. Поскольку 096h отрицательное значение (установлен старший бит), он расширит знак на весь 32-битный регистр.

movzx не подписывает расширение и очищает биты.

person Devolus    schedule 11.03.2014
comment
Еще раз спасибо за вашу помощь! Есть ли хоть какая-то причина, по которой вызов WriteInt печатает +150? - person user2673161; 11.03.2014