新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編指令:.align理解和用法

        ARM匯編指令:.align理解和用法

        作者: 時間:2016-11-21 來源:網絡 收藏

        對齊偽指令ALIGN
        對齊偽指令格式:

        ALIGN Num

        其中:Num必須是2的冪,如:2、4、8和16等。

        偽指令的作用是:告訴匯編程序,本偽指令下面的內存變量必須從下一個能被Num整除的地址開始分配。

        如果下一個地址正好能被Num整除,那么,該偽指令不起作用,否則,匯編程序將空出若干個字節,直到下一個地址能被Num整除為止。

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

        先看以下代碼:

        mov r1,r0
        mov r0,#12
        ldr r4,str1
        ldr r3, =str1

        ldr r5,str
        ldr r6,=str
        ldr r7,str

        str1:
        .word 7777
        str:
        .word 0x33f80000
        .byte 0x88
        .byte 0x77
        reset:

        mov r8,#0

        這段代碼在編譯時不會出現任何問題,但是實際在執行中并不會按照預定的要求執行;

        編譯鏈接后,通過反匯編如下:

        30008000: e1a01000 mov r1, r0
        30008004: e3a0000c mov r0, #12
        30008008: e59f400c ldr r4, [pc, #12] ; 3000801c
        3000800c: e59f3018 ldr r3, [pc, #24] ; 3000802c
        30008010: e59f5008 ldr r5, [pc, #8] ; 30008020
        30008014: e59f6014 ldr r6, [pc, #20] ; 30008030
        30008018: e59f7000 ldr r7, [pc, #0] ; 30008020

        3000801c :
        3000801c: 00001e61 .word 0x00001e61

        30008020 :
        30008020: 33f80000 .word 0x33f80000
        30008024: 7788 .short 0x7788

        30008026 :
        30008026: e3a08000 mov r8, #0
        3000802a: 0000 .short 0x0000
        3000802c: 3000801c .word 0x3000801c
        30008030: 30008020 .word 0x30008020

        通過反匯編我們可以看出,前面所有的指令都是4的倍數,而在reset這個地址處的指令卻不是4的倍數,我們知道ARM是32位處理器,如果在ARM指令狀態下,所有指令的執行都是按照4的倍數進行執行的,而到reset這個地址處時,發現地址為30008026不是4的倍數,于是就自動歸到30008024處執行,當然會出錯了。

        在指令出現非對齊情況下,可以在下面插入.align偽指令,如下:

        mov r1,r0
        mov r0,#12
        ldr r4,str1
        ldr r3, =str1

        ldr r5,str
        ldr r6,=str
        ldr r7,str

        str1:
        .word 7777
        str:
        .word 0x33f80000
        .byte 0x88
        .byte 0x77
        .align
        reset:
        mov r8,#0

        通過編譯后反匯編如下:

        30008000: e1a01000 mov r1, r0
        30008004: e3a0000c mov r0, #12
        30008008: e59f400c ldr r4, [pc, #12] ; 3000801c
        3000800c: e59f3018 ldr r3, [pc, #24] ; 3000802c
        30008010: e59f5008 ldr r5, [pc, #8] ; 30008020
        30008014: e59f6014 ldr r6, [pc, #20] ; 30008030
        30008018: e59f7000 ldr r7, [pc, #0] ; 30008020

        3000801c :
        3000801c: 00001e61 .word 0x00001e61

        30008020 :
        30008020: 33f80000 .word 0x33f80000
        30008024: 7788 .short 0x7788
        ...

        30008028 :
        30008028: e3a08000 mov r8, #0
        3000802c: 3000801c .word 0x3000801c
        30008030: 30008020 .word 0x30008020

        加上.align匯編語句后,指令就對齊!

        .align $



        關鍵詞: ARM匯編指令alig

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 英超| 敦化市| 利辛县| 明星| 永春县| 台南市| 广东省| 健康| 保靖县| 凉山| 平顶山市| 民和| 青河县| 鞍山市| 连云港市| 永川市| 纳雍县| 罗江县| 潢川县| 建阳市| 深州市| 噶尔县| 荆州市| 育儿| 开阳县| 海宁市| 杂多县| 海丰县| 高淳县| 凤山县| 黑河市| 阳山县| 左云县| 河南省| 措美县| 鹿泉市| 昌图县| 姜堰市| 静安区| 凤庆县| 客服|