經(jīng)典的Linux進(jìn)程內(nèi)存布局,如下圖:
整個(gè)內(nèi)存空間包括棧區(qū),全局區(qū),堆區(qū)。
void arr_on_stack() {
int arr[6];
arr[0]=100;
arr[1]=200;
arr[2]=300;
arr[3]=400;
arr[4]=500;
arr[5]=600;
int a = arr[0];
}
我們定義了一個(gè)局部變量arr作為int類型的數(shù)組,然后分別將100-600寫到了數(shù)組中。那么,數(shù)組arr在內(nèi)存中是怎樣表示的呢?
首先,我們編譯一下:
#gcc-g-fno-stack-protectora.c
注意,-fno-stack-protector選項(xiàng)是為了禁止堆棧保護(hù),讓匯編更容易懂些。使用gdb測(cè)試代碼運(yùn)行情況,gdb面前程序的運(yùn)行時(shí)(run time)了無秘密。用gdb來調(diào)試剛剛編譯出來的程序,這里看一下arr_on_stack函數(shù)的匯編指令:
(gdb) disassemble arr_on_stack
Dump of assembler code for function arr_on_stack:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
0x000000000040052a <+4>: movl $0x64,-0x20(%rbp)
0x0000000000400531 <+11>: movl $0xc8,-0x1c(%rbp)
0x0000000000400538 <+18>: movl $0x12c,-0x18(%rbp)
0x000000000040053f <+25>: movl $0x190,-0x14(%rbp)
0x0000000000400546 <+32>: movl $0x1f4,-0x10(%rbp)
0x000000000040054d <+39>: movl $0x258,-0xc(%rbp)
=> 0x0000000000400554 <+46>: mov -0x20(%rbp),%eax
0x0000000000400557 <+49>: mov %eax,-0x4(%rbp)
0x000000000040055a <+52>: nop
0x000000000040055b <+53>: pop %rbp
0x000000000040055c <+54>: retq
End of assembler dump.
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11123瀏覽量
207919 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
2903瀏覽量
73543 -
C語言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134123
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論