<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永久无码精品一区二区 | 亚洲六月丁香六月婷婷色伊人| 国产一级淫片a免费播放口| 亚洲色婷婷一区二区三区| 成人影片一区免费观看| 国产精品亚洲аv无码播放| xxxx日本在线播放免费不卡| 国产亚洲精品影视在线产品| 成人性做爰aaa片免费看| 亚洲AV无码国产丝袜在线观看| 男女午夜24式免费视频| 亚洲视频免费在线观看| 在线观看成人免费视频不卡| 亚洲性无码一区二区三区| 国产片免费福利片永久| 久久av免费天堂小草播放| 亚洲欧洲国产日韩精品| 全免费毛片在线播放| 亚洲精品无码久久| 一本久久综合亚洲鲁鲁五月天| 精品久久久久久无码免费| 亚洲va久久久噜噜噜久久| 免费不卡视频一卡二卡| 亚洲国产欧美一区二区三区| 又粗又大又长又爽免费视频| 黄床大片免费30分钟国产精品| 亚洲一区二区三区电影| 黄瓜视频高清在线看免费下载| 免费人成大片在线观看播放| 亚洲第一中文字幕| 全免费一级毛片在线播放| 国产一级高青免费| 激情内射亚洲一区二区三区爱妻| 免费在线一级毛片| 久久精品成人免费网站| 天堂亚洲国产中文在线| 亚洲精品制服丝袜四区| 成人性生交大片免费看无遮挡 | 亚洲制服丝袜中文字幕| 亚洲精品视频免费|