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

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 //清除參數傳遞所占用的堆棧空間,維持堆棧平衡
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成人黄色| 麻豆av福利av久久av| 一区二区电影免费观看| 国产午夜精品在线| 国产精品进线69影院| 欧美黑人多人双交| 欧美一区二区在线看| 日韩视频永久免费观看| 国内精品久久久久国产盗摄免费观看完整版 | 欧美成人中文字幕| 午夜亚洲福利| 91久久精品国产91久久性色tv| 欧美日韩精品一区二区三区| 亚洲一区二区三区在线视频| 欧美日韩国产三区| 99热免费精品| 中文有码久久| 亚洲人体1000| 一本一本a久久| 国外成人免费视频| 亚洲精品一区二区三区福利| 国产啪精品视频| 一区二区日本视频| 亚洲国产电影| 亚洲免费网址| 久久国产综合精品| 日韩写真视频在线观看| 99在线|亚洲一区二区| 亚洲激情专区| 美女视频黄免费的久久| 久久免费国产| 激情视频一区二区| 亚洲欧美日韩精品一区二区| 亚洲网站视频福利| 欧美三级不卡| 亚洲精品日本| 亚洲美女在线国产| 亚洲午夜精品久久| 欧美丰满高潮xxxx喷水动漫| 欧美黄色小视频| 欧美成在线视频| 久久综合福利| 在线视频一区二区| 欧美激情a∨在线视频播放| 亚洲色图制服丝袜| 国产精品porn| 欧美三级免费| 欧美精品一区二区视频| 美女91精品| 欧美福利视频在线| 看片网站欧美日韩| 久久久亚洲精品一区二区三区| 久久久噜噜噜久久| 欧美xx视频| 久久一区精品| 久久久夜色精品亚洲| 欧美成人精品一区二区三区| 亚洲精品视频二区| 欧美激情精品久久久久久| 欧美亚洲一区二区在线观看| 日韩视频精品在线| 亚洲黄色一区二区三区| 国产精自产拍久久久久久| 久久精品女人的天堂av| 一区二区高清| 亚洲国产高清自拍| 亚洲欧美日韩综合国产aⅴ| 亚洲精品国产系列| 亚洲高清在线| 亚洲人永久免费| 一区二区日韩精品| 亚洲私人影吧| 午夜宅男欧美| 久久免费视频在线观看| 久久国产手机看片| 国产精品视频九色porn| 老牛嫩草一区二区三区日本 | 欧美一乱一性一交一视频| 亚洲婷婷在线| 欧美一区二区三区视频免费播放 | 亚洲亚洲精品三区日韩精品在线视频| 国产精品国产三级国产专区53 | 亚洲夜间福利| 国产日韩欧美在线| 亚洲香蕉在线观看| 亚洲一区二区三区视频| 欧美日韩一区二区视频在线| 亚洲男人第一av网站| 亚洲国产美女精品久久久久∴| 欧美亚洲在线视频| 久久综合久久久| 久久婷婷蜜乳一本欲蜜臀| 久久久久久久一区二区三区| 欧美成人午夜激情视频| 亚洲欧洲一区| 亚洲午夜久久久久久尤物| 亚洲欧美日韩精品久久亚洲区 | 校园春色综合网| 欧美高清视频www夜色资源网| 免费精品99久久国产综合精品| 亚洲激情电影在线| 久久精品九九| 国产一区二区三区日韩| 最新国产の精品合集bt伙计| 久久国产一区| 欧美日精品一区视频| 亚洲激情在线激情| 久久亚洲高清| 亚洲欧美综合| 国产精品欧美日韩| 一区二区三区视频在线| 免费视频一区二区三区在线观看| 亚洲视屏在线播放| 亚洲午夜一二三区视频| 欧美1区2区| 亚洲国产精品va在看黑人| 久久久99国产精品免费| 亚洲视频香蕉人妖| 国产精品高潮在线| 亚洲欧美日韩精品| 亚洲一区三区电影在线观看| 欧美日韩裸体免费视频| 亚洲视频一区| 亚洲一区在线免费| 国产精品自拍三区| 久久综合999| 欧美第一黄色网| a4yy欧美一区二区三区| 欧美国产在线电影| 欧美日韩精品一区二区天天拍小说| 亚洲精品欧美极品| aa成人免费视频| 国产一区二区三区久久| 奶水喷射视频一区| 欧美日韩妖精视频| 久久激情中文| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲精品一区二区三区福利 | 欧美一区二区三区视频在线观看 | 亚洲一区中文字幕在线观看| 亚洲男人第一网站| 亚洲国产欧美另类丝袜| 在线中文字幕不卡| 亚洲第一福利社区| 99精品免费网| 久久影院午夜论| 欧美一区二区黄| 欧美视频精品在线| 在线视频一区观看| 欧美视频免费| 美国成人毛片| 国产精品久久久久高潮| 久久久久久久久岛国免费| 欧美激情久久久久久| 久久精品观看| 国产精品久久久久久久久免费| 亚洲第一页在线| 激情一区二区| 久久福利视频导航| 亚洲欧美日韩人成在线播放| 亚洲全黄一级网站| 亚洲国产人成综合网站| 欧美中文字幕在线| 久久久久国产一区二区三区四区 | 久久久久www| 香蕉久久a毛片| 国产精品手机在线| 亚洲欧美欧美一区二区三区| 亚洲欧美日韩久久精品| 亚洲一区二区在线观看视频| 亚洲一区二区三区在线视频| 欧美日韩亚洲91| 欧美一级网站| 亚洲电影免费观看高清完整版在线观看 | 亚洲电影免费观看高清完整版在线 | 久久精品国产99精品国产亚洲性色| 国产精品美女| 欧美成人首页| 亚洲欧美综合国产精品一区| 开元免费观看欧美电视剧网站| 亚洲国产影院| 国产精品一区=区| 欧美国产综合一区二区| 亚洲欧美日韩国产中文| 亚洲日本一区二区| 久久综合亚州| 久久大香伊蕉在人线观看热2| 亚洲三级观看| 亚洲国产经典视频| 精品1区2区3区4区| 国产日本亚洲高清| 国产精品v一区二区三区| 欧美精品一区二区三区四区|