1. 程式人生 > >GUN ARM彙編中標號的引用在彙編和C語言中區別(monitor_flash_len = _bss_start

GUN ARM彙編中標號的引用在彙編和C語言中區別(monitor_flash_len = _bss_start

u-boot/cpu/xx/start.S中: _TEXT_BASE:  .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我設定為0xa170 0000 */  .globl _armboot_start  _armboot_start:  .word _start /*_start是程式入口,連結完畢它的值應該是0xa170 0000=TEXT_BASE*/  /* 這句話的意思應該是在_armboot_start標號處,儲存了_start的值,也就是說,_armboot_start是存放_start的地址,該地址對應的儲存單元內容是0xa170 0000*/  /*  * These are defined in the board-specific linker script. 下面的定義與上面應該是一個意思。  */  .globl _bss_start  _bss_start:  .word __bss_start  =============================================== 在C入口函式start_armboot()中(對應檔案為lib_arm/board.c),有如下程式碼: void start_armboot (void)  {  .........  gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); //第一句話  ..........  monitor_flash_len = _bss_start - _armboot_start; //第二句話  ...............  mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //第三句話  ..........  }  在這裡,如果混淆了在彙編中和C語言中對彙編標號的引用的區別,就會認為monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4 其實 monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070 =============================================== 下邊總結一下,組合語言和C語言中對彙編中的全域性標號的引用的區別: 1018: a1700048 0 NOTYPE GLOBAL DEFAULT 1 _bss_start  1083: a1700044 0 NOTYPE GLOBAL DEFAULT 1 _armboot_start  1142: a1700000 0 NOTYPE GLOBAL DEFAULT 1 _start  1197: a171b070 0 NOTYPE GLOBAL DEFAULT ABS __bss_start  在彙編中,標號==地址,對標號的引用就是對標號對應的地址操作,如_armboot_start,其值就是a1700044,如果想取得其對應記憶體地址中的資料,就需要ldr等指令。舉個不恰當的例子,如果在組合語言中也可以有類似x-y的操作的話 monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4 這是完全正確的。 然而,在C語言中,其結果卻不是這樣的。在C中,對彙編中的全域性標號的引用,其值不再是地址,而是地址對應記憶體單元中的資料,所以對於C語言 monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070 在C語言中,對基本資料型別變數的引用,其值就是對應記憶體中的資料,而對於複雜資料型別及函式,其識別符號名是指向首地址的指標,其值是它們的首地址。 或許可以這樣理解,由於對於基本資料型別來說,其地址和對應記憶體單元中的資料剛好是一一對應的,對變數的引用目的也是希望對記憶體中的資料進行操作,所以預設是取得變數對應記憶體單元中的資料;而對於複雜資料型別及函式來說,利用一個地址取得全部資料是不可能的,所以就用標明首地址的方式,加上地址的線性連續,便可以通過首地址取得全部資料,這是通過對指標(地址)的操作來實現的。

--------------------- 本文來自 Decisiveness 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/Decisiveness/article/details/44153723?utm_source=copy