bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。修改main函式如下所示:bss是英文block started by symbol的簡稱。
bss段屬於靜態記憶體分配。
#include
"uart.h"
#include
"led.h"
int mydata =
12315
;const
int myconst =
22315
;int my[
1024]=
;int myzero1 =0;
int myzero2 =0;
intmain
(void
)}
編譯燒錄執行,可以看到,兩個初始化為零的全域性變數的值並不為零,這是因為二進位制檔案中並不包含bss段
我們開啟.dis檔案,可以看到bss段的位址如下所示
使用二進位制檢視器檢視檔案.bin檔案,可以看到,該程式韌體只到位址370為止,並不包含bss段
在start.s
中加入如下**清除bss段**,其中bss段的開始和結束位址__bss_start
、__bss_end
則是從鏈結指令碼中獲取的。
.text /* .text段儲存**,是唯讀和可執行的,後面的指令都屬於.text段。 */
.global _start /* .global表示_start是乙個全域性符號,會在鏈結器鏈結時用到 */
_start:
/* 標籤_start,匯程式設計序的預設入口是_start */
/* 1、設定棧 */
ldr sp,=(
0x80000000
+0x100000
)/* 設定棧頂位址 */
/* 2、清除bss段 */
ldr r1,
=__bss_start /* 將bss段開始位址存入r1暫存器 */
ldr r2,
=__bss_end /* 將bss段結束位址存入r2暫存器 */
b clean_bss
clean:
mov r3, #0
/* 將0存入r3暫存器 */
str r3,
[r1]
, #4
/* 將r3中的值存到r1中的值所指向的位址中, 同時r1中的值加4 */
clean_bss:
cmp r1, r2 /* 比較r1和r2內的值是否相等 */
bne clean /* 如果不相等則跳轉到clean標籤處,如果相等則往下執行 */
/* 3、跳轉到led函式 */
bl main
/* 4、原地迴圈 */
b .
然後編譯執行燒錄,這樣我們就可以看到變數的值正常了
**存放:
IMX6ULL學習筆記(一)
imx6ull裸機開發學習 以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊。bin檔案前面要新增頭部 ivt boot data dcd資料 由官方手冊可知要燒寫到sd卡中的load.imx檔案在sd卡中的起始位址是0x400,也就是1...
IMX6ULL學習筆記(三)
imx6ull裸機開發學習 以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊。鏈結指令碼的例子 sections rodata align 4 data align 4 bss start bss align 4 bss end bss ...
IMX6ULL學習筆記(六)
imx6ull裸機開發學習 以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊。首先使用預設配置檔案,編譯下測試linux能否在板子上執行。配置檔案所在路徑arch arm configs imx v7 mfg defconfig 通過修改...