Вопрос

Какая именно инструкция

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 для жизни. Смотрите также 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top