gnu彙編中.word偽指令的理解
分類: linux
在u-boot中遇到_armboot_start、_bss_start等這些變數,這些偽指令的用法涉及以下知識
1.彙編是「絕對引用」,即引用的就是位址
在start.s中
_text_base:
.word text_base /*uboot映像在sdram中的重定位位址,我設定為0x33e00000 */
.globl _armboot_start
_armboot_start:
.word _start /*_start是程式入口,鏈結完 畢它的值是0x33e00000 =text_base*/
arm-linux-objdump -d u-boot > u-boot.s
在u-boot.s中找到以下語句
33e00000 <_start>:
33e00000: ea000013 b 33e00054
_start的值是33e00000,這個位址上儲存的指令是b reset
_armboot_start:
.word _start
對應反彙編結果
33e00048 <_armboot_start>:
46 33e00048: 33e00000 .word 0x33e0000047
這句話的意思是在_armboot_start標號處,儲存了
_start的值,也就是說,_armboot_start是存放
_start的位址, 即_armboot_start對應的儲存單元本身位址是
0x33e00048,內容是
0x33e00000
ldr r1, _armboot_start
ldr r2, _start
r1是33e00048,r2是0x33e00000---彙編中對標號的引用,是絕對引用,就是標號的位址本身
.globl _bss_start
_bss_start:
.word __bss_start
按照上面的理解,__bss_start是uboot 的bss段起始位址,那麼u-boot映像的大小就是__bss_start - _start;在relocate**段中計算u-boot的大小時,也體現了這一點。
2.c語言對變數/符號/常量的引用必須通過位址
間接定址
,即引用的是
標號的內容
,而非標號本身位址。
monitor_flash_len = _bss_start - _armboot_start
這句話中對_armboot_star的引用,實際上是把它用作了指標值,即0x33e00000,monitor_flash_len就得到u-boot的長度(包括**段,資料段)
簡單的可理解為
_armboot_start---c語言中引用的值是0x33e00000
_armboot_start---彙編中引用得到的值是b reset
ARM學習筆記 uboot的作用及主要工作 1
pc啟動 上電 bios 引導作業系統windows 識別c d盤 執行應用程式 嵌入式 上電 bootloader linux核心 掛接根檔案系統 執行應用程式 u boot打補丁 編譯 燒寫 1.解壓縮 2.打補丁patch命令 3.配置 4.編譯 uboot作用 主要作用 1.讀flash 2...
UBOOT學習 其一 uboot的作用是什麼
問題 在嵌入式linux中,uboot是很重要的乙個部分.那麼他具體的作用是什麼呢?我們先來看看嵌入式linux的啟動過程 我們看到,bootloader的作用就是載入linux核心.類似的我們看看我們常用pc機的啟動過程 我們看到,雖然系統不同,但原理是一樣的.問題 uboot的如何載入linux...
Word中分節符的作用
在建立新文件時,word 將整篇文件視為一節。為了便於對文件進行格式化,可以將文件分割成任意數量的節,然後就可以根據需要分別為每節設定不同的格式。1.word 中節的作用 如果整篇文件採用統一的格式,則不需要進行分節 如果想在文件的某一部分中間採用不同的格式設定,就必須建立乙個節。節可小至乙個段落,...