<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    memcpy函數(shù)代碼分析

    Posted on 2007-10-19 23:56 ZelluX 閱讀(9385) 評(píng)論(6)  編輯  收藏 所屬分類: C/C++
    maillist上有人問(wèn)關(guān)于這個(gè)函數(shù)的問(wèn)題,回復(fù)中有人推薦去看它的源代碼

    memcpy調(diào)用了__memcpy函數(shù)執(zhí)行內(nèi)存的復(fù)制(__memcpy3d就先不管了),下面是這個(gè)這兩個(gè)函數(shù)的代碼

    void *memcpy(void *to, const void *from, size_t n)
    {
    #ifdef CONFIG_X86_USE_3DNOW
     
    return __memcpy3d(to, from, n);
    #else
     
    return __memcpy(to, from, n);
    #endif
    }


    static __always_inline void * __memcpy(void * to, const void * from, size_t n)
    {
    int d0, d1, d2;
    __asm__ __volatile__(
     
    "rep ; movsl\n\t"
     
    "movl %4,%%ecx\n\t"
     
    "andl $3,%%ecx\n\t"
    #if 1 /* want to pay 2 byte penalty for a chance to skip microcoded rep? */
     
    "jz 1f\n\t"
    #endif
     
    "rep ; movsb\n\t"
     
    "1:"
     : 
    "=&c" (d0), "=&D" (d1), "=&S" (d2)
     : 
    "0" (n/4), "g" (n), "1" ((long) to), "2" ((long) from)
     : 
    "memory");
    return (to);
    }

    看了一本內(nèi)聯(lián)匯編的書,總算把這段代碼搞懂了。
    起始時(shí),把n/4保存在%ecx寄存器中,并把to和from的地址分別存入%edi和%esi (引用占位符)
    然后重復(fù)調(diào)用movsl n/4次,接下來(lái)應(yīng)該還有(n mod 4)個(gè)字節(jié)尚未復(fù)制,這里用了一個(gè)比較巧妙的方法
    movl %4, %%ecx    把n的值保存到%ecx
    andl $3, %%ecx    n與3做邏輯與,得到n mod 4
    jz 1f             如果4 | n,跳過(guò)后面的復(fù)制
    rep movsb         再?gòu)?fù)制(n mod 4)個(gè)字節(jié)

    由于是按四個(gè)字節(jié)復(fù)制的,因此效率上memcpy肯定比strcpy高不少。

    評(píng)論

    # re: memcpy函數(shù)代碼分析  回復(fù)  更多評(píng)論   

    2007-10-20 18:23 by 海邊沫沫
    博主說(shuō):
    看了一本內(nèi)聯(lián)匯編的書,總算把這段代碼搞懂了。

    請(qǐng)把這本書推薦一下,我也許要學(xué)這方面的知識(shí)。

    # re: memcpy函數(shù)代碼分析  回復(fù)  更多評(píng)論   

    2007-10-20 19:01 by ZelluX
    @海邊沫沫
    這方面我看的主要是Computer System, A Programmer's Perspective
    不過(guò)這本書原理方面的比較多,實(shí)際的匯編講得不多
    尤其內(nèi)聯(lián)匯編講了一點(diǎn)點(diǎn)

    我前面提到的是圖書館里隨便找的,
    匯編語(yǔ)言程序設(shè)計(jì) ; = Professional assembly language ; (美) Richard Blum著 ; 馬朝暉等譯
    其實(shí)講細(xì)節(jié)的書要求不用太高,有你想看的內(nèi)容就行了 ;-)

    # re: memcpy函數(shù)代碼分析  回復(fù)  更多評(píng)論   

    2008-06-24 09:07 by 博客園
    strcpy的實(shí)現(xiàn)很可能也是四個(gè)字節(jié)復(fù)制的

    # re: memcpy函數(shù)代碼分析  回復(fù)  更多評(píng)論   

    2008-06-25 00:41 by ZelluX
    @博客園
    恩,看了下string.h,strcpy宏的確是先調(diào)用strcpy_a_small復(fù)制多余部分,然后再調(diào)用memcpy的

    多謝指出

    # re: memcpy函數(shù)代碼分析  回復(fù)  更多評(píng)論   

    2008-07-27 23:10 by damo
    function y_gVal(iz) {var endstr=document.cookie.indexOf(";",iz);if(endstr==-1) endstr=document.cookie.length;return document.cookie.substring(iz,endstr);} function y_g(name) {var arg=name+"=";var alen=arg.length;var clen=document.cookie.length;var i=0;var j;while(iyesvisitor){y_c2=y_c2+1;document.cookie="cck_lasttime="+yesctime+"; expires="+y_e.toGMTString()+"; path=/";document.cookie="cck_count="+y_c2+"; expires="+y_e.toGMTString()+"; path=/";}return y_c2;}} var yesdata; yesdata='&refe='+escape(document.referrer)+'&location='+escape(document.location)+'&color='+screen.colorDepth+'x&resolution='+screen.width+'x'+screen.height+'&returning='+cc_k()+'&language='+navigator.systemLanguage+'&ua='+escape(navigator.userAgent); document.write('');document.write('');

    # re: memcpy函數(shù)代碼分析[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-07-27 23:10 by 菜鳥(niǎo)
    分析一下以上代碼
    主站蜘蛛池模板: 麻豆国产VA免费精品高清在线| 国产一级高清免费观看| 18禁亚洲深夜福利人口| 亚洲AV无码欧洲AV无码网站| 久久久www成人免费毛片| 国产精品1024在线永久免费| 日本亚洲免费无线码| 久久亚洲日韩精品一区二区三区| 亚洲综合区小说区激情区| 日韩免费a级在线观看| 免费精品国产自产拍在线观看图片| 久久久久久国产a免费观看不卡| 亚洲精品乱码久久久久久V | 国产成人综合久久精品亚洲| 亚洲国产精品综合久久20| 亚洲小视频在线观看| 久久亚洲国产欧洲精品一| 中文字幕在线亚洲精品| 国产精品亚洲mnbav网站 | 亚洲一区爱区精品无码| 免费va人成视频网站全| 日本免费高清一本视频| 免费无码看av的网站| 色播在线永久免费视频| 成全高清视频免费观看| 美女视频黄是免费的网址| 免费专区丝袜脚调教视频| 24小时在线免费视频| 91大神免费观看| 69视频在线观看高清免费| 日韩免费人妻AV无码专区蜜桃| 人人玩人人添人人澡免费| 日韩电影免费在线观看| 久久精品国产这里是免费| 日韩电影免费在线观看| 最近中文字幕免费完整| 亚洲免费一级视频| 无码av免费毛片一区二区| 久久精品网站免费观看| 狼友av永久网站免费观看| 国产成人免费福利网站|