青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

這幾天學習匯編,分析了一下 c++ 中函數調用(cdecl 和 fastcall 方式)過程的匯編碼,記錄如下:

 

程序例子

struct tagTest 
{
 int n1;
 long n2;
 DWORD n3;
};

 

long funtest1(tagTest p1,int p2,LPCTSTR lpszP3) 

{  // 普通函數
 p1.n1 = 3;
 LPCTSTR lpszxx = lpszP3;
 p1.n3 = p2;

 return 300;

}

 

long __stdcall funtest2(tagTest p1,int p2,LPCTSTR lpszP3)

{ // stdcall 函數
 p1.n1 = 3;
 LPCTSTR lpszxx = lpszP3;
 p1.n3 = p2;

 return 300;

}

1、普通調用(cdecl)。

    調用方 C++ 代碼:

 long ixx = 0;
 tagTest tag1={34,6,87};
 ixx = funtest1(tag1,i2,"asdffffffdddddd");

    生成的匯編碼:

 long ixx = 0;
0104171E  mov         dword ptr [ixx],0

 tagTest tag1={34,6,87};
01041738  mov         dword ptr [tag1],22h     ; 成員賦值
0104173F  mov         dword ptr [ebp-10h],6    ; 成員賦值
01041746  mov         dword ptr [ebp-0Ch],57h  ; 成員賦值
 ixx = funtest1(tag1,i2,"asdffffffdddddd");
0104174D  push        offset CAnonymousAsmTestApp::`vftable'+0F4h (11E60B0h) ; 入棧參數

                          ; "asdffffffdddddd" 的地址。這里顯示似乎有問題(實際地址是對的)
01041752  mov         edx,dword ptr [i2] 
01041755  push        edx                 ; 入棧參數 i2
01041756  sub         esp,0Ch             ; 在棧中分配參數 tag1 的空間
01041759  mov         eax,esp
0104175B  mov         ecx,dword ptr [tag1]
0104175E  mov         dword ptr [eax],ecx  ; 入棧 tag1.n1
01041760  mov         edx,dword ptr [ebp-10h]
01041763  mov         dword ptr [eax+4],edx  ; 入棧 tag1.n2
01041766  mov         ecx,dword ptr [ebp-0Ch]
01041769  mov         dword ptr [eax+8],ecx  ; 入棧 tag1.n3
0104176C  call        funtest1 (1041680h)   ; 調用函數。

                       ;注意:這里同時將返回地址(下條指令的地址) 也入棧(這里是4字節);

                       ;   所以,函數中取得參數時,需要從當前 ESP 中加上 4 字節!
01041771  add         esp,14h              ; 由調用者清參數棧
01041774  mov         dword ptr [ixx],eax  ; 獲取返回值

 

注意:已經關閉了編譯器的某些優化選項,使匯編碼更易讀!

    調用方代碼總結:

  • 參數從右向左依次入棧。
  • 棧指針(ESP)從底部向頂部依次減小。也就是說,棧頂地址小;棧底地址大。
  • 如果參數是結構(struct),則直接移動棧頂指針,預留出結構的大小;然后用 mov 指令逐步將成員拷貝到預留出來的棧空間!
  • call 指令調用目標地址
  • 調用方清棧
  • 獲得返回值

    函數中生成的匯編碼

long funtest1(tagTest p1,int p2,LPCTSTR lpszP3)
{

 

00351680  push        ebp    ; 基址指針入棧
00351681  mov         ebp,esp  ; 將函數入口點的棧指針作為當前基址指針。

                               ;顧名思義,基址指針就是進入函數時的棧頂指針!
00351683  push        ecx     ; 在棧中分配局部變量空間。

                              ;ecx 中的值無關緊要,只是預留一個 4 字節空間而已
 p1.n1 = 3;
00351684  mov         dword ptr [p1],3  ; 賦值
 LPCTSTR lpszxx = lpszP3;
0035168B  mov         eax,dword ptr [lpszP3] ; [lpszP3] 地址應該就是 ebp - 4
0035168E  mov         dword ptr [lpszxx],eax ; 賦值(通過 eax)
 p1.n3 = p2;
00351691  mov         ecx,dword ptr [p2]
00351694  mov         dword ptr [ebp+10h],ecx ; 賦值(通過 ecx)
 return 300;
00351697  mov         eax,12Ch    ; 返回值放在 eax
}
0035169C  mov         esp,ebp  ; 恢復棧:清除局部變量
0035169E  pop         ebp      ; 恢復基址指針
0035169F  ret                  ; 返回(從棧中彈出返回地址,然后 jmp

 

 

2、_stdcall調用。

    調用方 C++ 代碼:

 int i2=3;
 long ixx = 0;

 tagTest tag1={34,6,87};

 ixx = funtest2(tag1,i2,"asdffffffdddddd");

    生成的匯編碼:

 int i2=3;
010A1759  mov         dword ptr [i2],3
 long ixx = 0;
010A1760  mov         dword ptr [ixx],0

 tagTest tag1={34,6,87};
010A1767  mov         dword ptr [tag1],22h
010A176E  mov         dword ptr [ebp-0Ch],6
010A1775  mov         dword ptr [ebp-8],57h

 ixx = funtest2(tag1,i2,"asdffffffdddddd");
010A177C  push        offset CAnonymousAsmTestApp::`vftable'+104h (12460C0h) ; 入棧參數

                          ; "asdffffffdddddd" 的地址。這里顯示似乎有問題(實際地址是對的)

                          ; 和 cdecl 一樣,參數從右邊開始入棧


