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

兔子的技術(shù)博客

兔子

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

       現(xiàn)代的編程語言的函數(shù)竟然有那麼多的調(diào)用方式。這些東西要完全理解還得通過匯編代碼才好理解。他們各自有自己的特點
其實這些調(diào)用方式的差別在主要在一下幾個方面

1.參數(shù)處理方式(傳遞順序,存取(利用盞還是寄存器))
2.函數(shù)的結(jié)尾處理方式(善后處理)



以下是理論:
__cdecl    由調(diào)用者平棧,參數(shù)從右到左依次入棧 是C和C++程序的缺省調(diào)用方式。每一個調(diào)用它的函數(shù)都包含清空堆棧的代碼
所以產(chǎn)生的可執(zhí)行文件大小會比調(diào)用_stdcall函數(shù)的大。函數(shù)采用從右到左的壓棧方式。VC將函數(shù)編譯后會在函數(shù)名前面加上
下劃線前綴。是MFC缺省調(diào)用約定
__stdcall ,WINAPI,CALLBACK ,PASCAL 由被調(diào)用者平棧,參數(shù)從右到左依次入棧 ._stdcall是Pascal程序的缺省調(diào)用方式,
通常用于Win32   Api中,函數(shù)采用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數(shù)編譯后會在函數(shù)名前面加上下劃
線前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)

__fastcall 由被調(diào)用者平棧,參數(shù)先賦值給寄存器,然后入棧 “人”如其名,它的主要特點就是快,因為它是通過寄存器來傳送參數(shù)的
(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數(shù),剩下的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前
清理傳送參數(shù)的內(nèi)存棧),在函數(shù)名修飾約定方面,它和前兩者均不同.
_fastcall方式的函數(shù)采用寄存器傳遞參數(shù),VC將函數(shù)編譯后會在函數(shù)名前面加上"@"前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)。 

__thiscall 由被調(diào)用者平棧,參數(shù)入棧,this 指針賦給 ecx 寄存器 僅僅應(yīng)用于“C++”成員函數(shù)。this指針存放于CX寄存器,參數(shù)從右
到左壓。thiscall不是關(guān)鍵詞,因此不能被程序員指定。  


__declspec(naked) 這是一個很少見的調(diào)用約定,一般程序設(shè)計者建議不要使用。編譯器不會給這種函數(shù)增加初始化和清理代碼
更特殊的是,你不能用return返回返回值,只能用插入?yún)R編返回結(jié)果。這一般用于實模式驅(qū)動程序設(shè)計.
以下是實踐:

  
int __stdcall test_stdcall(char para1, char para2)
{
    para1 
= para2;
    
return 0;
}
int __cdecl test_cdecl(char para, )
{
    
char    p = '\n';
    va_list marker;
    va_start( marker, para );
    
while( p != '\0' )
    {
        p 
= va_arg( marker, char);
        printf(
"%c\n", p);
    }
    va_end( marker );
    
return 0;
}

int pascal test_pascal(char para1, char para2)
{
    
return 0;
}

int __fastcall test_fastcall(char para1, char para2, char para3, char para4)
{
    para1 
= (char)1;
    para2 
= (char)2;
    para3 
= (char)3;
    para4 
= (char)4;
    
return 0;
}
__declspec(naked) 
void __stdcall test_naked(char para1, char para2)
{
    __asm
    {
        push    ebp
        mov     ebp, esp
        push    eax
        mov     al,
byte ptr [ebp + 0Ch]
        xchg    
byte ptr [ebp + 8],al      
        pop     eax
        pop     ebp
        ret     
8
    }
//    return ;
}


