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

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

一段tricky codes:函數調用的那些底層細節


有一天,被同事問到了下面這段代碼,就簡單分析了一下,發覺還有點意思:

__declspec(naked)
void call(void* pfn, 
{
    __asm 
    
{
        pop eax;
        add eax, 
3;
        xchg dword ptr[esp], eax;
        push eax;
        ret;
    }

}

 

再看它的用法:

 

void print_str( const char *s )
{
    printf( 
"%s\n", s );
}

call( print_str, 
"a string" );

 

call函數的大致作用,就是調用傳遞進去的函數print_str,并將參數"a string"傳遞給目標
函數。

但是它是怎么做到的呢?雖然call只有簡單的幾句匯編代碼,但是卻包含了很多函數在編譯
器中的匯編層實現。要了解這段代碼的意思,需要知道如下相關知識:

0、函數調用的實現中,編譯器通過系統堆棧(ESP寄存器指向)傳遞參數;
1、C語言默認的函數調用規則(_cdecl)中,調用者從右往左將參數壓入堆棧,并且調用者負
責堆棧平衡,也就是保證調用函數的前后,ESP不變;
2、匯編指令call本質上是先將返回地址,通常是該條指令的下一條指令壓入堆棧,然后直
接跳轉到目標位置;
3、匯編指令ret則是先從堆棧棧頂取出返回地址,然后跳轉過去;
4、匯編指令add加上其操作數,貌似占3個字節長度;
5、在visual studio中,DEBUG模式下編譯器會在我們的代碼中插入各種檢測代碼,而
__declspec(naked)則是告訴編譯器:別往這里添加代碼。

了解了以上常識后,再看這段代碼,其本質無非就是利用了這些規則,在代碼段跳來跳去。
我們來逐步分析一下:

在調用call函數的地方,大概的代碼為:

 

caller:
// 堆棧狀態,從左往右分別表示棧頂至下
// ret_addr是call后的地址,即add esp, 8的位置
// a1, a2表示函數參數,callee_addr是這里的print_str
// stack: ret_addr, callee_addr, a1, a2, 
call( print_str, "a string" ); 
add esp, 
8 //清除參數傳遞所占用的堆??臻g,維持堆棧平衡
end_label //位于add后的指令,后面會提到

call:
// 此時堆棧stack: ret_addr, a1, a2
pop eax // eax = ret_addr; stack: callee_addr, a1, a2, 
add eax, 3 // eax = end_label; stack: callee_addr, a1, a2, 
xchg dword ptr[esp], eax // eax = callee_addr; stack: end_label, a1, a2, 
push eax // stack: callee_addr, end_label, a1, a2, 
ret // 取出callee_addr并跳轉,也就跳轉到print_str函數的入口,此時堆棧
    
// stack: end_label, a1, a2, 

callee(print_str):

 無視函數內容

ret 
// print_str返回,此時正常情況下,堆棧stack: end_label, a1, a2, 
 
// 取出end_label并跳轉,stack: a1, a2, 

 

那么當callee結束時,則跳轉回caller函數中。不過,如過你所見,此時堆棧中還保留著再
調用call函數時傳入的參數:stack: a1, a2, ...,所以,DEBUG模式下,VS就會提示你堆
棧不平衡。這里簡單的處理就是手動來進行堆棧平衡:

 

    call( print_str, "a string" );
    __asm
    
{
        add esp, 
4
    }

 

傳入了多少個參數,就得相應地改變esp的值。

話說距離上篇博客都有半年了,自己都不知道時間晃得如此之快。最近業余折騰了下android開發,
一不小心就跨年了。
 

posted on 2011-01-02 16:34 Kevin Lynx 閱讀(4932) 評論(4)  編輯 收藏 引用 所屬分類: c/c++

評論

# re: 一段tricky codes:函數調用的那些底層細節 2011-01-03 05:58 淘寶網

哈哈 不錯  回復  更多評論   

# re: 一段tricky codes:函數調用的那些底層細節 2011-01-06 12:30 miosys

整個懸念就是放在 add eax, 3;
這條指令就是為了在跳轉到最外層主調函數上時,留出一個指令空間來平棧。
如果用 ADD + WORD,應該是 3。當然不會BT到加 DWORD。  回復  更多評論   

# re: 一段tricky codes:函數調用的那些底層細節 2011-01-08 21:47 G++

圍觀,表示看不懂,哈哈哈哈哈~~~!  回復  更多評論   

# re: 一段tricky codes:函數調用的那些底層細節[未登錄] 2011-03-15 14:36 dophi

已閱  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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成人国产| 欧美婷婷在线| 久久精品噜噜噜成人av农村| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产精品黑人久久久| 99精品国产在热久久婷婷| 国产一区二区观看| 91久久精品国产| 国产乱码精品| 亚洲国产欧美不卡在线观看| 国产精品久久久久久久久久久久久| 久久经典综合| 欧美日韩国产美女| 久久亚洲春色中文字幕| 欧美日本中文| 免费成人性网站| 亚洲欧洲一区二区三区| 亚洲欧美一区二区在线观看| 欧美人与禽猛交乱配| 欧美国产亚洲另类动漫| 国产亚洲欧美色| 香蕉成人久久| 久久人人精品| 在线观看欧美精品| 久久综合亚州| 久久免费高清视频| 午夜精品视频网站| 夜色激情一区二区| 久久婷婷成人综合色| 亚洲一区二区在线看| 免费观看成人鲁鲁鲁鲁鲁视频| 午夜欧美大尺度福利影院在线看 | 欧美天堂在线观看| 欧美成人在线网站| 国产亚洲va综合人人澡精品| 一区二区成人精品| 亚洲美女av黄| 麻豆成人精品| 美国十次了思思久久精品导航| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲国产另类久久精品| 永久免费毛片在线播放不卡| 午夜在线视频观看日韩17c| 亚洲一区二区三区欧美| 欧美日韩另类国产亚洲欧美一级| 麻豆久久精品| 亚洲一区成人| 亚洲午夜小视频| 欧美日本高清| 亚洲人在线视频| 亚洲精品欧美日韩专区| 麻豆国产精品777777在线| 蘑菇福利视频一区播放| 一区在线观看| 米奇777超碰欧美日韩亚洲| 久久综合色天天久久综合图片| 国产农村妇女精品一二区| 午夜精品短视频| 久久精品国产成人| 国产日韩综合| 久久国产黑丝| 欧美chengren| 最新中文字幕一区二区三区| 欧美成年视频| 亚洲开发第一视频在线播放| 中文精品视频一区二区在线观看| 欧美日韩国产成人| 亚洲性线免费观看视频成熟| 欧美在线视频网站| 一区视频在线播放| 欧美激情免费在线| 99国产精品久久久久久久成人热 | 亚洲直播在线一区| 欧美在线首页| 亚洲成色www8888| 中日韩午夜理伦电影免费| 亚洲欧洲精品一区二区精品久久久| 欧美性jizz18性欧美| 91久久黄色| 亚洲国产一区二区三区a毛片| 亚洲国产精品久久久久| 亚洲人成绝费网站色www| 欧美成人中文| 宅男精品视频| 一区二区三区精品在线 | 国产精品视频xxxx| 亚洲深夜福利在线| 午夜在线精品| 一区二区在线免费观看| 欧美 日韩 国产在线 | 久久久久久久久蜜桃| 亚洲激情在线观看| 在线综合+亚洲+欧美中文字幕| 欧美日韩八区| 亚洲欧美日韩在线不卡| 狼人天天伊人久久| 亚洲欧美日韩精品久久| 国产一区二区三区在线观看免费| 欧美综合国产精品久久丁香| 羞羞答答国产精品www一本| 伊人夜夜躁av伊人久久| 欧美精品偷拍| 亚洲欧美日韩久久精品| 久久亚洲一区二区| 99re成人精品视频| 一区二区亚洲精品国产| 国产欧美日韩精品专区| 欧美精品一区二区三区高清aⅴ| 亚洲欧美在线视频观看| 亚洲国语精品自产拍在线观看| 久久久久九九视频| 亚洲小说欧美另类社区| 狠狠色噜噜狠狠色综合久| 国产精品日韩在线观看| 免费高清在线一区| 香蕉免费一区二区三区在线观看 | 欧美淫片网站| 一区二区三区成人精品| 免费亚洲一区二区| 亚洲欧美在线x视频| 狠狠干狠狠久久| 欧美午夜剧场| 免费亚洲一区| 欧美一区二区三区四区在线观看地址 | 亚洲激情精品| 亚洲美女电影在线| 久久综合九色欧美综合狠狠| 日韩亚洲成人av在线| 免费日韩成人| 久久精品中文字幕一区| 亚洲少妇诱惑| 国产亚洲欧美一区在线观看| 国产精品日韩精品欧美在线| 欧美国产日产韩国视频| 久久色在线播放| 久久都是精品| 亚洲精品乱码| 可以看av的网站久久看| 久久国产精品72免费观看| 亚洲尤物影院| 日韩亚洲欧美一区二区三区| 永久555www成人免费| 国产亚洲综合在线| 欧美电影在线免费观看网站| 久久精品夜夜夜夜久久| 欧美一级夜夜爽| 亚洲一区三区电影在线观看| 麻豆成人av| 欧美黄色小视频| 欧美成人高清视频| 久久夜精品va视频免费观看| 久久久久久久久岛国免费| 日韩一级不卡| 午夜视频在线观看一区二区三区| 欧美视频在线观看免费| 欧美日韩国产精品专区| 欧美日韩国产综合网| 欧美日韩在线播放一区二区| 欧美激情一区二区三区在线| 牛牛影视久久网| 欧美成人精品一区| 欧美国产成人精品| 欧美精品日韩一本| 亚洲欧美日韩中文视频| 夜夜嗨av一区二区三区网站四季av| 亚洲精品一区中文| 亚洲少妇最新在线视频| 亚洲一区在线免费观看| 久久天堂精品| 亚洲午夜伦理| 午夜免费在线观看精品视频| 欧美在线精品免播放器视频| 久久精彩免费视频| 久久婷婷国产麻豆91天堂| 亚洲自拍偷拍福利| 一区二区三区国产| 亚洲砖区区免费| 久久精品国内一区二区三区| 久久青草欧美一区二区三区| 久久国内精品视频| 久久综合久久综合九色| 亚洲大片av| 亚洲免费电影在线观看| 亚洲一区二区在线| 久久精品亚洲一区| 欧美韩国日本综合| 亚洲精品影视| 一区二区三区欧美成人| 欧美一区二区三区免费观看| 久久久久久久久一区二区| 欧美一区二区三区视频免费| 麻豆久久精品| 欧美少妇一区二区| 在线观看欧美日韩国产| 正在播放日韩| 久久精品免费| 亚洲欧美日韩综合aⅴ视频| 亚洲综合第一|