010A1781  mov         eax,dword ptr [i2]
010A1784  push        eax 
010A1785  sub         esp,0Ch
010A1788  mov         ecx,esp
010A178A  mov         edx,dword ptr [tag1]
010A178D  mov         dword ptr [ecx],edx
010A178F  mov         eax,dword ptr [ebp-0Ch]
010A1792  mov         dword ptr [ecx+4],eax
010A1795  mov         edx,dword ptr [ebp-8]
010A1798  mov         dword ptr [ecx+8],edx
010A179B  call        funtest2 (10A16B0h)
010A17A0  mov         dword ptr [ixx],eax  ; 取得返回值。

                                           ; 注意:這里沒有清棧的代碼,由函數自己清棧

 

注意:已經關閉了編譯器的某些優化選項,使匯編碼更易讀!

    調用方代碼總結:

  • 參數從右向左依次入棧。
  • 棧指針(ESP)從底部向頂部依次減小。也就是說,棧頂地址小;棧底地址大。
  • 如果參數是結構(struct),則直接移動棧頂指針,預留出結構的大小;然后用 mov 指令逐步將成員拷貝到預留出來的棧空間!
  • call 指令調用目標地址
  • 返回時,由函數自己清棧(通過 ret 指令)
  • 獲得返回值

    函數中生成的匯編碼

long __stdcall funtest2(tagTest p1,int p2,LPCTSTR lpszP3)
{
010A16B0  push        ebp 
010A16B1  mov         ebp,esp
010A16B3  push        ecx  
 p1.n1 = 3;
010A16BD  mov         dword ptr [p1],3
 LPCTSTR lpszxx = lpszP3;
010A16C4  mov         eax,dword ptr [lpszP3]
010A16C7  mov         dword ptr [lpszxx],eax
 p1.n3 = p2;
010A16CA  mov         ecx,dword ptr [p2]
010A16CD  mov         dword ptr [ebp+10h],ecx

 return 300;
010A16D0  mov         eax,12Ch
}
010A16D5  mov         esp,ebp
010A16D7  pop         ebp 
010A16D8  ret         14h    ; 返回并清棧。

                            ;(從棧中彈出返回地址,返回;然后ESP增加14H,14H為參數棧的字節數)

