ПрограммированиеСтатьиОбщее

Ассемблерные вставки в GCC (5 стр)

Автор:

Дополнительно


В этом разделе собраны дополнительные сведения, не попавшие в основные разделы.

Модификаторы операндов


В ассемблерной вставке можно использовать модификаторы, изменяющие смысл (и текстовую подстановку) для операндов.
Пример:
     uint16_t  num;
     asm volatile ("xchg %h0, %b0" : "+a" (num) );

Результат:

     xchg %ah, %al

Список модификаторов (подробнее см. https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html (6.44.2.8 x86 Operand Modifiers) и http://locklessinc.com/articles/gcc_asm/ (X86 Operand Modifiers)):

МодификаторЗначение
zСуффикс для инструкций (b,w,l,q) исходя из размера аргумента
ZТо же, но работает и для регистров FPU
B, W, L, S, TЯвное указание суффикса суффикса для инструкций (b,w,l,s,t)
bМладшие 8 бит (al, bl, cl, dl)
hСтаршие 8 бит (ah, bh, ch, dh)
wМладшие 16 бит (ax, bx и т. д.)
kМладшие 32 бита (eax и т. д.)
q64 бита (rax и т. д.)
lМетка, без пунктуации (например .L2)
cКонстанта без пунктуации (без префикса $)
aСкобки вокруг имени регистра (для непрямой адресации)
AЗвёдочка перед именем регистра (для непрямых переходов)
pИмя без пунктуации
PИмя без пунктуации (в т. ч. для имён функций)
XДобавление префикса $ к имени
HСтаршие 8 байт SSE переменной
yПревращает 'st' в 'st(0)'
nМеняет знак константы и подавляет префикс $
sЦелочисленная константа с последующей запятой
tAVX-версия названия SSE-регистра
xSSE-версия названия AVX-регистра
dДублирует операнд

Примечание: большинство информации в таблице автором данной статьи не проверялось.

Явное указание регистров для переменных


См. https://gcc.gnu.org/onlinedocs/gcc/Explicit-Register-Variables.html .
Пример:

register int foo asm ("eax");

Их семантика имеет неочевидные особенности, подробнее см. в документации.
Довольно странный (более того - сомнительный) пример использования можно найти в:
http://www.flipcode.com/archives/How_To_Read_The_TSC_With_GCC.shtml

Явное указание имён


Документация: https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html .
Примеры:

int foo asm ("myfoo") = 2;
int func (int x, int y) asm ("MYFUNC");

Вычисление размера кода


Иногда (например для выбора между ближними/дальними переходами) компилятору нужно оценить размер кода, генерируемого ассемблерной вставкой. Документацию по используемой эвристике см. в https://gcc.gnu.org/onlinedocs/gcc/Size-of-an-asm.html .

Недокументированные возможности


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

Литература


https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html
http://sourceware.org/binutils/docs-2.26/as/index.html
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
http://locklessinc.com/articles/gcc_asm/
http://www.ethernut.de/en/documents/arm-inline-asm.html
https://ru.wikipedia.org/wiki/GCC_Inline_Assembly
https://en.wikipedia.org/wiki/X86_assembly_language#Syntax
Зубков С. В. "Ассемблер: Язык неограниченных возможностей" ISBN 5-89818-019-2, ДМК, 1999
Страницы: 1 2 3 4 5

#GCC, #inline, #ассемблер

30 апреля 2016 (Обновление: 4 мая 2016)

Комментарии [32]