成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

怎樣進行C++調用

開發(fā) 后端
在C++中語言進行調用時,C++調用約定允許函數的參數的個數是不固定的,這也是C++語言的一大特色,所以受大多數用戶的青睞。

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

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

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

  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);   }  

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

編譯器不會給這種函數增加初始化和清理代碼,更特殊的是,你不能用return返回返回值,只能用插入匯編返回結果。這一般用于實模式驅動程序設計,假設定義一個求和的加法程序,可以定義為:

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

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

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

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

【編輯推薦】

  1. 簡介學習C++總結之談
  2. 對C++庫函數進行學習探索總結筆記
  3. C++類庫設計的基本構思與方法
  4. C++語言真的還有市場價值?
  5. C++類庫設計的基本構思與方法
責任編輯:chenqingxiang 來源: 電子工業(yè)出版社
相關推薦

2010-01-22 11:13:16

C++靜態(tài)

2010-01-12 10:50:59

學習C++

2010-01-26 09:40:23

C++代碼

2010-01-25 10:25:19

C++變量

2010-01-28 10:33:10

C++開發(fā)程序

2010-01-27 13:31:10

C++ main()函

2010-01-21 14:19:44

C++靜態(tài)成員

2010-01-28 13:35:41

調用C++函數

2012-04-28 15:28:21

JNI混合編程Java

2010-01-26 10:01:17

學習C++

2010-01-22 15:53:55

C++轉換

2012-03-20 11:37:24

JavaJNI

2010-01-21 11:23:58

C++函數調用

2021-10-11 11:53:07

C++接口代碼

2010-01-28 11:16:28

C++操作符

2010-01-20 15:00:09

Visual C++開

2010-01-15 18:06:20

C++引用

2010-01-20 17:48:07

C++ 函數重載

2010-01-26 13:55:07

C++標準模板庫

2010-01-27 15:29:45

C++異常處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 不用播放器看的av | 色站综合 | 日日摸天天添天天添破 | 色婷婷精品 | 在线免费观看黄色网址 | 欧美精品 在线观看 | 国产午夜精品久久 | 国产精品天堂 | 免费看一级毛片 | 久久99精品国产 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | v片网站| 亚洲精品视频三区 | 中文字幕一区二区视频 | 麻豆精品一区二区三区在线观看 | 欧美一区2区三区4区公司二百 | 亚洲欧美国产精品久久 | 一级黄色生活视频 | 中文字幕成人av | 91精品中文字幕一区二区三区 | 久久久久久久一区二区三区 | 欧美日韩精品一区二区三区四区 | 91精品一区二区三区久久久久久 | 精品毛片在线观看 | 国产精品美女久久久久aⅴ国产馆 | 1000部精品久久久久久久久 | 成人1区2区| 欧美二区乱c黑人 | 久久一区二区三区免费 | 亚洲精品欧美 | caoporn视频| 日韩欧美中文字幕在线观看 | 欧美日韩一区二区三区不卡视频 | 黄色片av| 国产视频一区二区三区四区五区 | 第一区在线观看免费国语入口 | 91视频网址| 久久视频精品 | 欧美在线一区二区视频 | 国产国语精品 |