Что делает инструкция MOVZBL в синтаксисе IA-32 AT & T? - PullRequest
34 голосов
/ 16 февраля 2012

Что именно делает инструкция

movzbl  0x01(%eax,%ecx),%eax

?

Ответы [ 2 ]

36 голосов
/ 16 февраля 2012

Синтаксис AT & T разбивает мнемонику инструкции Intel movzx на разные мнемоники для источников разного размера (movzb против movzw). В синтаксисе Intel это:

movzx eax, byte ptr [eax+ecx+1]

т.е. загрузка байта из памяти в eax + ecx + 1 и расширение нуля до полного регистра.

Кстати, большинство инструментов GNU теперь имеют переключатель или параметр конфигурации для предпочтения синтаксиса Intel. (Например, objdump -Mintel или gcc -S -masm=intel, хотя последний влияет на синтаксис, используемый при компиляции inline-asm). Я бы порекомендовал изучить это, если вы не делаете сборку AT & T для жизни. См. Также теги для получения дополнительной документации и руководств.

19 голосов

Минимальный пример

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 upstream с утверждениями .

Мнемоника:

  • MOV
  • Нулевое расширение
  • Байт (8 бит)
  • в Long (32-бит)

Существуют также версии для других размеров:

  • movzbw: байт (8-разрядный) в слово (16-разрядный)
  • movzwl: от слова (16 бит) до длинного (32 бита)

Как и большинство инструкций GAS, при работе с регистрами вы можете опустить последний символ размера:

movzb %bl, %eax

но я не могу понять, почему мы не можем опустить предыдущую букву, например следующие ошибки:

movz %bl, %eax

Почему бы просто не вывести его из размера операндов, когда они являются регистрами для mov и синтаксиса Intel?

И если вы используете регистры неправильного размера, он не скомпилируется, например ::1010

movzb %ax, %eax
...