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"

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/01/29/2881688.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值