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