int main(int argc, char* argv[])
{
    test_stdcall( 
'a''b' );
    test_cdecl( 
'c','d','e','f','g' ,'h' ,'\0');
    test_pascal( 
'e''f' );
    test_fastcall( 
'g''h''i''j' );
    test_naked( 
'k''l');
    
return 0;
}
匯編代碼如下
int main(int argc, char* argv[])
{
00411350  push        ebp  
00411351  mov         ebp,esp 
00411353  sub         esp,0C0h 
00411359  push        ebx  
0041135A  push        esi  
0041135B  push        edi  
0041135C  lea         edi,[ebp
-0C0h] 
00411362  mov         ecx,30h 
00411367  mov         eax,0CCCCCCCCh 
0041136C  rep stos    dword ptr es:[edi] 
    test_stdcall( 
'a''b' );
0041136E  push        62h  
00411370  push        61h  
00411372  call        
_test_stdcall@8

    test_cdecl( 
'c','d','e','f','g' ,'h' ,'\0');
00411377  push        0    
00411379  push        68h  
0041137B  push        67h  
0041137D  push        66h  
0041137F  push        65h  
00411381  push        64h  
00411383  push        63h  
00411385  call        _test_cdecl

0041138A  add         esp,1Ch 
;恢復(fù)_test_cdecl參數(shù)壓入前的堆棧指令是: add esp,n*4 n=參數(shù)的數(shù)量
    test_fastcall( 'g''h''i''j' );
0041138D  push        6Ah  
0041138F  push        69h  
00411391  mov         dl,68h 
00411393  mov         cl,67h 
00411395  call        test_fastcall

    test_naked( 
'k''l');
0041139A  push        6Ch  
0041139C  push        6Bh  
0041139E  call        
_test_naked
    
return 0;
004113A3  xor         eax,eax 
}

int __stdcall test_stdcall(char para1, char para2)
{
004111F0  push        ebp  
004111F1  mov         ebp,esp 
004111F3  sub         esp,0C0h 
004111F9  push        ebx  
004111FA  push        esi  
004111FB  push        edi  
004111FC  lea         edi,[ebp-0C0h] 
00411202  mov         ecx,30h 
00411207  mov         eax,0CCCCCCCCh 
0041120C  rep stos    dword ptr es:[edi] ;初始edi
    para1 = para2;
0041120E  mov         al,byte ptr [para2] ;mov al,byte ptr[ebp+c]
00411211  mov         byte ptr [para1],al ;mov byte ptr[ebp+8],al

    return 0;
00411214  xor         eax,eax
00411216  pop         edi  
00411217  pop         esi  
00411218  pop         ebx  
00411219  mov         esp,ebp 
0041121B  pop         ebp  
0041121C ret      8 ;恢復(fù)到壓入函數(shù)參數(shù)前堆棧,由于有兩個參數(shù)所以ret 8 相當(dāng)于 pop eip 然后esp+8
}
int __cdecl test_cdecl(char para,... )
{
00411230  push        ebp  
00411231  mov         ebp,esp 
00411233  sub         esp,0D8h 
0041123C  lea         edi,[ebp-0D8h] 
00411242  mov         ecx,36h 
00411247  mov         eax,0CCCCCCCCh 
0041124C  rep stos    dword ptr es:[edi] 
    char    p = '\n';
0041124E  mov         byte ptr [p],0Ah 
    va_list marker;
    va_start( marker, para );
00411252  lea         eax,[ebp+0Ch] 
00411255  mov         dword ptr [marker],eax 
    while( p != '\0' )
00411258  movsx       eax,byte ptr [p] 
0041125C  test        eax,eax 
0041125E  je          test_cdecl+60h (411290h) 
    {
        p = va_arg( marker, char);
00411260  mov         eax,dword ptr [marker] 
00411263  add         eax,4 
00411266  mov         dword ptr [marker],eax 
00411269  mov         ecx,dword ptr [marker] 
0041126C  mov         dl,byte ptr [ecx-4] 
0041126F  mov         byte ptr [p],dl 
        printf("%c\n", p);
00411272  movsx       eax,byte ptr [p] 
00411276  mov         esi,esp 
00411278  push        eax  
00411279  push        offset string "%c\n" (41401Ch) 
0041127E  call        dword ptr [__imp__printf (416180h)] 
00411284  add         esp,8 
0041128E  jmp         test_cdecl+28h (411258h) 
    }
    va_end( marker );
00411290  mov         dword ptr [marker],0 
    return 0;
00411297  xor         eax,eax 

004112A9  mov         esp,ebp 
004112AB  pop         ebp  
004112AC  ret    

}
     
