Что делает инструкция MovzBL в IA-32 AT & T Syntax?
Вопрос
Какая именно инструкция
movzbl 0x01(%eax,%ecx),%eax
делает?
Решение
Синтаксис AT & T расщепляет movzx
Инструкция Intel Mnemonic в разные мнемоники для разных размеров источников (movzb
против. movzw
) В синтаксисе Intel это:
movzx eax, byte ptr [eax+ecx+1]
т.е. загрузите байт из памяти в EAX+ECX+1 и Zero-Extend в полный регистр.
Кстати, большинство инструментов GNU теперь имеют переключатель или опцию конфигурации, чтобы предпочесть синтаксис Intel. (Такие как objdump -Mintel
или же gcc -S -masm=intel
, хотя последний влияет на синтаксис, используемый при компиляции Inline-ASM). Я, безусловно, рекомендую изучить это, если вы не делаете сборку AT & T для жизни. Смотрите также x86 Tag Wiki для большего количества документов и гидов.
Другие советы
Минимальный пример
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */
mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */
Runanble GitHub вверх по течению с утверждениями.
Мнемоника есть:
- Монета
- Zero Extend
- Байт (8-битный)
- до длинного (32-битный)
Есть также версии для других размеров:
movzbw
: Байт (8-битный) к слову (16-бит)movzwl
: Слово (16-бит) до длинного (32-битное)
Как и большинство инструкций по газе, вы можете опустить символ последнего размера при работе с регистрами:
movzb %bl, %eax
Но я не могу понять, почему мы не можем опустить до последней буквы, например, следующее не удалось:
movz %bl, %eax
Почему бы просто не вывести его из размера операндов, когда они регистрируются mov
И Intel Syntax?
И если вы используете регистры неправильного размера, он не сможет компилировать, например:
movzb %ax, %eax