2015-09-14 6 views
0

испытательная платформа x86-32bit.В чем смысл «mov% reg8, (% reg32)» (не movb)?

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

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

Приведенный выше пример из here.

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

mov %dl, 0x2c(%esp) 

Что такое точное значение выше mov, он равен movsbl? или равна movzbl? Или нет?

+0

Ничего, это простой 8-битный ход. Он будет писать только один байт памяти. Обратите внимание, что это не 'mem32', а' mem8' (неявный из-за использования 8-битного регистра). – Jester

+0

Спасибо @Jester. Значит, вы на самом деле равны 'movb% dl, 0x2c (% esp)'? – computereasy

+3

Да, он генерирует тот же машинный код. Ассемблер вывел размер 'b' из используемого регистра. – Jester

ответ

1

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

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