Как работают суффиксы инструкций 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.