日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎樣進(jìn)行C++調(diào)用

進(jìn)行C++調(diào)用時遇到了棘手的問題,Naked Call這是一個很少見的C++調(diào)用約定,建議程序設(shè)計(jì)者不要使用。編譯器不會給這種函數(shù)增加初始化和清理代碼,省的變成了白用工。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)和田縣,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

調(diào)用處push 1push 2call functionadd esp,8 注意:這里C++調(diào)用者在恢復(fù)堆棧被調(diào)用函數(shù)_function處push ebp 保存ebp寄存器,該寄存器將用來保存堆棧的棧頂指針,可以在函數(shù)退出時恢復(fù)mov ebp,esp 保存堆棧指針mov eax,[ebp + 8H] 堆棧中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向aadd eax,[ebp + 0CH] 堆棧中ebp + 12處保存了bmov esp,ebp 恢復(fù)esppop ebpret 注意,這里沒有修改堆棧

MSDN中說,該修飾自動在函數(shù)名前加前導(dǎo)的下劃線,因此函數(shù)名在符號表中被記錄為_function,但是我在編譯時似乎沒有看到這種變化。由于參數(shù)按照從右向左順序壓棧,因此最開始的參數(shù)在最接近棧頂?shù)奈恢?,因此?dāng)采用不定個數(shù)參數(shù)時,***個參數(shù)在棧中的位置肯定能知道,只要不定的參數(shù)個數(shù)能夠根據(jù)***個后者后續(xù)的明確的參數(shù)確定下來,就可以使用不定參數(shù),例如對于CRT中的sprintf函數(shù),定義為:

 
 
 
  1. class A{public:   int function1(int a,int b);   
  2. int function2(int a,...);};
  3. int A::function1 (int a,int b){  
  4.  return a+b;
  5. }#include int A::function2(int a,...)
  6. {   va_list ap;  
  7.  va_start(ap,a);  
  8.  int i;   
  9. int result = 0;   
  10. for(i = 0 ; i < a ; i ++)  
  11.  {     
  12. result += va_arg(ap,int);   } 

函數(shù)的***個和第二個DWORD參數(shù)(或者尺寸更小的)通過ecx和edx傳遞,其他參數(shù)通過從右向左的順序壓棧被調(diào)用函數(shù)清理堆棧函數(shù)名修改規(guī)則同這是一個很少見的調(diào)用約定,一般程序設(shè)計(jì)者建議不要使用。

編譯器不會給這種函數(shù)增加初始化和清理代碼,更特殊的是,你不能用return返回返回值,只能用插入?yún)R編返回結(jié)果。這一般用于實(shí)模式驅(qū)動程序設(shè)計(jì),假設(shè)定義一個求和的加法程序,可以定義為:

 
 
 
  1. __declspec(naked) int add(int a,int b){ __asm mov eax,a __asm add eax,b __asm ret }

注意,這個函數(shù)沒有顯式的return返回值,返回通過修改eax寄存器實(shí)現(xiàn),而且連退出函數(shù)的ret指令都必須顯式插入。上面代碼被翻譯成匯編以后變成:

 
 
 
  1. declspec(naked) int add(int a,int b){ __asm mov eax,a __asm add eax,b __asm ret }

由于調(diào)用者沒有理解WINAPI的含義錯誤的增加了這個修飾,上述代碼必然導(dǎo)致堆棧被破壞,MFC在編譯時插入的checkesp函數(shù)將告訴你,堆棧被破壞了。


新聞標(biāo)題:怎樣進(jìn)行C++調(diào)用
本文網(wǎng)址:http://www.5511xx.com/article/dposhch.html