在bss段中宣告資料的乙個好處是資料不包含在可執行的程式中。在資料段中定義資料時必須被包含在可執行的程式中,因為必須使用特定值初始化。
test1.s
.section .text
.global _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
執行:
$ as -o test1.o test1.s
$ ld -o test1 test1.o
$ ls -al test1
執行結果顯示占用664位元組
test2.s
.section .bss
.lcomm buffer ,10000
.section .text
.global _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
執行:
$ as -o test2.o test2.s
$ ld -o test2 test2.o
$ ls -al test2
執行結果顯示占用872位元組
test3.s
.section .bss
.lcomm buffer ,10000
.section .text
.global _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
執行:
$ as -o test3.o test3.s
$ ld -o test3 test3.o
$ ls -al test3
執行結果顯示占用10872位元組
在 bss中有 . lcomm 和 .comm ,前者表示區域性變數後者表示全域性變數
Text段 Data段和BSS段
不同的compiler在編譯的過程中對於儲存的分配可能略有不同,但基本結構大致相同。大體上可分為三段 text段 data段和bss段。text段用於存放 通常情況下在記憶體中被對映為唯讀,但data和bss是可寫的。資料存放通常分成如下幾個部分 1 棧 由編譯器自動分配,儲存函式的區域性變數和引數...
bss段和 data段的區別
在採用段式記憶體管理的架構中 比如intel的80x86系統 bss段 block started by symbol segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。比如,在c語...
text段,data段,bss段,堆和棧
乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...