_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小时内删除。