新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GUN ARM匯編中標號的引用在匯編和C語言中區別

        GUN ARM匯編中標號的引用在匯編和C語言中區別

        作者: 時間:2016-11-20 來源:網絡 收藏
        匯編語言中標號表示的是地址,但是C中要取得該標號處的數據,卻是直接使用該標號,不是應該對該地址進行取值運算(*指針地址)嗎?其實不是的。

        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語言中,對基本數據類型變量的引用,其值就是對應內存中的數據,而對于復雜數據類型及函數,其標識符名是指向首地址的指針,其值是它們的首地址。
        或許可以這樣理解,由于對于基本數據類型來說,其地址和對應內存單元中的數據剛好是一一對應的,對變量的引用目的也是希望對內存中的數據進行操作,所以默認是取得變量對應內存單元中的數據;而對于復雜數據類型及函數來說,利用一個地址取得全部數據是不可能的,所以就用標明首地址的方式,加上地址的線性連續,便可以通過首地址取得全部數據,這是通過對指針(地址)的操作來實現的。

        本文引用地址:http://www.104case.com/article/201611/318790.htm


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 衡山县| 大丰市| 封开县| 当阳市| 汤原县| 永和县| 宝兴县| 灯塔市| 从化市| 阿鲁科尔沁旗| 宾阳县| 临猗县| 临海市| 昌都县| 五台县| 台中市| 吴江市| 沁源县| 宝坻区| 磐石市| 调兵山市| 福清市| 谷城县| 龙海市| 北京市| 来宾市| 乌海市| 宜川县| 奎屯市| 隆昌县| 万荣县| 城口县| 青田县| 中江县| 武川县| 合肥市| 乳山市| 汕头市| 灵川县| 黎平县| 宜川县|