rbr*_*200 8 c x86 gcc constraints inline-assembly
#include <stdlib.h>
static inline uint
xchg(volatile unsigned int *addr, unsigned int newval)
{
uint result;
asm volatile("lock; xchgl %0, %1" : "+m" (*addr), "=a" (result) : "1" (newval) : "cc");
return result;
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我这段代码到底是做什么的吗?我的意思是我有一个想法或这个命令的部分."1"newval是输入,"= a"是清除其先前的值并更新它."m"用于内存操作,但我对此功能的功能感到困惑."+ m"标志有什么作用?这个函数是否像m = a那样; m = newval; 回来一个
=并且+是约束修饰符.
http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
`='表示该操作数对该指令是只写的:先前的值被丢弃并被输出数据替换.
`+'表示该操作数由指令读写.
基本约束在这里
http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints
m允许使用内存操作数,以及机器通常支持的任何类型的地址...
1..允许匹配指定操作数的操作数.如果一个数字与同一替代中的字母一起使用,则数字应该是最后一个.
'a'是i386特有的
http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints
a a(eax)寄存器.
有constraints。它们不是变量,而是模式,例如“w”、“r”、“r+”fopen()
这里描述了其中一些
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
第 6 部分:有关约束的更多信息。
最后一个“cc”是“clobber”。
如果我们的指令可以改变条件代码寄存器,我们必须添加
"cc"到破坏列表中。
asm的完整格式是
asm ( assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
845 次 |
| 最近记录: |