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

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

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

    注銷

    注銷

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      112 隨筆 :: 7 文章 :: 18 評論 :: 0 Trackbacks

    在傳統(tǒng)C中,函數(shù)的參數(shù)和返回值都是以復(fù)制傳送的.
    看這段代碼
    struct Big
    {
    ?char buf[1024];
    }B,B2;

    Big bigfun(Big b)
    {
    ?return b;
    }

    int main()
    {
    ?B2 = bigfun(B);
    ?return 0;
    }

    其中B2 = bigfun(B)要被由以下幾個過程組成
    1.B要以傳值方式傳送到函數(shù)的參數(shù)表中中
    2.如果返回值size很小,可以返回eax中
    ? 但是在這里,返回值size很大,要建立臨時變量
    ? 然后將臨時變量的地址入棧,此時非常象函數(shù)參數(shù)入棧
    ? 返回eax指向這個臨時變量
    3.將這個臨時變量拷貝到B2上

    B2 = bigfun(B);
    展開為
    ;構(gòu)造臨時堆棧
    004017AE? sub???????? esp,400h?;堆棧大小1024(400h)
    ;由于函數(shù)調(diào)用是傳值方式,所以將B復(fù)制到bigfun中的參數(shù)中
    ;相當(dāng)于將B push到堆棧中
    004017B4? mov???????? ecx,100h?;傳送大小1024(100h*4)
    004017B9? mov???????? esi,offset B (421138h) ;源是B首地址
    004017BE? mov???????? edi,esp?;目的為bigfun中的參數(shù)地址
    004017C0? rep movs??? dword ptr [edi],dword ptr [esi] ;復(fù)制
    ;調(diào)用函數(shù),此時push eax中的eax并非是函數(shù)參數(shù)壓棧,而是將一個臨時對象的指針壓棧
    004017C2? lea???????? eax,[ebp-4C4h]
    004017C8? push??????? eax?;將堆棧中一個臨時對象地址壓堆棧
    004017C9? call??????? bigfun (401750h) ;調(diào)用函數(shù)
    004017CE? add???????? esp,404h?;清除堆棧(400h+4),堆棧跳過函數(shù)參數(shù)表和函數(shù)返回地址
    ;臨時對象為返回變量,eax指向這個地址
    ;將這個臨時對象復(fù)制另一個臨時對象上
    004017D4? mov???????? ecx,100h?;傳送大小1024(100h*4)
    004017D9? mov???????? esi,eax?;目的上面臨時對象的地址
    004017DB? lea???????? edi,[ebp-8CCh] ;堆棧中第三個臨時對象
    004017E1? rep movs??? dword ptr [edi],dword ptr [esi] ;復(fù)制
    ;將第二個臨時對象復(fù)制到B2上
    004017E3? mov???????? ecx,100h?;傳送大小1024(100h*4)
    004017E8? lea???????? esi,[ebp-8CCh] ;堆棧中第三個臨時對象
    004017EE? mov???????? edi,offset B2 (421538h) ;目的為首地址
    004017F3? rep movs??? dword ptr [edi],dword ptr [esi] ;傳送


    Big bigfun(Big b) {
    展開為
    ;初始化堆棧,以ebp為基準(zhǔn),ebp+4指向為return address
    ;ebp+8為剛才壓入堆棧的上層函數(shù)中的臨時對象的地址
    ;ebp-4為臨時堆棧中第一個局部變量
    00401750? push??????? ebp?
    00401751? mov???????? ebp,esp?;ebp此時指向以前保存bp
    00401753? sub???????? esp,0C0h?;建立臨時堆棧,大小0C0h
    00401759? push??????? ebx?
    0040175A? push??????? esi?
    0040175B? push??????? edi
    ;初始化堆棧全部為0xcc
    0040175C? lea???????? edi,[ebp-0C0h]
    00401762? mov???????? ecx,30h
    00401767? mov???????? eax,0CCCCCCCCh
    0040176C? rep stos??? dword ptr [edi]
    ?return b;
    ;復(fù)制b到那個臨時對象上
    0040176E? mov???????? ecx,100h
    00401773? lea???????? esi,[b]
    00401776? mov???????? edi,dword ptr [ebp+8] ;ebp+8為參數(shù)表中的參數(shù)地址
    00401779? rep movs??? dword ptr [edi],dword ptr [esi]
    ;返回那個臨時變量的地址
    0040177B? mov???????? eax,dword ptr [ebp+8]
    }

    posted on 2006-11-19 10:13 注銷..... 閱讀(252) 評論(0)  編輯  收藏 所屬分類: c++
    主站蜘蛛池模板: 亚洲乱码中文字幕综合| 久久亚洲AV午夜福利精品一区| 久久亚洲sm情趣捆绑调教| 巨胸喷奶水www永久免费| 免费看男人j放进女人j免费看| 精品国产无限资源免费观看| 免费国产真实迷j在线观看| 亚洲一本到无码av中文字幕| 又粗又长又爽又长黄免费视频 | 亚洲国产成人精品女人久久久| 亚洲AV无码日韩AV无码导航| 亚洲天然素人无码专区| 天天看片天天爽_免费播放| 亚洲日韩亚洲另类激情文学| 国产乱子伦精品免费无码专区 | 最近免费中文字幕大全| 狠狠色伊人亚洲综合网站色| 日韩免费a级在线观看| 亚洲成在人天堂一区二区| 在线a免费观看最新网站| 免费v片在线观看| 国产精品免费一区二区三区| 美女被免费视频网站a国产| 日本亚洲中午字幕乱码| 久草在视频免费福利| 亚洲人成电影网站色| 亚洲日韩在线观看| 久久国产精品免费看| 中文字幕人成人乱码亚洲电影| 亚洲欧美aⅴ在线资源| 亚洲男人的天堂在线va拉文| 亚洲AV无码专区亚洲AV桃| 青青草a免费线观a| 黄色大片免费网站| 亚洲AV日韩精品久久久久 | 国产精品国产午夜免费福利看| 一级特黄色毛片免费看| 亚洲精品在线播放视频| 俄罗斯极品美女毛片免费播放| 国产免费阿v精品视频网址| 亚洲精品123区在线观看|