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"

你可能感兴趣的:(汇编)