下面列舉了幾個ARM匯編程序的簡單實例,給出了詳細(xì)的說明;分別給出了完成同一功能的程序在ADS編譯環(huán)境和GNU編譯環(huán)境下的不同形式,并在最后列出了由ADS環(huán)境向GNU環(huán)境下轉(zhuǎn)變時所需要的替換。請注意它們的不同之處。
示例 簡單的ARM指令程序。
在ADS編譯環(huán)境下,程序如下:
AREA ARMex,CODE,READONLY;設(shè)置本段程序的名稱及屬性,代碼段的名稱為ARMex
ENTRY ;標(biāo)記要執(zhí)行的第一條指令
Start MOV R0,#10 ;設(shè)置參數(shù)
MOV R1,R3
ADD R0,R0,R1 ;R0=R0+R1
Stop MOV R0,#&18 ;軟中斷參數(shù)設(shè)置
LDR R1,=&20026 ;軟中斷參數(shù)設(shè)置
SWI 0x123456 ;將CPU的控制權(quán)交給調(diào)試器
END ;文件的結(jié)束標(biāo)志
行1:AREA指示符定義本程序段為代碼段,名字是ARMex,屬性為只讀。通常一個匯編程序可包括多個段,如代碼段、可讀/寫的數(shù)據(jù)段等。代碼段中也可定義數(shù)據(jù)。該行中的信息將供鏈接器使用。
行2:ENTRY指示符標(biāo)記程序中被執(zhí)行的第一條指令,即標(biāo)志入口地址。在一個ARM程序中可以有多個ENTRY,但至少要有一個ENTRY。
行3:start是一個標(biāo)號,表示代碼的開始,其值是一個地址。其后是ARM指令,利用MOV指令將立即數(shù)10賦給寄存器R0.
行4:利用MOV指令將立即數(shù)3賦給寄存器R1.
行5:計算R0=R0+R1.
行6~行8:這三條指令將系統(tǒng)控制權(quán)**給調(diào)試器,結(jié)束程序運行。此處是通過向Angel發(fā)送一個軟中斷實現(xiàn)的。Angel的軟中斷號是0x123456,實現(xiàn)該功能的中斷參數(shù)是R0=0x18,R1=0x20026.
行9:END指示符指示匯編器結(jié)束對該源程序的處理,所以每個匯編程序都必須包含一個END行。
GNU編譯環(huán)境下(基于Embest IDE環(huán)境開發(fā)環(huán)境),該程序如下:
.global_start
.text /*標(biāo)志代碼段*/
_start MOV R0,#10 /*設(shè)置參數(shù)*/
MOV R1,#3
ADD R0,R0,R1 /*R0=R0+R1*/
.stop MOV R0,#0x18
LDR R1,=0x20026
SWI 0x123456
.END /*文件的結(jié)束標(biāo)志*/