C與彙編程式的約定呼叫

xOuOx發表於2015-10-20

執行函式前(已經呼叫)(prologue):

將引數逆序壓入堆疊(這樣在使用ebp+偏移量來訪問引數時,可以不考慮引數的數量,直接用%ebp+8(,%ebp+12...)等訪問第1個至第N個引數)

pushl $3 # push the n parameter

pushl $2 # push the secondary parameter

pushl $1 # push the first parameter

call fun #

引數n
.
.
.
引數(3):
引數(2):  
引數(1):  
返回地址:                  <----esp 

執行函式(body):

儲存原來的ebp至堆疊中

pushl %ebp

.
引數3:
引數2:  
引數1:
返回地址:
%ebp(原)                    <----esp

將現在的ebp賦值為esp

movl %esp,%ebp

引數3:
引數2:
引數1:      
返回地址:                                            
%ebp(原)                    <----esp  <----ebp

建立空間(下移esp指標)用於儲存區域性變數

subl $8,%esp

引數3:
引數2:     
引數1:           
返回地址:            
%ebp(原)                    <----ebp        
|  
|                           <----esp

返回(epilogue):

儲存返回值至eax

movl -n(%ebp), %eax

丟棄建立的空間(將esp指標移至現ebp)

movl %ebp, %esp

引數3:
引數2:  
引數1:   
返回地址:  
%ebp                      <----ebp    <----esp   
| 
|

彈出ebp的舊值裝入現在ebp

popl %ebp

引數3:
引數2:  
引數1:
返回地址:                <----esp
| 
| 
|

ret指令通過把返回地址從堆疊中彈出到程式計數器,從而從該函式返回

ret

相關文章