posted on 2009-08-14 15:06 會飛的兔子 閱讀(387) 評論(0)  編輯 收藏 引用 所屬分類: 系統API,底層技術
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产亚洲一区二区精品| 欧美 日韩 国产在线| 亚洲一本大道在线| 久久久久国产精品一区三寸| 亚洲一区视频| 中文av一区特黄| 日韩亚洲欧美精品| 午夜久久电影网| 欧美视频官网| 999亚洲国产精| 你懂的视频一区二区| 午夜精品福利在线| 国产精品二区二区三区| 国产精品理论片| 亚洲精品国产系列| 免费亚洲一区二区| 久久激情视频免费观看| 欧美精品一区在线播放| 亚洲精品中文字幕有码专区| 欧美伊人久久| 久久久综合香蕉尹人综合网| 亚洲永久精品大片| 欧美日韩大片| 一本久久综合亚洲鲁鲁五月天| 亚洲国产欧美日韩| 国产精品私拍pans大尺度在线 | 欧美伊人久久久久久午夜久久久久| 亚洲一二三区视频在线观看| 久久嫩草精品久久久久| 久久国产欧美日韩精品| 午夜精品一区二区三区在线| 欧美成人午夜免费视在线看片| 正在播放亚洲| 玖玖玖国产精品| 亚洲特黄一级片| 久久久久一区二区三区四区| 亚洲一区久久久| 麻豆精品一区二区综合av| 亚洲一区二区精品视频| 久久久久免费视频| 亚洲欧美成aⅴ人在线观看| 亚洲国产精品va在看黑人| 欧美国产视频一区二区| 99ri日韩精品视频| 亚洲一区二区综合| 国产精品视频1区| 久久婷婷成人综合色| 久久精品男女| 国内精品久久久久影院色| 欧美专区在线播放| 久久精品中文字幕免费mv| 国产精品豆花视频| 国内视频一区| 久久久久九九九九| 久久国产一区| 国产一区二区三区在线免费观看 | 欧美日韩一区二区视频在线 | 久久一区二区三区四区五区| 一本色道久久综合亚洲精品小说 | 一本一本a久久| 一本色道久久综合亚洲精品不卡 | 亚洲国产va精品久久久不卡综合| 亚洲人成在线观看一区二区| 亚洲人成人一区二区在线观看| 亚洲一区二区三区激情| 欧美福利视频| 久久久人成影片一区二区三区观看 | 一本色道久久88综合亚洲精品ⅰ| 久久精品亚洲一区二区三区浴池 | 国产一区深夜福利| 欧美日韩免费看| 午夜亚洲性色福利视频| 欧美一区二区三区久久精品茉莉花 | 在线观看日韩| 国产精品高潮在线| 欧美一区二区私人影院日本| 欧美成人国产| 亚洲精品裸体| 欧美精品一区二| 美女久久一区| 亚洲欧美日韩在线观看a三区| 国产嫩草一区二区三区在线观看| 你懂的网址国产 欧美| 亚洲高清久久网| 在线电影国产精品| 国产亚洲成人一区| 欧美日韩免费在线| 欧美在线黄色| 亚洲欧洲一二三| 亚洲免费一在线| 久久亚洲综合| 亚洲第一在线视频| 亚洲国产日韩一区二区| 国产在线视频欧美| 亚洲免费网址| 一区二区av| 欧美凹凸一区二区三区视频| 欧美与黑人午夜性猛交久久久| 久久―日本道色综合久久| 亚洲欧美中文在线视频| 99riav1国产精品视频| 亚洲人成在线观看| 国产网站欧美日韩免费精品在线观看| 欧美日韩播放| 看欧美日韩国产| 洋洋av久久久久久久一区| 91久久久久久| 亚洲精品一区在线观看香蕉| 久久影院午夜论| 亚洲自拍电影| 欧美多人爱爱视频网站| 欧美精品系列| 欧美日在线观看| 欧美日韩国产免费观看| 欧美理论电影在线播放| 在线观看福利一区| 亚洲欧美高清| 美女精品在线| 亚洲精品专区| 亚洲综合999| 亚洲女人小视频在线观看| 欧美日韩网址| 亚洲国产精品欧美一二99| 午夜日韩福利| 欧美极品在线视频| 国产精品久久久久国产a级| 亚洲欧美高清| 亚洲在线中文字幕| 欧美久久电影| 亚洲精品黄网在线观看| 亚洲永久免费视频| 亚洲高清在线观看| 久久久久久久综合日本| 国产精品午夜电影| 99亚洲伊人久久精品影院红桃| 欧美另类人妖| 国产亚洲精品aa| 日韩网站在线| 日韩一区二区电影网| 久久久精品国产99久久精品芒果| 亚洲影院色无极综合| 牛人盗摄一区二区三区视频| 国产精品国产三级国产普通话三级| 亚洲一区二区免费视频| 亚洲高清久久| 欧美99在线视频观看| 欧美精品一区二区久久婷婷| 亚洲国产天堂久久综合网| 亚洲一区二区免费| 最新国产成人在线观看| 久久国产乱子精品免费女| 日韩视频不卡中文| 欧美激情aⅴ一区二区三区| 久久婷婷久久| 亚洲精品美女在线观看| 亚洲一二三级电影| 亚洲人成网站色ww在线| 欧美日韩在线高清| 欧美一区二区免费视频| 日韩午夜激情av| 免费欧美视频| 性刺激综合网| 亚洲图片你懂的| 亚洲高清自拍| 欧美精品久久一区| 亚洲国内在线| 久久久久免费观看| 亚洲天堂av电影| 亚洲高清色综合| 国产自产v一区二区三区c| 亚洲综合好骚| 亚洲免费av片| 欧美激情亚洲视频| 一区二区欧美精品| 国产深夜精品福利| 欧美日韩亚洲高清一区二区| 另类图片综合电影| 欧美一区二区三区婷婷月色 | 久久久精品视频成人| 一区二区三区精密机械公司 | 久久精精品视频| 极品av少妇一区二区| 国产精品亚洲精品| 欧美久久一区| 欧美激情第4页| 日韩天堂av| 久久精品综合网| 午夜伦理片一区| 亚洲国产合集| 亚洲一级在线观看| 欧美jizz19性欧美| 欧美不卡激情三级在线观看| 正在播放欧美视频| 久久这里有精品视频| 亚洲专区在线| 久久这里有精品视频| 国产一区二区精品久久| 亚洲欧美日韩一区二区| 日韩午夜免费| 亚洲在线成人|