在C語言中,初始化的全局變量是存在數(shù)據(jù)段的,初始化的局部變量是存在棧中的,用malloc分配的空間是存在堆里的,未初始化的全局變量是存在bss段。
Hello.c:
#include int bssdata;
int main(){
bssdata = 2015;
return bssdata;
}
編譯,讀出可執(zhí)行文件的信息:

從下面可以看到,定義的未初始化的全局變量的地址是00010530,而bss段的開始地址_bss_start是0001052c,bss段的結束地址_bss_end是00010534。看到定義的未初始化的全局變量是在bss段的。

之所以要對bss進行初始化,是為了避免錯誤,初始化bss段里的值都是0.
從上面知道,要初始化bss段,需要知道bss段的起始地址和結束地址,其實這兩個地址在鏈接器腳本里有:

上面的bss_start就是bss段的起始地址,bss_end是bss段的結束地址。
clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0, r1 //如果相等則返回,不相等跳到clean_loop處執(zhí)行。
moveq pc, lr //返回
clean_loop:
mov r2, #0 //先把寄存器r2賦值為0
str r2, [r0], #4 //再把r2寄存器里的值0傳給r0,接著r0寄存器加4往后移動
cmp r0, r1 //繼續(xù)比較
bne clean_loop //不相等則返回繼續(xù)清0
mov pc, lr //相等則返回
通過上面的操作,就把bss里的地址所指向的值都賦值為零,bss段的初始化結束。
關鍵字:C語言 數(shù)據(jù)段
引用地址:
35.BSS段的知識
推薦閱讀最新更新時間:2025-07-02 10:06
單片機C語言的知識匯總
一、概述 1、結合8051介紹單片機C語言的優(yōu)越性: ·無須懂得 單片機 的具體硬件,也能夠編出符合硬件實際的專業(yè)水平的程序; ·不懂得單片機的指令集,也能夠編寫完美的單片機程序; ·不同函數(shù)的數(shù)據(jù)實行覆蓋,有效利用片上有限的RAM空間; ·提供auto、 static 、const等存儲類型和專門針對8051單片機的data、idata、pdata、xdata、code等存儲類型,自動為變量合理地分配地址; ·C語言提供復雜的數(shù)據(jù)類型( 數(shù)組 、結構、聯(lián)合、枚舉、指針等),極大地增強了程序處理能力和靈活性; ·提供small、compact、large等編譯模式,以適應片上存儲器的大??;
[單片機]
C語言一百例第十五例
代碼: /* C語言第十五例 題目:利用條件運算符的嵌套來完成此題:學習成績 =90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。 程序分析:(a b)?a:b這是條件運算符的基本例子。 */ #include stdio.h void main(void) { int a; char grade; printf( 請輸入一個分數(shù):n ); scanf( %d ,&a); grade=(a =90)?'A':((a =60)?'B':'C'); //條件運算符的意思就是,當括號里的為真,執(zhí)行問號后面的,不然就執(zhí)行冒號后面的程序,
[單片機]
基于MSP430 Timer_B的D/A轉換及C語言源程序
本文分析了利用MSP430的TImer_B在比較模式下輸出的脈寬調制(PWM)波,來實現(xiàn)D/A轉換的工作原理。介紹了利用MSP430F449的TImer_B的PWM輸出產(chǎn)生正弦波和直流電平的方法,并給出了對應的硬件電路和C語言源程序。 1.簡介 1.1 MSP430單片機介紹 雖然目前在國內市場上應用較多的單片機仍然是8位單片機,但是由美國德州儀器(TI)公司推出的16位單片機MSP430具有處理能力強、運行速度快、低功耗、指令簡單等優(yōu)點。并采用了JTAG技術、FLASH在線編程技術、BOOTSTRAP等諸多先進技術,因此具有很高的性價比,在歐洲市場已得到了非常廣泛的應用。雖然MSP430進入國內市場的時間不是很長,但是因其具
[單片機]
單片機C語言-程序結構
先來簡單說說C語言的標識符和關鍵字。 標識符是用來標識源順序中某個對象的名字的, C語言是大小字敏感的一種高級語言, 假設我們要定義一個定時器1, 標識符由字符串, 數(shù)字和下劃線等組成, 留意的是第一個字符必須是字母或下劃線, 如“1Timer”是錯誤的, 編譯時便會有錯誤提示。 所以普通不要以下劃線開頭命名標識符。 含義明晰, 這樣有助于閱讀理解順序。 在C51編譯器中, 只支持標識符的前32位為有效標識, 普通情況下也足夠用了。 在順序編寫中不允許標識符與關鍵字相同。 在KEILuVision2中的關鍵字除了有ANSIC標準的32個關鍵字外還依據(jù)51單片機的特點擴展了相關的關鍵字(比如for, while等標準的還有sbit,
[單片機]
基于18B20溫度傳感器+1602液晶顯示器的C語言程序設計開發(fā)
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit DQ = P3^3 ; //定義DS18B20端口DQ sbit BEEP=P3^6 ; //蜂鳴器驅動線 bit presence ; //檢測18b20是否插好 sbit LCD_RS = P2^0 ; sbit LCD_RW = P2^1 ; sbit LCD_EN = P2^2 ; uchar code cdis1 = { 牛牛智能科技 } ; uchar code cdis2 = { WENDU: . C
[單片機]
PIC單片機CCS之C語言(#DEVICE的用法)
#DEVICE 語法: #device chip options chip是一個特殊的處理器名字(如:PIC16C74),目的是取得支持設備的當前列表: START | RUN | CCSC +Q Option是設備標準操作的限定句.有效的可選項是: *=5 使用5位指針(適合所有的器件) *=8 使用8位指針(適合14和16位的器件) *=16 使用16位指針(適合14位的器件) ADC=x 這里的x是read_adc()函數(shù)返回的位數(shù). ICD=TRUE 產(chǎn)生兼容Microchips ICD硬件調試代碼 WRITE_EE
[單片機]
PIC單片機CCS之C語言(#FUSES的用法)
#FUSES 語法: #fuse options options要根據(jù)設備改變.一系列有效的可選項都要放在每個devices.h文件的頂部,注釋用來參考.PCW能有效編輯修改特殊的設備fuses.PCW下拉菜單VIEW|Valid fuses將會顯示所有的fuses描寫. 一些公共的可選項如下: LP, XT, HS, RC WDT, NOWDT PROTECT, NOPROTECT PUT, NOPUT, (Power Up Timer) BROWNOUT, NOBROWNOUT 目的:這種指示定義要fuses的東西在編程時設定在器件中.這種指示不影響編輯,可是信息放在輸出文件中.如果在Parallax格式中需要f
[單片機]
單片機C語言中的空語句
標準的C語言中沒有空語句。但在 單片機 的C語言編程中,經(jīng)常需要用幾個空指令產(chǎn)生短延時的效果。 這在匯編語言中很容易實現(xiàn),寫幾個nop就行了。 在keil C51中,直接調用庫函數(shù): #include intrins.h // 聲明了void _nop_(void); _nop_(); // 產(chǎn)生一條NOP指令 作用:對于延時很短的,要求在us級的,采用 _nop_ 函數(shù),這個函數(shù)相當匯編NOP指令,延時幾微秒。 NOP指令為單周期指令,可由晶振頻率算出延時時間,對于12M晶振,延時1uS。 對于延時比較長的,要求在大于10us,采
[單片機]