<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
call:函數的調用
ret:函數的返回
函數在調用時要做兩件事:
1、將函數的返回地址保存
2、跳轉到函數代碼的位置處執行
函數在返回時要做兩件事:
1、取出返回地址
2、跳轉
函數的棧幀
每一個函數調用都需要在系統棧中劃分出一塊區域,這個區域存儲函數內部的變量(局部變量)和臨時值。當函數調用結束後,這塊內存失效,系統可以將其作爲棧幀再次分給其它的函數調用。這塊系統棧中的內存區域叫做函數的棧幀。
臨時值:
int c;
c=add(1,2);
t1=add(1,2);
c=t1;
push等價於:
sub 0x4, %esp
mov 寄存器, (%esp)
pop等價於:
mov (%esp), 寄存器
add $0x4, %esp
call等價於:
push %eip
mov 地址, %eip
ret等價於:
pop %eip
leave等價於:
mov %ebp, %esp
pop %ebp
.text(代碼段):存儲二進制機器指令
.data(數據段):存儲全局數據——全局變量和靜態變量
.rodata(只讀數據段):存儲複雜常量——大型浮點數、字符串
普通常量存儲於代碼段中。
.bss:存儲未初始化的全局數據
該段的大小確定,但是由於其中數據的值未確定所以不保存到外存上,只有程序運行時其數據全部初始化位0。