嵌入汇编语句的基本格式为:
asm("汇编语句"
:输出寄存器
:输入寄存器
:会被修改的寄存器
);
常用的寄存器约束的缩写
:
r:I/O,表示使用一个通用寄存器,由GCC在%eax/ %ax/ %al、%ebx/ %bx/ %bl、%ecx/ %cx /%cl、%edx/%dx/%dl中选取一个GCC认为是合适的;
q:I/O,表示使用一个通用寄存器,与r的意义相同;
g:I/O,表示使用寄存器或内存地址;
m:I/O,表示使用内存地址;
a:I/O,表示使用%eax/%ax/%al;
b:I/O,表示使用%ebx/%bx/%bl;
c:I/O,表示使用%ecx/%cx/%cl;
d:I/O,表示使用%edx/%dx/%dl;
D:I/O,表示使用%edi/%di;
S:I/O,表示使用%esi/%si;
f:I/O,表示使用浮点寄存器;
t:I/O,表示使用第一个浮点寄存器;
u:I/O,表示使用第二个浮点寄存器;
A:I/O,表示把%eax与%edx组合成一个64位的整数值;
o:I/O,表示使用一个内存位置的偏移量;
V:I/O,表示仅仅使用一个直接内存位置;
i:I/O,表示使用一个整数类型的立即数;
n:I/O,表示使用一个带有已知整数值的立即数;
F:I/O,表示使用一个浮点类型的立即数;
=: O 表示此Output操作表达式是只写的
+ :O 表示此Output操作表达式是可读可写的
&:O 表示此Output操作表达式独占为其指定的寄存器
%:I 表示此Input操作表达式中的C/C++表达式可以与下一个Input操作表达式中的C/C++表达式互换
嵌入汇编程序规定把输出和输入寄存器统一按顺序编号,顺序是从输出寄存器序列从左到右,从上到下以"%0"开始,分别计为%0,%1,...,%9。
在执行代码时,如果不希望汇编语句被gcc优化而修改,就需要在asm符号后面添加关键字volatile。(__asm__volatile_(......);)
从制定段和偏移值的内存地址处取一个字节。
此处)折叠或打开
#define get_seg_byte(seg,addr) \
({ \
; \
("push % %fs; \
mov % %ax,% %fs; \
movb % %fs:%2,% %al; \
pop % %fs" \
:"=a"(_res) \
:"0"(seg),"m"(*(addr))); \ //"0"表示使用和上面同个位置的输出相同的寄存器
;})
标签:表示,汇编,嵌入,寄存器,浮点,fs,使用,表达式 From: https://blog.51cto.com/u_16087831/6223404