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

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 閱讀(4934) 評論(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>
            亚洲欧美一区二区三区极速播放| 欧美大香线蕉线伊人久久国产精品| 在线电影国产精品| 欧美日本在线视频| 久久麻豆一区二区| 亚洲自拍偷拍色片视频| 91久久精品国产91久久性色| 久久国产主播精品| 在线亚洲欧美| 亚洲欧洲一区二区天堂久久 | 欧美专区第一页| 亚洲乱码国产乱码精品精天堂| 国产午夜精品一区二区三区欧美| 欧美日韩日韩| 欧美福利一区| 蜜桃av久久久亚洲精品| 欧美一区二区视频97| 亚洲图片欧美一区| 亚洲免费精品| 亚洲精品美女久久7777777| 久久综合给合久久狠狠狠97色69| 欧美一区二区成人| 亚洲欧美视频在线观看| 亚洲社区在线观看| 99视频一区| 日韩午夜剧场| 亚洲国产高清在线| ●精品国产综合乱码久久久久| 国产欧美一区二区精品性| 国产精品免费视频xxxx| 欧美午夜在线视频| 国产精品99免视看9| 欧美日韩一区三区| 欧美日韩综合视频| 欧美色道久久88综合亚洲精品| 欧美日韩午夜在线| 欧美手机在线| 国产精品剧情在线亚洲| 国产精品久久国产三级国电话系列| 欧美日韩亚洲一区三区 | 亚洲综合色噜噜狠狠| 亚洲天堂av在线免费观看| 一区二区三区.www| 亚洲影音先锋| 性久久久久久久| 久久精品国产精品亚洲| 久久免费视频网站| 欧美成黄导航| 亚洲国产另类精品专区| 亚洲精品资源| 亚洲一级黄色片| 欧美一区二区三区精品| 久久免费国产精品| 欧美99久久| 欧美午夜精品理论片a级按摩| 国产精品私拍pans大尺度在线| 国产欧美一区二区白浆黑人| 影音先锋在线一区| 日韩午夜激情| 欧美一区二区三区在线视频 | 亚洲人成在线免费观看| 日韩一二三区视频| 亚洲自拍高清| 久久资源在线| 欧美视频在线视频| 黄色资源网久久资源365| 最新亚洲电影| 亚洲欧美一区二区在线观看| 久久一区激情| 日韩视频一区| 久久精品国产一区二区三区免费看| 免费亚洲电影在线| 国产精品久久久久久久一区探花| 狠狠色综合色区| 一区二区三区精品| 久久久久久日产精品| 亚洲国产一区二区三区a毛片| 亚洲一二三区在线| 久热精品在线视频| 国产精品久久中文| 亚洲欧洲日韩女同| 校园春色综合网| 亚洲福利在线视频| 亚洲欧美日韩国产中文在线| 欧美 日韩 国产 一区| 国产麻豆精品在线观看| 亚洲精品视频在线观看免费| 午夜精品在线看| 亚洲国产一区二区三区青草影视| 午夜精品美女自拍福到在线| 欧美激情女人20p| 国产综合视频| 亚洲综合成人婷婷小说| 亚洲成色www8888| 欧美一区二区成人6969| 欧美日韩亚洲91| 91久久精品国产91性色| 久久国产精彩视频| aⅴ色国产欧美| 模特精品在线| 精品成人国产| 欧美一区二区三区在| 99精品99| 欧美精品18+| 亚洲精品1区| 可以免费看不卡的av网站| 亚洲视频一区二区在线观看| 欧美激情精品久久久| 在线播放亚洲| 久久婷婷综合激情| 午夜国产欧美理论在线播放 | 一区二区三区色| 欧美国产精品中文字幕| 激情综合中文娱乐网| 久久狠狠婷婷| 午夜一级久久| 国产精品一级| 亚洲欧美一区二区视频| 亚洲美女性视频| 欧美精品久久久久a| 亚洲人成网站在线播| 美女精品自拍一二三四| 久久精品国产精品| 国产日韩欧美在线播放不卡| 亚洲图片欧美午夜| 亚洲每日更新| 欧美日韩一区二区视频在线观看| 99国产一区| 亚洲美女性视频| 欧美视频一区在线| 亚洲午夜久久久| 一区二区三区日韩欧美| 国产精品久久久久久久久久三级 | 亚洲人成网站777色婷婷| 嫩草国产精品入口| 狂野欧美一区| 亚洲日本一区二区三区| 亚洲国内精品| 欧美日韩国产系列| 亚洲在线视频观看| 亚洲一区二区三区四区中文| 国产精品一级| 久久尤物视频| 欧美 日韩 国产 一区| 99国产精品视频免费观看| 日韩一级裸体免费视频| 国产精品毛片在线看| 欧美影院视频| 久久精品国产综合| 亚洲国产精品ⅴa在线观看| 亚洲激情成人| 欧美性天天影院| 久久精品女人| 毛片精品免费在线观看| 99国内精品| 亚洲女性裸体视频| 一区二区在线视频播放| 亚洲国产日韩在线一区模特| 欧美亚男人的天堂| 久久久国产成人精品| 老司机67194精品线观看| 一区二区毛片| 午夜精品在线看| 亚洲国产91| 亚洲视频高清| 伊人男人综合视频网| 亚洲三级视频| 国产午夜精品久久久| 亚洲高清不卡一区| 国产精品日韩在线| 男女激情久久| 国产精品日本欧美一区二区三区| 久久免费国产精品| 欧美日韩福利| 久久青草久久| 欧美视频官网| 欧美www视频| 国产精品国产成人国产三级| 老鸭窝毛片一区二区三区 | 日韩午夜精品| 国产一区二区三区久久 | 国产日本欧美视频| 欧美激情按摩在线| 国产欧美日本在线| 亚洲国产成人午夜在线一区| 国产精品揄拍一区二区| 亚洲国产精品免费| 国产一区二区看久久| 日韩视频在线观看免费| 一区在线播放视频| 亚洲综合精品四区| 亚洲精品在线观看视频| 欧美在线观看你懂的| 亚洲素人一区二区| 麻豆成人91精品二区三区| 欧美一区二区在线| 欧美日韩三级一区二区| 欧美xxx在线观看| 国产一二三精品| 亚洲一区二区三区免费在线观看|