GCC内嵌汇编(三)

接下来是GCC内嵌汇编最后一部分了,  可能看起来讲的先后顺序有些乱,但是个人习惯吧,前面如果有些地方不明白的,看了后面的应该就清楚了。如果还是有疑惑的话,自己组织下内容效果更佳。

匹配限制符

I386 指令集中许多指令的操作数是读写型的(读写型操作数指先读取原来的值然后参加运算,最后将结果写回操作数) ,例如 addl %1,%0,它的作用是将操作数%0 与操作数%1的和存入操作数%0,因此操作数%0 是读写型操作数。老版本的 GCC 对这种类型操作数的支持不是很好,它将操作数严格分为输入和输出两种,分别放在输入部分和输出部分,而没有一个单独部分描述读写型操作数, 因此在 GCC 中读写型的操作数需要在输入和输出部分分别描述,靠匹配限制符将两者关联到一起。注意仅在输入和输出部分使用相同的 C变量,但是不用匹配限制符,产生的代码很可能不对,后面会分析原因。

匹配限制符是一位数字: “0”、“1”……“9” ,分别表示它限制的 C 表达式分别与占位符%0,%1……%9对应的C变量匹配。例如使用“0”作为%1的限制字符,那么%0和%1表示同一个 C变量。

看一下下面的代码就知道为什么要将读写型操作数,分别在输入和输出部分加以描述。 

该例功能是求 input+result的和,然后存入result:

extern int input,result;

 

void test_at_t()

{

  result = 0;

  input = 1;

  __asm__ __volatile__ ("addl %1,%0":"=r"(result): "r"(input));

 

}

对应的汇编代码为:

  movl $0,_result

  movl $1,_input

  movl _input,%edx

/APP

  addl %edx,%eax

/NO_APP

  movl %eax,%edx

  movl %edx,_result

 

input为输入型变量&#

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值