1. 程式人生 > >彙編學習筆記(5)x86彙編 棧中資料的儲存。

彙編學習筆記(5)x86彙編 棧中資料的儲存。

菜雞剛學彙編,總結下。

呼叫函式後,函式會開闢一塊緩衝區,例如

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};
    }

堆疊中的情況如下。
在這裡插入圖片描述