Как работают суффиксы инструкций GNU на ассемблере x86, такие как ".s" в "mov.s"?

Похоже, что ассемблер GNU имеет некоторые средства для управления альтернативными формами кода операции, испускаемого для некоторых инструкций. Например

.intel_syntax noprefix
mov   eax, ecx
mov.s eax, ecx

Обработка вышеуказанного кода с as test.s -o test.o && objdump -d test.o -M intel дает следующую разборку:

0:   89 c8                   mov    eax,ecx
2:   8b c1                   mov    eax,ecx

Мы это видим .s появляется суффикс для переключения 89 код операции для 8b версия (и соответственно изменить байт ModRM).

Как работает этот синтаксис в GAS? Я не могу найти соответствующую документацию.

1 ответ

Решение

Начиная с Binutils 2.29, суффиксы команд теперь устарели в пользу псевдопрефиксов. Вы можете найти более старые суффиксы, документированные на информационных страницах GNU Assembler (до 2.29). Ранее info as страницы говорят это:

9.15.4.1 Наименование инструкций

[Надрез]

Различные опции кодирования могут быть указаны с помощью необязательного мнемонического суффикса. Суффикс .s заменяет 2 операнда регистра в кодировке при переходе от одного регистра к другому. Суффикс.d8 или .d32 предпочитает 8-битное или 32-битное смещение в кодировке.

Документирование новых псевдопрефиксов, Binutils 2.29 (и позже) info as страницы были исправлены следующим образом:

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

  • {disp8} - предпочитают 8-битное смещение.
  • {disp32} - предпочитают 32-битное смещение.
  • {load} - предпочитает инструкцию load-form.
  • {store} - предпочитаю инструкцию в форме магазина.
  • {vex2} - предпочитайте 2-байтовый префикс VEX для инструкции VEX.
  • {vex3} - предпочитайте 3-байтовый префикс VEX для инструкции VEX.
  • {evex} - кодировать с префиксом EVEX.
Другие вопросы по тегам