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