IMX6ULL裸機學習(8) 清除BSS段

2021-10-14 01:50:00 字數 1830 閱讀 4446

bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。

bss是英文block started by symbol的簡稱。

bss段屬於靜態記憶體分配。

修改main函式如下所示:

#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 通過修改...