亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4604 | 回復(fù): 1
打印 上一主題 下一主題

xchg作用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-03-20 16:54 |只看該作者 |倒序?yàn)g覽
xchg并不是交換兩值,看一部分:
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long) \
                                         (v),(ptr),sizeof(*(ptr))))
static inline unsigned long __xchg(unsigned long x,
                                  volatile void * ptr, int size)
{
    switch (size) {
        case 1:
            __asm__ __volatile__("xchgb %b0,%1"
                :"=q" (x)
                :"m" (*__xg(ptr)), "0" (x)
                :"memory");
            break;
        case 2:
            __asm__ __volatile__("xchgw %w0,%1"
                :"=r" (x)
                :"m" (*__xg(ptr)), "0" (x)
                :"memory");
            break;
        case 4:
            __asm__ __volatile__("xchgl %0,%1"
                :"=r" (x)
                :"m" (*__xg(ptr)), "0" (x)
                :"memory");
            break;
    }
    return x;
}
它只是將第二個參數(shù)x放入寄存器中與第一個指針參數(shù)所指的內(nèi)容交換,返回所指內(nèi)容原先的值。談不上兩數(shù)交換值。但是它可以“原子”的設(shè)置ptr所指內(nèi)容并取出原值,這正是我們想要的。
可以參考一下下面小程序的結(jié)果:
#include
int main()
{
    int i = 1,j = 2;
    printf("i=%d, j=%d\n", i, j);
    printf("xchg:%d\n", xchg(&i, j));
    printf("i=%d, j=%d\n", i, j);
    return 0;
}
結(jié)果為:
i=1, j=2
xchg:1
i=2, j=2


本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/93336/showart_1870112.html

論壇徽章:
0
2 [報告]
發(fā)表于 2013-09-23 23:23 |只看該作者
糾正一下樓主,確實(shí)是交換了,你的測試程序里最后j還是等于2,是因?yàn)閤chg()函數(shù)調(diào)用傳遞的是j的副本(值傳遞)。在xchg()函數(shù)返回之前,其2個形參確有交換。
參考代碼:------------------------------------------------------------------------
#include <stdio.h>

struct __xchg_dummy { unsigned long a[100]; };
#define __xg(x) ((struct __xchg_dummy *)(x))

static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
{
        printf("j=%d, *ptr=%d\n", (int)x, *(int *)ptr);        // add
        switch (size) {
                case 1:
                        __asm__ __volatile__("xchgb %b0,%1"
                                :"=q" (x)
                                :"m" (*__xg(ptr)), "0" (x)
                                :"memory");
                        break;
                case 2:
                        __asm__ __volatile__("xchgw %w0,%1"
                                :"=r" (x)
                                :"m" (*__xg(ptr)), "0" (x)
                                :"memory");
                        break;
                case 4:
                        __asm__ __volatile__("xchgl %0,%1"
                                :"=r" (x)
                                :"m" (*__xg(ptr)), "0" (x)
                                :"memory");
                        break;
        }
        printf("j=%d, *ptr=%d\n", (int)x, *(int *)ptr);        // add
        return x;
}

#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))

int main(int argc, char** argv)

{
     int i = 1,j = 2;
     printf("i=%d, j=%d\n", i, j);
     printf("xchg:%d\n", xchg(&i, j));
     printf("i=%d, j=%d\n", i, j);
     return 0;
}
運(yùn)行結(jié)果:
i=1, j=2
j=2, *ptr=1
j=1, *ptr=2
xchg:1
i=2, j=2
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP