_xchg的⽤法
⾸先我们要注意的是,xchg并不是⼀个两个数的值交换的函数,它是⼀个宏,xchg是宏,不是真正的函数,该宏根据不同的字长调⽤不⽤的汇编指令操作。在头⽂件中是这样定义的:
1#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long) \
2 (v),(ptr),sizeof(*(ptr))))
3
4static inline unsigned long __xchg(unsigned long x,
typeof的用法5 volatile void * ptr, int size)
6{
7 switch (size) {
8 case 1:
9 __asm__ __volatile__("xchgb %b0,%1"
10 :"=q" (x)
11 :"m" (*__xg(ptr)), "0" (x)
12 :"memory");
13 break;
14 case 2:
15 __asm__ __volatile__("xchgw %w0,%1"
16 :"=r" (x)
17 :"m" (*__xg(ptr)), "0" (x)
18 :"memory");
19 break;
20 case 4:
21 __asm__ __volatile__("xchgl %0,%1"
22 :"=r" (x)
23 :"m" (*__xg(ptr)), "0" (x)
24 :"memory");
25 break;
26 }
27 return x;
28}
它只是将第⼆个参数x放⼊寄存器中与第⼀个指针参数所指的内容交换,返回所指内容原先的值。谈不上两数交换值。但是它可以“原⼦”的设置ptr所指内容并取出原值,这正是我们想要的。
我们下来看个实例,来看它 的⽤法:
1#include <asm/system.h>
2int main()
3{
4 int i = 1,j = 2;
5 printf("i=%d, j=%d\n", i, j);
6 printf("xchg:%d\n", xchg(&i, j));
7 printf("i=%d, j=%d\n", i, j);
8 return 0;
9}
结果是:i=2,j=2。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论