函數棧幀和內存分佈筆記

<!-- @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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章