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

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

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

    注銷

    注銷

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

    在傳統C中,函數的參數和返回值都是以復制傳送的.
    看這段代碼
    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要以傳值方式傳送到函數的參數表中中
    2.如果返回值size很小,可以返回eax中
    ? 但是在這里,返回值size很大,要建立臨時變量
    ? 然后將臨時變量的地址入棧,此時非常象函數參數入棧
    ? 返回eax指向這個臨時變量
    3.將這個臨時變量拷貝到B2上

    B2 = bigfun(B);
    展開為
    ;構造臨時堆棧
    004017AE? sub???????? esp,400h?;堆棧大小1024(400h)
    ;由于函數調用是傳值方式,所以將B復制到bigfun中的參數中
    ;相當于將B push到堆棧中
    004017B4? mov???????? ecx,100h?;傳送大小1024(100h*4)
    004017B9? mov???????? esi,offset B (421138h) ;源是B首地址
    004017BE? mov???????? edi,esp?;目的為bigfun中的參數地址
    004017C0? rep movs??? dword ptr [edi],dword ptr [esi] ;復制
    ;調用函數,此時push eax中的eax并非是函數參數壓棧,而是將一個臨時對象的指針壓棧
    004017C2? lea???????? eax,[ebp-4C4h]
    004017C8? push??????? eax?;將堆棧中一個臨時對象地址壓堆棧
    004017C9? call??????? bigfun (401750h) ;調用函數
    004017CE? add???????? esp,404h?;清除堆棧(400h+4),堆棧跳過函數參數表和函數返回地址
    ;臨時對象為返回變量,eax指向這個地址
    ;將這個臨時對象復制另一個臨時對象上
    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] ;復制
    ;將第二個臨時對象復制到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為基準,ebp+4指向為return address
    ;ebp+8為剛才壓入堆棧的上層函數中的臨時對象的地址
    ;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;
    ;復制b到那個臨時對象上
    0040176E? mov???????? ecx,100h
    00401773? lea???????? esi,[b]
    00401776? mov???????? edi,dword ptr [ebp+8] ;ebp+8為參數表中的參數地址
    00401779? rep movs??? dword ptr [edi],dword ptr [esi]
    ;返回那個臨時變量的地址
    0040177B? mov???????? eax,dword ptr [ebp+8]
    }

    posted on 2006-11-19 10:13 注銷..... 閱讀(251) 評論(0)  編輯  收藏 所屬分類: c++
    主站蜘蛛池模板: 久久精品a亚洲国产v高清不卡| 亚洲一级片免费看| 亚洲熟妇色自偷自拍另类| 久久九九免费高清视频| 亚洲日韩涩涩成人午夜私人影院| 美女被羞羞网站免费下载| 免费va人成视频网站全| 国产精品亚洲二区在线| 亚洲成av人片不卡无码久久| jyzzjyzz国产免费观看| 国产亚洲综合网曝门系列| 在线观看特色大片免费网站| 亚洲午夜精品一区二区| 野花高清在线观看免费3中文 | 久久久久久av无码免费看大片| 亚洲一区二区三区无码影院| 中文精品人人永久免费| 麻豆亚洲AV永久无码精品久久| 国产成人精品免费视频网页大全| 亚洲av无码一区二区三区观看| 免费看无码自慰一区二区| 夜夜爽妓女8888视频免费观看| 亚洲最大激情中文字幕| **一级一级毛片免费观看| 一区二区亚洲精品精华液| 免费二级毛片免费完整视频| 香蕉免费看一区二区三区| 久久精品国产精品亚洲色婷婷 | 成人无码WWW免费视频| 亚洲人成电影在线天堂| 岛国片在线免费观看| 国产高清视频免费在线观看 | 67194国产精品免费观看| 亚洲日韩精品无码专区加勒比☆| 免费播放美女一级毛片 | 亚洲五月丁香综合视频| 免费jlzzjlzz在线播放视频| 久久99精品视免费看| 亚洲精品无码av中文字幕| 亚洲愉拍99热成人精品热久久| 一级女人18毛片免费|