int __fastcall test_fastcall(char para1, char para2, char para3, char para4)
{
004112D0  push        ebp  
004112D1  mov         ebp,esp 
004112D3  sub         esp,0D8h  
004112DD  lea         edi,[ebp-0D8h] 
004112E3  mov         ecx,36h 
004112E8  mov         eax,0CCCCCCCCh 
004112ED  rep stos    dword ptr es:[edi] 
004112EF  pop         ecx  
004112F0  mov         byte ptr [ebp-14h],dl 
004112F3  mov         byte ptr [ebp-8],cl 
    para1 = (char)1;
004112F6  mov         byte ptr [para1],1 
    para2 = (char)2;
004112FA  mov         byte ptr [para2],2 
    para3 = (char)3;
004112FE  mov         byte ptr [para3],3 
    para4 = (char)4;
00411302  mov         byte ptr [para4],4 
    return 0;
00411306  xor         eax,eax  

0041130B  mov         esp,ebp 
0041130D  pop         ebp  
0041130E  ret         8  
;由于使用了ecx ,edx 傳遞參數(shù) 本來4個參數(shù)只使用兩push 所以這里是 ret 4*2
}
     

__declspec(naked) void __stdcall test_naked(char para1, char para2)
{
00411330  push        ebp      ;這里編譯器沒加入任何初始化和清棧的指令,你代碼如何寫它就復(fù)制過來
00411331  mov         ebp,esp 
00411333  push        eax  
00411334  mov         al,byte ptr [para2]    
00411337  xchg        al,byte ptr [para1] 
0041133A  pop         eax  
0041133B  pop         ebp  
0041133C  ret         8  

posted on 2010-07-02 14:07 會飛的兔子 閱讀(675) 評論(0)  編輯 收藏 引用 所屬分類: C++庫,組件系統(tǒng)API,底層技術(shù)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产三级| 亚洲欧美精品一区| 欧美激情第二页| 久久免费视频一区| 免费观看久久久4p| 欧美成年人视频| 欧美日韩久久久久久| 欧美三日本三级少妇三2023 | 另类人畜视频在线| 老司机免费视频久久| 欧美成人乱码一区二区三区| 欧美日本中文| 国产精品一区二区三区免费观看| 国产综合色在线视频区| 亚洲观看高清完整版在线观看| 亚洲欧洲视频在线| 亚洲男人的天堂在线观看| 久久九九热免费视频| 欧美激情久久久久| 亚洲网友自拍| 你懂的一区二区| 日韩午夜在线视频| 欧美一区二区精美| 欧美三级电影一区| 亚洲大片免费看| 性做久久久久久免费观看欧美| 久久在线免费观看| 亚洲午夜久久久久久久久电影院 | 久久精品天堂| 亚洲福利久久| 亚洲自拍另类| 欧美精品在线视频观看| 国产日韩欧美综合一区| 在线中文字幕一区| 欧美成人午夜免费视在线看片| 亚洲男人av电影| 欧美日韩1区| 亚洲国产欧美久久| 久久久久久免费| 亚洲欧美色一区| 欧美午夜剧场| 国产精品99久久不卡二区| 亚洲第一中文字幕在线观看| 久久精品国产一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 日韩一级黄色大片| 亚洲第一区色| 免费久久99精品国产自在现线| 国产亚洲欧美一区在线观看| 亚洲欧美日韩精品| 一区二区三区视频在线观看| 欧美久久久久久久| 亚洲精选在线观看| 亚洲人成网站影音先锋播放| 欧美大色视频| 亚洲美女91| 亚洲精品一级| 欧美日韩在线三区| 亚洲小说春色综合另类电影| 亚洲人成人99网站| 欧美日韩精品免费观看视频完整| 亚洲精品乱码久久久久久日本蜜臀| 欧美激情一区三区| 亚洲三级视频在线观看| 免费在线国产精品| 亚洲国产日韩在线一区模特| 久久久蜜桃一区二区人| 欧美一区二区三区视频免费播放| 国产精品入口日韩视频大尺度| 一区二区三区国产在线观看| 最近中文字幕日韩精品| 欧美日韩精品一区二区三区四区| 亚洲精品看片| 亚洲精品少妇网址| 国产精品地址| 亚洲狠狠丁香婷婷综合久久久| 模特精品裸拍一区| 欧美精品日日鲁夜夜添| 亚洲小说春色综合另类电影| 亚洲欧美激情诱惑| 狠狠久久综合婷婷不卡| 亚洲电影第三页| 欧美特黄一级| 久久中文久久字幕| 欧美另类一区| 久久成人精品一区二区三区| 久久一区二区三区四区| 在线视频精品一区| 亚洲欧美日韩精品久久| 在线免费不卡视频| 一本色道88久久加勒比精品| 国产一级久久| 亚洲精品国产视频| 国产一区视频在线看| 亚洲人成人77777线观看| 国产精品一级| 亚洲第一二三四五区| 国产精品免费在线| 亚洲国产成人精品视频| 国产精品久久久久久久久动漫 | 亚洲高清在线观看| 国产精品美女久久久久久久| 免费视频亚洲| 国产精品亚洲综合一区在线观看| 欧美成人免费全部| 国产欧美精品xxxx另类| 亚洲精品少妇| 亚洲激情在线激情| 欧美怡红院视频| 亚洲欧美日韩精品| 欧美美女bbbb| 欧美激情第三页| 国产亚洲欧美另类一区二区三区| 日韩视频二区| 亚洲精品无人区| 久久露脸国产精品| 久久久国产午夜精品| 欧美三级网页| 亚洲精品乱码久久久久久黑人| 黄色精品一区| 欧美亚洲日本网站| 欧美一二三视频| 国产精品久久久一区二区三区| 最新亚洲一区| 亚洲人成啪啪网站| 美国十次了思思久久精品导航| 久久精品国产亚洲精品| 国产精品中文字幕欧美| 亚洲一区二区三区视频| 中文日韩在线视频| 欧美日韩国产天堂| 亚洲三级免费观看| 99人久久精品视频最新地址| 欧美成人中文字幕| 91久久精品国产91性色| 日韩视频免费观看| 欧美精选在线| 亚洲最快最全在线视频| 一区二区三区国产精品| 欧美日韩在线三级| 亚洲欧美日韩成人| 一区二区亚洲精品| 久久精品一本| 免费看精品久久片| 亚洲经典视频在线观看| 毛片一区二区| 亚洲激情电影在线| 中文精品在线| 国产视频在线观看一区二区| 香蕉av777xxx色综合一区| 久久久久久日产精品| 亚洲电影免费观看高清| 欧美freesex交免费视频| 亚洲剧情一区二区| 午夜日韩在线| 亚洲国产精品女人久久久| 欧美aaaaaaaa牛牛影院| 亚洲美女黄色| 久久久国产精品一区二区三区| 亚洲高清视频一区| 欧美日韩成人一区二区| 亚洲欧美精品在线| 欧美黄色aa电影| 亚洲天堂久久| 黑人巨大精品欧美一区二区| 欧美va亚洲va香蕉在线| 一区二区三区欧美成人| 久久综合久久综合久久| 99精品99久久久久久宅男| 国产精品色网| 欧美99久久| 午夜精品一区二区三区电影天堂 | 国产亚洲福利| 欧美激情一区二区久久久| 午夜精品久久久久影视| 亚洲国产另类精品专区| 久久精品五月婷婷| 日韩亚洲精品视频| 国产一区二区三区视频在线观看| 欧美大尺度在线| 欧美一区永久视频免费观看| 日韩视频不卡中文| 欧美电影免费观看高清| 欧美亚洲免费| 一本久道久久久| 亚洲国产成人精品女人久久久| 国产精品成人免费精品自在线观看| 久久久久久久久久久久久女国产乱 | 欧美极品欧美精品欧美视频| 欧美亚洲综合另类| 一区二区三区四区五区在线| 亚洲第一中文字幕| 农夫在线精品视频免费观看| 午夜视频在线观看一区| 洋洋av久久久久久久一区| 亚洲高清电影| 在线看国产日韩| 韩国av一区| 国产一区二区日韩精品| 国产精品麻豆欧美日韩ww|