溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣進(jìn)行C++調(diào)用

發(fā)布時(shí)間:2021-10-27 17:40:08 來(lái)源:億速云 閱讀:262 作者:柒染 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(guān)怎樣進(jìn)行C++調(diào)用,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

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

調(diào)用處push 1push 2call functionadd esp,8 注意:這里C++調(diào)用者在恢復(fù)堆棧被調(diào)用函數(shù)_function處push ebp 保存ebp寄存器,該寄存器將用來(lái)保存堆棧的棧頂指針,可以在函數(shù)退出時(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 注意,這里沒(méi)有修改堆棧

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

class A{public:   int function1(int a,int b);     int function2(int a,...);};  int A::function1 (int a,int b){     return a+b;  }#include int A::function2(int a,...)  {   va_list ap;     va_start(ap,a);     int i;     int result = 0;     for(i = 0 ; i < a ; i ++)     {       result += va_arg(ap,int);   }

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

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

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

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

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

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

以上就是怎樣進(jìn)行C++調(diào)用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI