彙編學習筆記(5)x86彙編 棧中資料的儲存。
阿新 • • 發佈:2018-12-26
菜雞剛學彙編,總結下。
呼叫函式後,函式會開闢一塊緩衝區,例如
push ebp
mov ebp,esp
sub esp,0x40
這個sub esp,0x40
就是開闢了緩衝區,不同編譯器開闢的緩衝區的大小不同,不用在意這個大小。開闢的這塊緩衝區用來存放區域性變數。
堆疊中 單獨儲存的變數 ,每個都佔4個位元組的大小。並不是挨著儲存的,這樣雖然會造成空間浪費,但是可以減少定址時間。這個是根據本機的位數定的,如果是32位的,佔4個位元組,如果是16位,就佔兩個位元組。
小於32位的單個區域性變數,分配記憶體時仍按32位分配,但使用時按實際的寬度使用,定義區域性變數為char,short並不會節省空間
例如 c語言中
int main()
{
char a='a';
int b=1;
}
char型別 只佔 EBP-4 這一格。
如果令 char a=12345678
則 a中實際的值是78(10進位制)。
這樣定義了兩個區域性變數,轉化為彙編(debug版)即是
mov byte ptr ss:[ebp-0x4],0x61
mov dword pte ss:[ebp-0x8],0x1
每次都是減4,並不是挨著儲存。
堆疊中的情況如下。
而陣列的儲存和單個區域性變數不同。
陣列的定址公式是 :陣列元素的首地址+陣列元素型別所佔位元組數*n
陣列中元素在棧中連續儲存的,而且是陣列的末尾先入棧。
例如 c語言
int main()
{
char a[4]={'a','b','c','d'};
}
···
堆疊圖如下
int main()
{
int a[4]={1,2,3,4};
}
堆疊中的情況如下。