AT&T 内联汇编注记
AT&T标准的汇编相对X86汇编主要有以下几点区别:
- %eax,加%表示寄存器,在内联中要加%%
- $0x04,立即数加$
- 目的地址与源地址相反,mov %eax(源), %ebx(目的)
- 指令后加操作数长度,如movb(8 bit)、movw(16 bit)、movl(32 bit)
- 内存引用,如下:
X86语法格式: section:[base + index*scale + dispacement] AT&T语法格式: section:displacement(base,index,scale)
完整的内联汇编格式如下:
_asm_("asm statements":outputs:inputs:registers-modified);
例子:
void main()// 完成将a赋值给b { int a = 10; int b = 0; _asm_ _volatile_(
"movl %1, %%eax;\\n\\r" /* %num表示操作数,num是从输出开始的约束编号,例如第0个出现的是b*/ "movl %%eax, %0;" :"=r(b)" /* 输出操作表达式 */ :"r(a)" /* 输入操作表达式 */ :"%eax"); /* 该指令中受影像的是eax */ }
在内联汇编中的常用约束有:
- 内存单元:"m"、"v"、"o"
- 任何寄存器:"r"
- 寄存器eax、ebx、ecx、edx之一:"q"
- 直接操作数:"i"、"h"
- 寄存器eax、ebx、ecx、edx:"a"、"b"、"c"、"d"
- 寄存器esi和edi:"S"和"D"
- 常数0至31:"I"
- 任意:"g"
- 浮点数:"E"、"F"