https://www.cnblogs.com/liulipeng/archive/2013/09/12/3316576.html
ARM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令組成. ARM匯編語言的設計基礎是匯編偽指令,匯編偽操作和宏指令。 偽操作,是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種准備工作, 在源程序運行匯編程序時處理,而在計算機運行期間沒有有機器執行.也就是說,這些偽操作只是匯編過程中起作用, 一旦匯編結束,偽操作的使命也就隨之消失. 宏指令,是一段獨立的程序代碼,可以插在程序中,它通過偽操作來定義。 1>宏在被使用之前必須提前定義好,宏之間可以互相調用,也可自己遞歸調用。 2>通過直接書寫宏名來使用宏.並本具宏指令的格式輸入輸出參數. 3>宏定義本身不產生代碼,只是在調用它時把宏體插入到原程序中. 4>宏與C語言中的子函數形參和實參的調用相似,調用宏時通過實際的指令來代替宏體,實現相關的一段代碼,但宏的調用與子程序的調用有本質的區別,即宏並不會節省程序的空間,其優點是簡化程序代碼,提高程序的可讀性以及宏內容可以同步改. 偽操作,宏指令一般與編譯程序有關,因此ARM匯編語言的偽操作,宏指令在不同的編譯環境下有不同的編寫形式和規則. 偽指令也是ARM匯編語言程序里的特殊助記符,也不在處理器運行期間由機器執行,他們在匯編時將被合適的機器指令代替成ARM或Thumb指令,從而實現真正的指令操作. 目前常用的ARM編譯環境有2種: 1>ADS/SDT IDE:ARM公司開發,使用了CodeWarrior公司的編譯器. 2>集成了GNU開發工具的IDE開發環境;它由GNU的匯編器as,交叉匯編器gcc和連接器id組成. ADS編譯環境下的ARM偽操作和宏指令,可參考北航出版社的<<ARM微控制器基礎與實踐》(周立功)這里主要講述ARM GNU常用匯編語言。 4.1 ARM GNU常用匯編偽指令介紹 1.abort .abort: 停止匯編 .align absexpr1,absexpr2: 以某種對齊方式,在未使用的存儲區域填充值. 第一個值表示對齊方式,4, 8,16或32. 第二個表達式值表示填充的值. 2.if...else...endif .if .else .endif: 支持條件預編譯 3.include .include "file": 包含指定的頭文件, 可以把一個匯編常量定義放在頭文件中. 4.comm .comm symbol, length:在bss段申請一段命名空間,該段空間的名稱叫symbol, 長度為length. Ld連接器在連接會 為它留出空間. 5.data .data subsection: 說明接下來的定義歸屬於subsection數據段. 6.equ .equ symbol, expression: 把某一個符號(symbol)定義成某一個值(expression).該指令並不分配空間. 7.global .global symbol: 定義一個全局符號, 通常是為ld使用. 8.ascii .ascii "string": 定義一個字符串並為之分配空間. 9.byte .byte expressions: 定義一個字節, 並為之分配空間. 10.short .short expressions: 定義一個短整型, 並為之分配空間. 11.int .int expressions: 定義一個整型,並為之分配空間. 12.long .long expressions: 定義一個長整型, 並為之分配空間. 13.word .word expressions: 定義一個字,並為之分配空間, 4bytes. 14.macro/endm .macro: 定義一段宏代碼, .macro表示代碼的開始, .endm表示代碼的結束. 15.req name .req register name: 為寄存器定義一個別名. 16.code .code [16|32]: 指定指令代碼產生的長度, 16表示Thumb指令, 32表示ARM指令. 17.ltorg .ltorg: 表示當前往下的定義在歸於當前段,並為之分配空間. 4.2 ARM GNU專有符號 1.@ 表示注釋從當前位置到行尾的字符. 2.# 注釋掉一整行. 3.; 新行分隔符. 4.3 操作碼 1. NOP nop 空操作, 相當於MOV r0, r0 2.LDR ldr <register> , = <expression> 相當於PC寄存器或其它寄存器的長轉移. 3.ADR adr <register> <label> 相於PC寄存器或其它寄存器的小范圍轉移. 4.ADRL adrl <register> <label> 相於PC寄存器或其寄存器的中范圍轉移. 5.可執行生成說明 5.1 lds文件說明 5.1.1 主要符號說明 1. OUTPUT_FORMAT(bfdname) 指定輸出可執行文件格式. 2. OUTPUT_ARCH(bfdname) 指定輸出可執行文件所運行CPU平台 3. ENTRY(symbol) 指定可執行文件的入口段 5.1.2 段定義說明 1. 段定義格式 SECTIONS { ... 段名 : { 內容 } ... }
http://zqwt.012.blog.163.com/blog/static/120446842010445441611/