新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編入門

        GNU ARM匯編入門

        作者: 時間:2016-11-21 來源:網絡 收藏
        任何匯編行都是如下結構:
        [
        [<標簽>:] [<指令>} @ 注釋
        GNU ARM 匯編中,任何以冒號結尾的都被認為是一個標簽,而不一定非要在一行的開始。下面是一個簡單的例子,這段匯編程序定義了一個"add"的函數,該函數返回兩個參數的和:
        .section .text, “x”
        .global add @ give the symbol add external linkage
        add:
        ADD r0, r0, r1 @ add input arguments
        MOV pc, lr @ return from subroutine
        @ end of program
        GNU ARM匯編偽指令
        下面列出了一些GNU ARM匯編偽指令,并給出了相應說明。
        .ascii “” 在匯編中定義字符串并為之分配存儲空間(與armasm中的DCB功能類似)。
        .asciz “” 和.ascii類似, 但不分配存儲空間。
        .balign {, {,} }
        以某種排列方式在內存中填充數值。(該指令與armasm中的ALIGN類似)。
        power_of_2表示排列方式,其值可為4,8,16或32,單位是byte;
        fill_value是要填充的值;
        max_padding最大的填充界限,請求填充的bytes數超過該值,將被忽略。
        .byte {,} … 定義一個或多個Byte,并為之分配空間(與armasm的DCB類似)。
        .code 設定指令寬度,16表示Thumb,32表示ARM assembly
        (和armasm中的CODE16,CODE32相同)。
        .if
        .else
        .endif
        預編譯宏(與armasm中的IF ELSE ENDIF相同)。
        .end 匯編文件結束標志,常常省略不用。
        .endm 宏結束標志。
        .exitm 宏跳出。
        .macro {} … {,}
        定義一段名為name的宏,arg_xxx為參數。
        必須有對應的.endm結尾。
        可以使用.exitm從中間跳出宏。(與armasm中的MACRO, MEND, MEXIT相同)。
        在使用宏參數時必須這樣使用:“”。
        例如:
        [CODE].macro SHIFTLEFT a, b
        .if b < 0
        MOV a, a, ASR #-b
        .exitm
        .endif
        MOV a, a, LSL #b
        .endm
        .rept 循環執行.endr前的代碼段number_of_times次。
        (與armasm中的WEN相似)
        .irp {,} {,} …
        循環執行.endr前的代碼段,param依次取后面給出的值。
        在循環執行的代碼段中必須以“ ”表示參數。
        .endr 結束循環(與armasm中的WEND相似).
        .equ , 為一個標號賦值,類似C中的#define。(與armasm中的EQU相同)
        .err 編譯錯誤報告,將引起編譯的終止。
        .global 全局聲明標志,這樣聲明的標號將可以被外部使用。(與armasm中的EXPORT相同)。
        .hword {,} …
        插入一個16-bit的數據隊列。(與armasm中的DCW相同)
        .ifdef 如果 被定義,該快代碼將被編譯。以 .endif結束。
        .ifndef 如果 未被定義,該快代碼將被編譯。以 .endif結束。
        .include “” 包含文件。(與armasm中的INCLUDE 或者C中的#i nclude一樣)
        .req
        定義一個寄存器,.req的左邊是定義的寄存器名,右邊是使用的真正使用的寄存器。
        (與armasm中的RN類似)
        例如:acc .req r0
        [CODE].section {,””}
        開始一個新的代碼或數據段。.text, 代碼段;.data, 初始化數據段;.bss, 未初始化數據段。
        這些段都有缺省的標志(flags),聯接器可以識別這些標志。(與armasm中的AREA相同)。
        下面是ELF格式允許的段標志
        <標志> 含義
        a 允許段
        w 可寫段
        x 執行段
        .set , 變量賦值。(與armasm中的SETA相同)
        .space {,}
        分配number_of_bytes字節的數據空間,并填充其值為fill_byte,若未指定該值,缺省填充0。
        (與armasm中的SPACE功能相同)
        .word {,} …
        插入一個32-bit的數據隊列。(與armasm中的DCD功能相同)
        GNU ARM匯編特殊字符和語法
        代碼行中的注釋符號: ‘@’
        整行注釋符號: ‘#’
        語句分離符號: ‘;’
        直接操作數前綴: ‘#’ 或 ‘$’
        .arm 以arm格式編譯,同code32
        .thumb 以thumb格式編譯,同code16
        .code16 以thumb格式編譯
        .code32 以arm格式編譯
        參考資料:
        文件: assembler-intro.pdf
        文件: GNU-ARM-Assy-Quick-Ref.pdf


        關鍵詞: GNUARM匯編入

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宁远县| 盈江县| 民和| 浑源县| 滦平县| 宜兴市| 信丰县| 呈贡县| 淮滨县| 宕昌县| 都昌县| 博爱县| 东乡族自治县| 普格县| 安平县| 南通市| 大洼县| 绥滨县| 苏尼特右旗| 常州市| 广平县| 榆中县| 牟定县| 清远市| 康平县| 萨迦县| 长沙市| 依安县| 亚东县| 西乌珠穆沁旗| 乌拉特中旗| 吴旗县| 桂东县| 临城县| 年辖:市辖区| 韶关市| 清水河县| 陵川县| 二连浩特市| 乡城县| 周至县|