__xchg 函数的用法
2016-09-16 21:15
1716 查看
CPU X86 32位
文件:arch\x86\include\asm\cmpxchg_32.h
xchg是宏,不是真正的函数,该宏根据不同的字长调用不用的汇编指令操作。
举例:
int i = 10, j = 20;
xchg(&i, j); 返回值10;
//调用该宏后
i = 20, j = 20
文件:arch\x86\include\asm\cmpxchg_32.h
/* * Note: no "lock" prefix even on SMP: xchg always implies lock anyway. * Since this is generally used to protect other memory information, we * use "asm volatile" and "memory" clobbers to prevent gcc from moving * information around. */ #define __xchg(x, ptr, size) \ ({ \ __typeof(*(ptr)) __x = (x); \ switch (size) { \ case 1: \ { \ volatile u8 *__ptr = (volatile u8 *)(ptr); \ asm volatile("xchgb %0,%1" \ : "=q" (__x), "+m" (*__ptr) \ : "0" (__x) \ : "memory"); \ break; \ } \ case 2: \ { \ volatile u16 *__ptr = (volatile u16 *)(ptr); \ asm volatile("xchgw %0,%1" \ : "=r" (__x), "+m" (*__ptr) \ : "0" (__x) \ : "memory"); \ break; \ } \ case 4: \ { \ volatile u32 *__ptr = (volatile u32 *)(ptr); \ asm volatile("xchgl %0,%1" \ : "=r" (__x), "+m" (*__ptr) \ : "0" (__x) \ : "memory"); \ break; \ } \ default: \ __xchg_wrong_size(); \ } \ __x; \ }) #define xchg(ptr, v) \ __xchg((v), (ptr), sizeof(*ptr))
xchg是宏,不是真正的函数,该宏根据不同的字长调用不用的汇编指令操作。
举例:
int i = 10, j = 20;
xchg(&i, j); 返回值10;
//调用该宏后
i = 20, j = 20
相关文章推荐
- C++成员函数指针一种用法
- [教程]JScript中的变量引用规则(补充,函数用法说明)
- eval函数的用法
- SQL中CONVERT转化函数的用法
- oracle中常用的字符串查找、替换以及截取函数的用法!
- sql 中convert()函数的用法
- sql时间函数的基本用法
- javascript 中的window.open()函数用法
- PHP--str_pad()函数用法
- Setparent函数用法技巧
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- C++变长参数函数的用法(转载)
- window.moveTo()函数用法示例
- EXCEL 中自定义函数的应用(关于 XOR 在 EXCEL 中的用法 及 文本型数字求和)
- decode 函数的用法
- 函数内Static初始化的用法
- sql 函数的用法
- 函数内Static初始化的用法
- AnimateWindow函数用法
- oracle trunc()函数的用法