ARM匯編中標(biāo)號(hào)的引用在匯編和C語(yǔ)言中區(qū)別
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
在匯編中,標(biāo)號(hào)==地址,對(duì)標(biāo)號(hào)的引用就是對(duì)標(biāo)號(hào)對(duì)應(yīng)的地址操作,如_armboot_start,其值就是a1700044,如果想取得其對(duì)應(yīng)內(nèi)存地址中的數(shù)據(jù),就需要ldr等指令。舉個(gè)不恰當(dāng)?shù)睦?,如果在匯編語(yǔ)言中也可以有類(lèi)似x-y的操作的話(huà)
monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4
這是完全正確的。
然而,在C語(yǔ)言中,其結(jié)果卻不是這樣的。在C中,對(duì)匯編中的全局標(biāo)號(hào)的引用,其值不再是地址,而是地址對(duì)應(yīng)內(nèi)存單元中的數(shù)據(jù),所以對(duì)于C語(yǔ)言
monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070
在C語(yǔ)言中,對(duì)基本數(shù)據(jù)類(lèi)型變量的引用,其值就是對(duì)應(yīng)內(nèi)存中的數(shù)據(jù),而對(duì)于復(fù)雜數(shù)據(jù)類(lèi)型及函數(shù),其標(biāo)識(shí)符名是指向首地址的指針,其值是它們的首地址。
或許可以這樣理解,由于對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō),其地址和對(duì)應(yīng)內(nèi)存單元中的數(shù)據(jù)剛好是一一對(duì)應(yīng)的,對(duì)變量的引用目的也是希望對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作,所以默認(rèn)是取得變量對(duì)應(yīng)內(nèi)存單元中的數(shù)據(jù);而對(duì)于復(fù)雜數(shù)據(jù)類(lèi)型及函數(shù)來(lái)說(shuō),利用一個(gè)地址取得全部數(shù)據(jù)是不可能的,所以就用標(biāo)明首地址的方式,加上地址的線(xiàn)性連續(xù),便可以通過(guò)首地址取得全部數(shù)據(jù),這是通過(guò)對(duì)指針(地址)的操作來(lái)實(shí)現(xiàn)的。
評(píng)論