Что означает "mov% reg8, (% reg32)" (не movb)?

тестовая платформа x86-32bit.

Я знаю, что на x86-32bit у нас есть два кода операций movsbl и movzbl, которые имеют следующую семантику:

%eax = 0x12345678
%edx = 0xAAAABBBB
MOVB %dh, %al         %eax = 0x123456BB
MOVSBL %dh, %eax      %eax = 0xFFFFFFBB
MOVZBL %dh, %eax      %eax = 0x000000BB

Приведенный выше пример взят здесь.

Тогда меня как бы смущает семантика следующей инструкции:

mov %dl, 0x2c(%esp)

Каково точное значение вышеприведенного mov, равно ли оно movsbl? или равно movzbl? Или ни то, ни другое?


person lllllllllllll    schedule 14.09.2015    source источник
comment
И нет, это простой 8-битный ход. Он запишет только один байт памяти. Обратите внимание, что это не mem32, это mem8 (неявно из-за используемого 8-битного регистра).   -  person Jester    schedule 14.09.2015
comment
Спасибо, @Jester. Значит, вы имеете в виду, что это на самом деле равно movb %dl, 0x2c(%esp)?   -  person lllllllllllll    schedule 14.09.2015
comment
Да, он генерирует точно такой же машинный код. Ассемблер определил размер b из используемого регистра.   -  person Jester    schedule 14.09.2015
comment
@ Jester, понял, спасибо   -  person lllllllllllll    schedule 14.09.2015


Ответы (1)


Если размеры операндов не указаны явно, большинство ассемблеров будет вычислять тип операции на основе размеров операндов. Следовательно, в этом случае mov %dl, 0x2c(%esp) эквивалентно movb %dl, 0x2c(%esp), простому перемещению на 1 байт, выводящему суффикс b из однобайтового регистра dl.

Причина использования 32-битного регистра: в нем хранится адрес ячейки памяти; нет результатов несоответствия в размерах операндов (поскольку ячейка памяти может быть интерпретирована как имеющая любой размер).

person owacoder    schedule 14.09.2015