程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 函數調用--函數棧

函數調用--函數棧

編輯:C++入門知識

函數調用大家都不陌生,調用者向被調用者傳遞一些參數,然後執行被調用者的代碼,最後被調用者向調用者返回結果,還有大家比較熟悉的一句話,就是函數調用是在棧上發生的,那麼在計算機內部到底是如何實現的呢?   對於程序,編譯器會對其分配一段內存,在邏輯上可以分為代碼段,數據段,堆,棧 代碼段:保存程序文本,指令指針EIP就是指向代碼段,可讀可執行不可寫 數據段:保存初始化的全局變量和靜態變量,可讀可寫不可執行 BSS:未初始化的全局變量和靜態變量 堆(Heap):動態分配內存,向地址增大的方向增長,可讀可寫可執行 棧(Stack):存放局部變量,函數參數,當前狀態,函數調用信息等,向地址減小的方向增長,非常非常重要,可讀可寫可執行 如圖所示 寄存器 EAX:累加(Accumulator)寄存器,常用於函數返回值 EBX:基址(Base)寄存器,以它為基址訪問內存 ECX:計數器(Counter)寄存器,常用作字符串和循環操作中的計數器 EDX:數據(Data)寄存器,常用於乘除法和I/O指針 ESI:源變址寄存器 DSI:目的變址寄存器 ESP:堆棧(Stack)指針寄存器,指向堆棧頂部 EBP:基址指針寄存器,指向當前堆棧底部 EIP:指令寄存器,指向下一條指令的地址 源代碼

 print_out( begin, , begin++ *= (*)((&begin) - (begin <=*p -=   add( a,  a+ pass( a,  b,  buffer[] = { sum =  *= (*)(buffer+
 sum = a + b +,  a =  b = =

 

函數初始化
  : 
011C1541 mov ebp,esp 
011C1543 sub esp,0F0h 
-0F0h] 
011C1552 mov ecx,3Ch 

 

一般所用函數的開頭都會有這段命令,完成了狀態寄存器的保存,堆棧寄存器的保存,函數內存空間的初始化 函數調用
 : print_out(,  
013D1560 push  
013D1562 call print_out (13D10FAh)
013D1567 add esp,  

 

被調用函數返回
013D141C mov eax,  

013D1424 add esp,0D0h 
+
013D1433 pop ebp 
013D1434 ret  

 

call指令隱含操作push EIP,ret指令隱含操作 pop EIP,兩條指令完全對應起來  寫到這裡我們就可以分析一下main函數調用print_out函數前後堆棧(Stack)發生了什麼變化,下面用一系列圖說明      接下來是返回過程,從上面的013D1431 行代碼開始              print_out函數調用前後,main函數的棧幀完全一樣,perfect! 下面我們來看看print_out函數到底做了什麼事情
 *= (*)((&begin) - (begin <=*p -= ;
根據上面調用print_out函數後的示意圖,可以知道p實際上是指向了函數的返回地址addr,然後把addr-5,這又會發生什麼? 再回頭看一下反匯編的代碼,
013D1560 push  
013D1562 call print_out (13D10FAh)
013D1567 add esp,  
分析可知,返回地址addr的值是013D1567 ,addr-5為013D1562 ,把返回地址指向了call指令,結果是再次調用print_out函數, 從而print_out函數實現了打印從begin到end之間的所有數字,可以說是循環調用了print_out函數   對於add函數,主要是為了說明返回值存放於寄存器eax中。   另外,VS自身會提供一些安全檢查 CheckStackVar安全檢查http://blog.csdn.net/masefee/article/details/5630154,通過ecx和edx傳遞參數, 局部變量有數組時使用 __security_check_cookie返回地址檢查, 數組長度大於等於5時使用 __RTC_CheckEsp程序棧檢查,printf函數用使用  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved