Chinaunix首页 | 论坛 | 博客
  • 博客访问: 898728
  • 博文数量: 194
  • 博客积分: 7991
  • 博客等级: 少将
  • 技术积分: 2067
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-09 22:03
文章分类

全部博文(194)

文章存档

2010年(8)

2009年(71)

2008年(109)

2007年(6)

我的朋友

分类: LINUX

2009-02-10 16:44:44

关于output限定符中&的含义:

GCC编译器不得为任何input表达式使用与此output表达式相同的寄存器。

原因是,此output表达式需要在所有input表达式被输入之前属出。


__asm__ __volatile__ (
       "popl %0\n\t"
       "movl %1, %%esi\n\t"
       "movl %2, %%edi\n"
       : "=&a"(__out)
       : "r"(__in1), "r"(__in2)
);


输出部的处理时机是在汇编代码执行之后,而输入部是在汇编代码执行之前。

这段代码的流程是:

1. __in1__in2将会被装入GCC随机选定的寄存器xy

2. 将栈顶数字w弹出到eax

3. 将寄存器x的值复制到esi,将寄存器y的值放入edi

4. eax中的这个数字w保存到__out

注意,如果xy中不幸有一个是寄存器eax,那么,第2步骤中的操作会覆盖eax的值,导致esiedi不是__in1__in2的原始值。此时如果在"=&a"(__out)有一个&号,则xy都不会是eax了,就避免出错了。


阅读(2052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~