彙編 在bss段和data段宣告資料的區別

2021-08-29 23:49:52 字數 1015 閱讀 5456

在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段 定義而沒有賦初值的全域性變數...