ARM匯編語言的語法知識_第1頁
ARM匯編語言的語法知識_第2頁
ARM匯編語言的語法知識_第3頁
ARM匯編語言的語法知識_第4頁
ARM匯編語言的語法知識_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 ARM匯編語言的語法知識 ARM匯編語言語句格式 ARM匯編語言的語句格式:symbolinstruction|directive|pseudo-instructioncomment其中:instruction為指令。在ARM匯編語言中,指令不能從一行的行頭開始.在一行語句中,指令的前面必須有空格或符號. directive為偽操作。 pseudo-instruction為偽指令。 symbol為符號。 在ARM匯編語言中,符號必須從一行的行頭開始,并且符號中不能包含空格,在指令和偽指令中符號用作地址標(biāo)號,在有些偽操作中,符號用作變量或者常量.comment為語句的注釋.在 ARM 匯編語言

2、中注釋以分號”;”開頭.注釋的結(jié)尾即為一行的結(jié)尾,注釋也可以單獨(dú)占用一行.5.1.ARM匯編語言的偽操作 、宏指令和偽指令 ARM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成. 偽操作是ARM匯編語言程序里的一些特殊指令助記符,其作用主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序進(jìn)行匯編時(shí)由匯編程序處理,而不是在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行.也就是說,這些偽操作只在匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命也就隨之結(jié)束. 5.1.ARM匯編語言的偽操作 、宏指令和偽指令 ARM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成. 宏指令是一段獨(dú)立的程序代碼,可插在源程序中,它

3、通過偽操作來定義.宏在被使用前必須提前定義好,宏之間可互相調(diào)用,也可自己遞歸調(diào)用.通過直接書寫宏名來使用宏,并根據(jù)宏指令的格式設(shè)置相應(yīng)的輸入?yún)?shù).這與C語言中子函數(shù)形參與實(shí)參的傳遞很相似. 5.1.ARM匯編語言的偽操作 、宏指令和偽指令 ARM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成. 偽指令也是ARM匯編語言程序里的一些特殊指令助記符,它們不是真正的ARM指令或Thumb指令,也不在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行,而是在源程序進(jìn)行匯編時(shí)被替換成相應(yīng)的ARM指令或Thumb指令序列,從而實(shí)現(xiàn)真正的指令操作. 5.1.ARM匯編語言的偽操作 、宏指令和偽指令 ARM匯編語言源程序中

4、語句一般由指令、偽操作、宏指令和偽指令組成. 偽操作和宏指令一般與編譯程序有關(guān),在不同的編譯環(huán)境下有不同的編寫形式和語法規(guī)則.常見的ARM編譯開發(fā)環(huán)境有2種: ARM公司開發(fā)的ADS/SDT IDE開發(fā)環(huán)境 集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境 ARM匯編語言偽指令 ARM偽指令 ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時(shí)這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別為ADR偽指令、ADRL偽指令、LDR偽指令、NOP偽指令。 ARM偽指令小范圍的地址讀取 ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移

5、的地址值讀取到寄存器中。在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實(shí)現(xiàn)該ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。ADRcond register,exprADR偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器地址表達(dá)式 地址表達(dá)式expr的取值范圍:當(dāng)?shù)刂分挡皇亲謱R時(shí),其取值范圍為-255255字節(jié);當(dāng)?shù)刂分凳亲謱R時(shí),其取值范圍為-10201020字節(jié);當(dāng)?shù)刂分凳?6字節(jié)對齊時(shí),其取值范圍將更大;該地址必須與ADR偽指令在同一個(gè)代碼段中。 ARM偽指令中等范圍的地址讀取 ADRL偽指令將基于PC相對偏移的

6、地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址 。在匯編編譯器編譯源程序時(shí),ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。ADRLcond register,exprADRL偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器地址表達(dá)式 地址表達(dá)式expr的取值范圍:當(dāng)?shù)刂分挡皇亲謱R時(shí),其取值范圍為-64K64K;當(dāng)?shù)刂分凳亲謱R時(shí),其取值范圍為-256K256K;當(dāng)?shù)刂分凳?6字節(jié)對齊時(shí),其取值范圍將更大;該地址必須與ADRL偽指令在同一個(gè)代碼段中 。 ARM偽指令大范圍的地址讀取 LDR偽指令用于加載32位的立即數(shù)或

7、一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池(即數(shù)據(jù)緩沖區(qū)),并使用一條基于PC相對偏移的LDR指令從文字池讀出該常量。LDRcond register,=exprLDR偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器基于PC的地址表達(dá)式或外部表達(dá)式 ARM偽指令大范圍的地址讀取 LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MO

8、V或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條基于PC相對偏移的LDR指令從文字池讀出常量。應(yīng)用示例(源程序): . LDR R1,=InitStack .InitStack MOV R0, LR .使用偽指令將程序標(biāo)號InitStack的地址存入R1 ARM偽指令大范圍的地址讀取 LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條基于PC相對偏移的LDR指令從文字池讀出常量。

9、應(yīng)用示例(源程序):編譯后的反匯編代碼: . LDR R1,=InitStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x84 MOV R0, LR .0 xb4 DCD 0 x84使用偽指令將程序標(biāo)號InitStack的地址存入R1地址程序代碼 ARM偽指令大范圍的地址讀取 LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條基于PC相對偏移的LD

10、R指令從文字池讀出常量。應(yīng)用示例(源程序):編譯后的反匯編代碼: . LDR R1,=InitStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x84 MOV R0, LR .0 xb4 DCD 0 x84使用偽指令將程序標(biāo)號InitStack的地址存入R1LDR偽指令被匯編成一條LDR指令,并在文字池中定義了一個(gè)常量,該常量為InitStack標(biāo)號的地址 ARM偽指令大范圍的地址讀取 LDR偽指令用于加載32位的立即數(shù)或一個(gè)地址值到指定寄存器。在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN

11、的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條基于PC相對偏移的LDR指令從文字池讀出常量。注意:1.從指令位置到文字池的偏移量必須小于4KB;2.與ARM指令的LDR相比,偽指令的LDR的參數(shù)有“=”號。 ARM偽指令空操作偽指令 NOP偽指令在匯編時(shí)將會(huì)被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延時(shí)操作。NOPNOP偽指令格式應(yīng)用示例(延時(shí)子程序):Delay NOP; ;空操作空操作 NOP NOP SUBS R1,R1,#1; ;循環(huán)次數(shù)減一循環(huán)次數(shù)減一 BNE Delay ; ;如果循環(huán)沒有結(jié)束,跳轉(zhuǎn)如果

12、循環(huán)沒有結(jié)束,跳轉(zhuǎn)DelayDelay繼續(xù)繼續(xù) MOV PC,LR ; ;子程序返回子程序返回 ADS編譯環(huán)境下的ARM偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作有如下幾種:1、符號定義偽操作 4、框架描述偽操作2、數(shù)據(jù)定義偽操作、信息報(bào)告?zhèn)尾僮?、匯編控制偽操作、其他偽操作 ARM匯編語言偽操作-符號定義偽操作全局變量聲明GBLA 聲明一個(gè)全局算術(shù)變量,并將其初始化為0GBLL 聲明一個(gè)全局邏輯變量,并將其初始化為FALSEGBLS 聲明一個(gè)全局字符串,并將其初始化為NULL使用示例使用示例: :GBLA num1GBLL logic_xGBLS string_y符號定義偽操作用于定義ARM匯編

13、程序中的變量,對變量進(jìn)行賦值以及定義寄存器名稱 ARM匯編語言偽指令-符號定義偽操作局部變量聲明LCLA 聲明一個(gè)局部算術(shù)變量,并將其初始化為0LCLL 聲明一個(gè)局部邏輯變量,并將其初始化為FALSELCLS 聲明一個(gè)局部字符串,并將其初始化為NULL使用示例使用示例: :LCLA num1LCLL logic_xLCLS string_y注意:局部變量只能在宏中進(jìn)行聲明和使用. ARM匯編語言偽指令-符號定義偽操作變量賦值SETA 給一個(gè)全局或局部算術(shù)變量賦值SETL 給一個(gè)全局或局部邏輯變量賦值SETS 給一個(gè)全局或局部字符串變量賦值使用示例使用示例: :num1 SETA 0 xfflo

14、gic_x SETL TRUEstring_y SETS “stringtest”注意:在向變量賦值前,必須先聲明該變量 ARM匯編語言偽指令-符號定義偽操作RLIST 為通用寄存器列表定義名稱,定義的名稱可以在LDM/STM指令中使用.列表中的寄存器以逗號分隔,連續(xù)編號的寄存器可以用”-”包括,例如:R7-R9表示寄存器R7、R8、R9使用示例使用示例: :Reg_list RLIST R0-R4,R6,R7-R9STMFD SP! Reg_list ;將R0-R4,R6,R7-R9的內(nèi) ;容壓入滿降序棧中保存 ARM匯編語言偽指令-符號定義偽操作RN 為寄存器定義名稱使用示例使用示例: :

15、SP RN R13 ;將R13的名稱定義為SP ARM匯編語言偽指令-符號定義偽操作CN、CP CN為協(xié)處理器的寄存器定義名稱 CP為協(xié)處理器定義名稱使用示例使用示例: :power CN 6 ;將協(xié)處理器寄存器6的名稱定義為powerdmu CP 6 ;將協(xié)處理器6的名稱定義為dmu ARM匯編語言偽指令-符號定義偽操作DN、SN 、FN DN為一個(gè)雙精度的VFP寄存器定義名稱 SN為一個(gè)單精度的VFP寄存器定義名稱 FN為一個(gè)FPA浮點(diǎn)寄存器定義名稱使用示例使用示例: :height DN 6;將VFP雙精度寄存器6名稱定義為height width SN 16 ;將VFP單精度寄存器16

16、名稱定義為widthlower FN 6 ;將浮點(diǎn)寄存器6名稱定義為lower ARM匯編語言偽指令-數(shù)據(jù)定義偽操作LTORG偽操作用于數(shù)據(jù)緩沖池(也稱為文字池)的開始在使用偽指令LDR時(shí),常常需要在適當(dāng)?shù)牡胤郊尤隠TORG聲明數(shù)據(jù)緩沖池,LDR加載的數(shù)據(jù)暫時(shí)放于數(shù)據(jù)緩沖池LTORG偽操作通常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會(huì)錯(cuò)誤地將數(shù)據(jù)池中的數(shù)據(jù)當(dāng)做指令來執(zhí)行用LTORG偽指令定義數(shù)據(jù)緩沖池舉例Funel ;子程序LDR R1, =0 x8000;將0 x8000加載到R1MOV PC, LR LTORG ;定義數(shù)據(jù)緩沖池,存放0 x8000Data SPACE

17、 40 ;從當(dāng)前位置開始分配40字節(jié)的內(nèi)存 ;單元,并初始化為0 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作MAPMAP用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址此時(shí),內(nèi)存表的位置計(jì)數(shù)器設(shè)置成該地址值.該偽操作可以用”代替.MAP偽操作舉例MAP fun ;fun就是內(nèi)存表的首地址MAP 0 x100 ,R9 ;內(nèi)存表的首地址為R9 0 x100 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作FIELDFIELD用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域MAP偽操作和FIELD偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表結(jié)構(gòu) MAP偽操作定義內(nèi)存表的首地址, FIELD偽操作定義內(nèi)存表中各數(shù)據(jù)域的字節(jié)長度,并可為每一個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)

18、號,其他指令可引用該標(biāo)號該偽操作可以用”#”代替.題目:定義一個(gè)內(nèi)存表,其首地址為固定地址8192,該內(nèi)存表中包含個(gè)數(shù)據(jù)域:consta長度為4字節(jié),constb長度為4字節(jié),x長度為8字節(jié),y長度為8字節(jié),string長度為16字節(jié) MAP 8192 consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 16 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作SPACE SPACE偽操作常常用來分配一塊連續(xù)的內(nèi)存區(qū)域供程序使用,并且將這個(gè)內(nèi)存區(qū)域初始化為0,該偽操作可以用”%”代替.使用示例使用示例: :dataroom SPACE

19、256 ;以dataroom為起始地址,分配 256 ;字節(jié)的內(nèi)存單元,并初始化為0 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作DCB DCB用于定義并初始化1字節(jié)或多字節(jié)的內(nèi)存區(qū)域.該偽操作可以用”=”代替.使用示例使用示例: :data1 DCB 1,3,5string DCB “hello!”,() ;構(gòu)造一個(gè)以NULL結(jié)尾的字符串,字 ;符串的起始地址為string ARM匯編語言偽指令-數(shù)據(jù)定義偽指令DCD、DCDU DCD和DCDU用于定義并初始化一個(gè)或多個(gè)字的內(nèi)存區(qū)域,其中DCD可以用”&”代替.DCD和DCDU的區(qū)別在于DCD可以保證分配的內(nèi)存單元是嚴(yán)格的字對齊的,而DCDU

20、不能保證.使用示例使用示例: :data1 DCD 0,2,4,6 ;其中0,2,4,6按字存儲data2 DCDU 1,3,5 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作DCDO DCDO用于定義并初始化一個(gè)或多個(gè)字的內(nèi)存區(qū)域,且保證分配的內(nèi)存單元是字對齊的. label DCDO expr,expr DCDO與DCD的區(qū)別在于DCDO將字單元初始化為expr相對于靜態(tài)基址寄存器R9(SB)的偏移量.使用示例使用示例: :IMPORT externlabeldata1 DCDO externlabel ;將地址為data1的字單元初 ;始化為標(biāo)號externlabel相對于R9的偏移量 ARM匯編

21、語言偽指令-數(shù)據(jù)定義偽操作DCFD,DCFDU,DCFS,DCFSU DCFD用于為雙精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元,每個(gè)雙精度浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元. DCFDU與DCFD的不同之處在于DCFDU分配的內(nèi)存單元不能保證是嚴(yán)格對齊的. DCFS用于為單精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元,每個(gè)單精度浮點(diǎn)數(shù)占據(jù)1個(gè)字單元. DCFSU與DCFS的不同之處在于DCFSU分配的內(nèi)存單元不能保證是嚴(yán)格字對齊的. ARM匯編語言偽指令-數(shù)據(jù)定義偽操作DCI DCI用于分配并初始化一段內(nèi)存單元,且認(rèn)為內(nèi)存單元中的數(shù)值為指令數(shù)據(jù)當(dāng)DCI位于ARM代碼中的時(shí)候,分配的內(nèi)存是嚴(yán)格字對齊的,當(dāng)DCI位于Thumb代碼

22、中的時(shí)候,分配的內(nèi)存是半字對齊的注意:DCI偽操作和DCD偽操作非常類似,不同之處在于,DCI分配的內(nèi)存中數(shù)據(jù)被標(biāo)識為指令,可用于通過宏指令來定義處理器指令系統(tǒng)不支持的指令 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作DCQ,DCQU DCQ用于分配一段以雙字(字節(jié))為單位的內(nèi)存,分配的內(nèi)存要求必須字對齊,并用偽操作中的64位的整數(shù)數(shù)據(jù)初始化DCQU與DCQ的不同之處在于,DCQU分配的內(nèi)存單元并不嚴(yán)格字對齊 ARM匯編語言偽指令-數(shù)據(jù)定義偽操作DCW,DCWU DCW用于分配一段半字對齊的半字內(nèi)存單元,并用偽操作中的expr初始化DCWU與DCW的不同之處在于,DCWU分配的內(nèi)存單元并不嚴(yán)格半字對齊

23、 ARM匯編語言偽指令-匯編控制偽操作IF、ELSE、ENDIF IF,ELSE及ENDIF偽操作能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi),或者將其排除在程序之外它與語言中的if語句的功能很相似語法格式如下:IF conditionInstruction or derectivesELSEInstruction or derectivesENDIF注意:condition表示控制條件,可以是邏輯表達(dá)式或標(biāo)識符Instruction or derectives 表示一組語句,可以是代碼指令或偽指令注意: IF,ELSE及ENDIF可以嵌套使用 ARM匯編語言偽指令-匯編控制偽操作WHILE及

24、WEND WHILE及WEND偽操作能夠根據(jù)條件重復(fù)匯編相同的一段源代碼,它與語言中的while語句很相似只要滿足條件,就將重復(fù)匯編語法格式中的指令或偽指令注意: WHILE及WEND可以嵌套使用 ARM匯編語言偽指令-匯編控制偽操作MACRO、MEND及MEXIT MACRO偽操作標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束MEXIT用于從宏中跳轉(zhuǎn)出去用MACRO和MEND定義的一段代碼,稱為宏定義體,這樣在程序中就可通過宏名多次調(diào)用該代碼段來完成相應(yīng)的功能 MACRO$label macroname $parameter ;宏代碼 MEND局部變量定義舉例 MACRO;聲明一個(gè)宏 $ lab

25、el message $ a ;宏的原型,宏的名稱為 ;message,有一個(gè)參數(shù)$ a LCLS string ;聲明一個(gè)局部串變量string String SETS “error” ;向該變量賦值 $ label ;代碼 INFO 0,”string”:CC: : STR: $ a ;使用該串變量 MEND ;宏定義結(jié)束 ARM匯編語言偽指令-信息報(bào)告?zhèn)尾僮餍畔?bào)告?zhèn)尾僮饔糜趨R編報(bào)告指示 ASSERTASSERT為斷言錯(cuò)誤偽操作,在匯編編譯器對匯編程序的第遍掃描中,如果ASSERT中的條件不成立,則ASSERT偽操作將報(bào)告該錯(cuò)誤信息ASSERT偽操作用于保證源程序被匯編時(shí)滿足相關(guān)的條件如

26、果條件不滿足,則ASSERT偽操作報(bào)告錯(cuò)誤類型,并終止匯編 ARM匯編語言偽指令-信息報(bào)告?zhèn)尾僮鱅NFO匯編診斷信息顯示偽操作在匯編處理過程的第遍掃描或者第遍掃描時(shí),INFO偽操作報(bào)告診斷信息INFO偽操作用于顯示用戶自定義的錯(cuò)誤信息 INFO 數(shù)字表達(dá)式,字符串表達(dá)式(即診斷信息) 若 數(shù)字表達(dá)式=0,第遍掃描時(shí),打印字符串. 若數(shù)字表達(dá)式0,第1遍掃描時(shí),打印字符串,終止匯編.OPT設(shè)置列表選項(xiàng)偽操作,通過OPT偽操作可在源程序中設(shè)置列表選項(xiàng) ARM匯編語言偽指令-信息報(bào)告?zhèn)尾僮鱐TL及SUBTTTL偽操作在列表文件每一頁的開頭插入一個(gè)標(biāo)題該TTL偽操作將作用于其后的每一頁,直到遇到新的T

27、TL偽操作SUBT偽操作在列表文件每一頁的開頭插入一個(gè)子標(biāo)題,該SUBT偽操作將作用于其后的每一頁,直到遇到新的SUBT偽操作TTL偽操作在列表文件的頁頂部顯示一個(gè)標(biāo)題SUBT偽操作在列表文件頁標(biāo)題的下面顯示一個(gè)子標(biāo)題如果要在列表文件的第一頁顯示標(biāo)題或子標(biāo)題,TTL偽操作或SUBT偽操作要放在源程序的第行當(dāng)使用TTL或SUBT偽操作改變頁標(biāo)題時(shí),新的標(biāo)題將在下一頁開始起作用TTL Title;在列表文件的第一頁及后面的各頁顯示標(biāo)題在列表文件的第一頁及后面的各頁顯示標(biāo)題SUBT Subtitle;在列表文件的第一頁及后面的各頁顯示;在列表文件的第一頁及后面的各頁顯示 ;子標(biāo)題子標(biāo)題 ARM匯編語

28、言偽指令-其他偽操作CODE16及CODE32 CODE16偽操作告訴匯編編譯器后面的指令序列為16位的Thumb指令; CODE32偽操作告訴匯編編譯器后面的指令序列為32位的ARM指令注意:只是告訴編譯器后面指令的類型,該偽操作本身并不進(jìn)行程序狀態(tài)的切換 ARM匯編語言偽指令-其他偽操作EQU 為數(shù)字常量或標(biāo)號定義一個(gè)字符名稱,該偽指令可以用”*”代替.使用示例使用示例: :num EQU 2 ;數(shù)字常量num的值為2label_a EQU 0 x20 ;表示標(biāo)號label_a的地址為0 x20 ARM匯編語言偽指令-其他偽操作AREA 用于定義一個(gè)代碼段或數(shù)據(jù)段,一個(gè)匯編程序至少包含一個(gè)

29、代碼段使用示例使用示例: :AREA Example,CODE,READONLY定義了一個(gè)代碼段,代碼段的名稱為Example,屬性為READONLY ARM匯編語言偽指令-其他偽操作ENTRY 用于指定程序的入口點(diǎn)一個(gè)程序可含多個(gè)源文件,而一個(gè)源文件中最多只能有一個(gè)ENTRY(也可以沒有),所以一個(gè)程序可有多個(gè)ENTRY ,但至少要有一個(gè)ENTRYENDEND偽操作告訴編譯器已經(jīng)到了源程序結(jié)尾每一個(gè)匯編源程序都包含END偽操作,表示本源程序的結(jié)束 ARM匯編語言偽指令-其他偽操作ALIGN ALIGN偽操作通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式. ALIGN expr ,offset

30、為指定對齊方式,可能的取值為的次冪,如1,2,4,8如果沒有指定,則默認(rèn)當(dāng)前位置對齊到下一個(gè)字邊界處不指定表示將當(dāng)前位置對齊到以expr為單位的起始位置 ARM匯編語言偽指令-其他偽操作ALIGN ALIGN偽操作通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式.例如:ALIGN 8 表示將當(dāng)前位置以個(gè)字的方式對齊,ALIGN 4, 3 當(dāng)原始位置在0 x0001(字節(jié)),使用 ALIGN 4, 3以后,當(dāng)前位置會(huì)轉(zhuǎn)到 0 x0007(0 x0004+3) ARM匯編語言偽指令-其他偽操作EXPORT及GLOBAL EXPORT聲明一個(gè)符號可被其他文件引用,相當(dāng)于聲明了一個(gè)全局變量GLOBAL 是

31、EXPORT的同義詞注意:聲明的符號名稱是區(qū)分大小寫的 ARM匯編語言偽指令-其他偽操作IMPORTIMPORT偽操作告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號,而且不論本源文件是否實(shí)際引用該符號,該符號都將被加入到本源文件的符號表中IMPORT symbol WEAK指定這個(gè)選項(xiàng)后,如果symbol在所有源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來的庫中去查找該符號Symbol為聲明的符號名稱,它是區(qū)分大小寫的 ARM匯編語言偽指令-其他偽操作EXTERNEXTERN偽操作告訴編譯器當(dāng)

32、前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號,與IMPORT不同之處在于,如果本源文件沒有實(shí)際引用該符號,該符號將不會(huì)被加入到本源文件的符號表中EXTERN symbol WEAK指定這個(gè)選項(xiàng)后,如果symbol在所有源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來的庫中去查找該符號Symbol為聲明的符號名稱,它是區(qū)分大小寫的 ARM匯編語言偽指令-其他偽操作GET及INCLUDE GET偽操作將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理,INCLUDE是同義GET file

33、name ;其中filename為被包含的源文件的名稱, ;這里可使用路徑信息 ARM匯編語言偽指令-其他偽操作INCBIN INCBIN偽操作將一個(gè)文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理通常可使用INCBIN將一個(gè)可執(zhí)行文件或者任意的數(shù)據(jù)包含到當(dāng)前文件中被包含的執(zhí)行文件或數(shù)據(jù)將被原封不動(dòng)地放到當(dāng)前文件中,編譯器從INCBIN偽操作后面開始繼續(xù)處理INCBIN filename ;其中filename為被包含的文件名 ;稱,這里可使用路徑信息 INCBIN file1.datINCBIN c:windowsfile2.txt注意:這里所包含的文件名稱及其路徑信息中都不能有空格 AR

34、M匯編語言偽指令-其他偽操作KEEP KEEP偽操作告訴編譯器將局部符號包含在目標(biāo)文件中符號表中可使調(diào)試工作更加方便語法格式如下:KEEP symbol ;其中symbol為要保留的局部標(biāo)號,如果沒有指定symbol,則除了基于寄存器外的所有符號將被包含在目標(biāo)文件的符號表中l(wèi)abel CMP R0 ,R1KEEP label ;將標(biāo)號label包含到目標(biāo)文件;的符號表中 ARM匯編語言偽指令-其他偽操作NOFP 使用NOFP偽操作禁止源程序中包含浮點(diǎn)運(yùn)算指令當(dāng)系統(tǒng)中沒有硬件或軟件仿真代碼支持浮點(diǎn)運(yùn)算指令時(shí),使用NOFP偽操作禁止在源程序中使用浮點(diǎn)運(yùn)算指令這時(shí)如果源程序中包含浮點(diǎn)運(yùn)算指令,或者在

35、浮點(diǎn)運(yùn)算指令的后面使用NOFP偽操作,編譯器將會(huì)報(bào)告錯(cuò)誤 ARM匯編語言偽指令-其他偽操作REQUIRE REQUIRE偽操作用于指定段之間的相互依賴關(guān)系格式如下:REQUIRE label ;其中l(wèi)abel為所需要的標(biāo)號的名稱當(dāng)進(jìn)行連接處理包含有“REQUIRE label”偽操作的源文件時(shí),定義label的源文件也將被包含 ARM匯編語言偽指令-其他偽操作REQUIRE8及PRESERVE8 REQUIRE8偽操作指示當(dāng)前代碼中要求數(shù)據(jù)棧字節(jié)對齊PRESERVE8偽操作表示當(dāng)前代碼中數(shù)據(jù)棧是字節(jié)對齊的使用說明:LDRD及STRD指令要求內(nèi)存單元地址是字節(jié)對齊的當(dāng)在程序中使用這些指令在數(shù)據(jù)棧

36、中傳送數(shù)據(jù)時(shí),要求該數(shù)據(jù)棧是字節(jié)對齊的,這時(shí)就需要用REQUIRE8偽操作來說明鏈接器要保證要求字節(jié)對齊的數(shù)據(jù)棧代碼只能被數(shù)據(jù)棧是字節(jié)對齊的代碼調(diào)用 ARM匯編語言偽指令-其他偽操作ROUT ROUT偽操作用于定義局部變量的有效范圍語法格式如下:name ROUT ;其中name為所定義的作用范圍的名稱使用說明:當(dāng)沒有使用ROUT偽操作定義局部變量的作用范圍時(shí),局部變量的作用范圍為其所在的段ROUT偽操作作用的范圍為本ROUT 偽操作和下一個(gè)ROUT(指同一個(gè)段中ROUT偽操作)偽操作之間若只有一個(gè)ROUT,則局部標(biāo)號的作用范圍在ROUT與段結(jié)束偽操作(END)之間 ARM匯編語言偽指令-其他

37、偽操作ROUT ROUT偽操作舉例Routine ROUT ;定義局部標(biāo)號的有效范圍,名稱為routine .1 routine ;routine范圍內(nèi)的局部標(biāo)號 . BEQ %2 routine;若條件成立,則跳轉(zhuǎn)到routine范圍內(nèi)的局部標(biāo)號2 . BGE %1 routine ;若條件成立,則跳轉(zhuǎn)到routine范圍內(nèi)的局部標(biāo)號1 .2 routine . ;routine范圍內(nèi)的局部標(biāo)號2 .otherroutine ROUT ;定義新的局部標(biāo)號的有效范圍 GNU編譯環(huán)境下的ARM偽操作與宏指令 針對上述所講的ARM偽操作,對應(yīng)地給出了常用的GNU編譯環(huán)境下的偽操作1、常量編譯控制偽

38、操作2、字符編譯控制偽操作3、匯編程序代碼控制偽操作4、宏編譯控制偽操作5、條件編譯控制偽操作6、反匯編代碼控制偽操作7、其他常用偽操作 GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.byte .byte偽操作用于分配一段字節(jié)內(nèi)存單元(分配的內(nèi)存都是字節(jié)對齊的),并用偽指令中的expr初始化語法格式如下:byte expr ,expr. 其中expr可以為數(shù)字表達(dá)式或程序中的標(biāo)號byte 21,48,89,0 x13,oxFF GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.hword及.short .hword及.short都是作用于分配一段半字內(nèi)存單元(分配的內(nèi)存都是半字對齊的)

39、,并用偽指令中的expr初始化語法格式如下: hword expr ,expr. 其中expr可以為數(shù)字表達(dá)式或程序中的標(biāo)號 hword 21,48,89,0 x1133,ox77FF GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.word、.long及.int .word、 .long 及.int偽操作用于分配一段字內(nèi)存單元(分配的內(nèi)存都是字對齊的),并用偽指令中的expr初始化語法格式如下: word expr ,expr. 其中expr可以為數(shù)字表達(dá)式或程序中的標(biāo)號 word 21, 0 x110033,ox77FF2255. int 17, 0 x77889933. long 1

40、,2,3,4,5,6,7,8 GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.ascii .ascii偽指令用于定義字符串expr(非0結(jié)束符)語法格式如下: ascii expr ,expr. ascii “How are you” /*定義字符串,不是以“0”結(jié)束 */.asciz及.string.asciz和.string偽指令都是用于定義字符串expr(以“/0”結(jié)束).asciz expr ,expr. .asciz“am a student” /*定義字符串,以“0”結(jié)束*/ GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.float及.single .float和.sin

41、gle偽操作用于定義32位IEEE浮點(diǎn)數(shù)expr語法格式如下: float expr ,expr. float 0F3.14,0F359.2E11.double.double偽操作用于定義64位IEEE浮點(diǎn)數(shù)expr.double expr ,expr. .double 0F2E1 GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.fill .fill偽指令用于分配一段字節(jié)內(nèi)存單元語法格式如下: fill repeat ,size (,value) 其中size缺省為, value缺省為 fill 8,4,0 xFFFFFFFF 分配個(gè)字節(jié)的內(nèi)存單元,并將每個(gè)內(nèi)存單元內(nèi)容初始化為0 xFFF

42、FFFFF GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.zero .zero偽操作用于分配一段字節(jié)內(nèi)存單元并用來填充內(nèi)存語法格式如下: zero size fill 400 分配400字節(jié)的內(nèi)存單元,并用0初始化 GNU編譯環(huán)境下的ARM偽指令-常量編譯控制偽操作.space及.skip .space與.skip偽操作用于分配一段內(nèi)存單元用value將內(nèi)存單元初始化若value缺省,則用0初始化內(nèi)存單元,語法格式如下: space size ,value skip size ,value 舉例.space 10 0XFF /*分配10字節(jié)的內(nèi)存單元,并用0XFF初始化*/.skip 2

43、2/*分配22字節(jié)的內(nèi)存單元,并用0初始化*/ GNU編譯環(huán)境下的ARM偽指令-字符編譯控制偽操作.equ及.set .equ和.set偽操作用于為數(shù)字常量,基于寄存器的值和程序中的標(biāo)號定義一個(gè)字符名稱語法格式如下:.equ symbol ,expr .set symbol ,expr 其中:expr為基于寄存器的地址值、程序中的標(biāo)號,32位的地址常量或者32位的常量,symbol為.equ偽指令作為expr定義的字符名稱equ PLLCON ,0 x01D80000 /*對PLL控制器設(shè)置*/equ CLKCON ,0 x01d80004 /*對時(shí)鐘控制器設(shè)置*/ GNU編譯環(huán)境下的ARM偽

44、指令-字符編譯控制偽操作.global及.globl .global和.globl聲明一個(gè)符號可被其他文件引用,相當(dāng)于聲明了一個(gè)全局變量語法格式如下:global symbol其中:symbol為聲明的符號名稱,它是區(qū)分大小寫的.extern .extern偽操作用于聲明一個(gè)符號可被其他文件引用,相當(dāng)于聲明了一個(gè)全局變量 GNU編譯環(huán)境下的ARM偽指令-匯編程序代碼控制偽操作.section .section偽操作用于定義域中包含的段段可以是.text(只讀代碼區(qū)),.data(可讀寫數(shù)據(jù)區(qū))及.bss(為靜態(tài)和全局變量保留的可讀寫的數(shù)據(jù)區(qū))語法格式如下:.section expr. sect

45、ion .bss GNU編譯環(huán)境下的ARM偽指令-匯編程序代碼控制偽操作.text、.data及.bss . text偽操作將操作符開始的代碼編譯到代碼段或代碼段子段. data偽操作將操作符開始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段. bss偽操作用于將變量存放到.bss段或.bss段的子段舉例:.datasrc:.long 1,2,3,4,5,6,7,8,9,0 /*定義了一個(gè)數(shù)據(jù)區(qū),以src為起始地址*/dst:.long 0,0,0,0,0,0,0,0,0,0 /*定義了一個(gè)數(shù)據(jù)區(qū),以dst為起始地址*/ GNU編譯環(huán)境下的ARM偽指令-匯編程序代碼控制偽操作.code 16|32 . cod

46、e偽操作用于選擇當(dāng)前匯編指令的指令集參數(shù)16選擇Thumb指令集,參數(shù)32選擇ARM指令集舉例:.code 32 /*表明下面是ARM指令*/header: ADR R0, start + 1 BX R0.code 16/*表明下面是Thumb指令*/start: MOV R0, #10 MOV R1, #3 BL doadd GNU編譯環(huán)境下的ARM偽指令-匯編程序代碼控制偽操作.end 標(biāo)記匯編文件的結(jié)束行,即標(biāo)號后的代碼不處理.include用于將一個(gè)源文件包含到當(dāng)前源文件中,一般是將該源文件用到的庫文件包含到本源文件中.include “option.a”.include “44b0.

47、h” GNU編譯環(huán)境下的ARM偽指令-匯編程序代碼控制偽操作.align及.balign .align和.balign偽操作用于表示對齊方式,通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式語法格式如下:.align alignment ,fill ,max其中:alignment用于指定對齊方式,可能的取值為的次冪,缺省為fill是填充內(nèi)容,缺省時(shí)用填充max是填充字節(jié)數(shù)最大值,如果填充字節(jié)超過max,就不進(jìn)行對齊 GNU編譯環(huán)境下的ARM偽指令-宏編譯控制偽操作.macro及.endm .macro偽操作標(biāo)識宏定義的開始,.endm標(biāo)識宏定義的結(jié)束,用.macro 和.endm定義一段代碼,稱

48、為宏定義體,這樣在程序中就可通過宏指令多次調(diào)用該代碼段語法格式如下:.macro macronameparameter,parameter. /*代碼段*/.endm其中:macroname為所定義的宏的名稱 parameter為宏指令的參數(shù),宏參數(shù)的定義可使用逗號分隔.exitm用于提前退出宏 GNU編譯環(huán)境下的ARM偽指令-條件編譯控制偽操作.ifdef、.else及.endif .ifdef、.else及.endif偽操作是匯編控制偽操作,當(dāng)滿足某條件時(shí),對一組語句進(jìn)行編譯,當(dāng)條件不滿足時(shí),則編譯另一組語句,其中else可以缺省語法格式如下:.ifdef conditionInstruc

49、tion or derectives.else.endif注意:condition表示控制條件,可以是邏輯表達(dá)式或標(biāo)識符Instruction or derectives 表示一組語句,可以是代碼指令或偽指令 GNU編譯環(huán)境下的ARM偽指令-反匯編代碼控制偽操作.eject 用于在匯編符號列表文件中插入一分頁符.list 用于產(chǎn)生匯編列表(從.list到.nolist ).nolist 偽操作用于表示匯編列表結(jié)束處.title 語法格式為.title “heading”即使用“heading”作為標(biāo)題(位于匯編列表文件中文件名的下一行).sbttl語法格式為.sbttl “heading”即使

50、用“heading”作為子標(biāo)題(位于.title標(biāo)題的下一行) GNU編譯環(huán)境下的ARM偽指令-其他常用偽操作.ltorg .ltorg偽操作用于在當(dāng)前段(一般是.text段)的當(dāng)前地址(字對齊地址)產(chǎn)生一個(gè)文字池.ltorg一般放在跳轉(zhuǎn)指令的后面.語法格式如下:.ltorg使用示例:#exit from DRAM/SDRAM self refresh modeLDR R0,=REFRESHSTR R3,R0MOV PC,LR.ltorg GNU編譯環(huán)境下的ARM偽指令-其他常用偽操作.req .req偽操作為一個(gè)特定的寄存器定義名稱,以方便程序員記憶該寄存器的功能.語法格式如下:.req n

51、ame,expr其中expr為某個(gè)寄存器的編碼,name為本偽指令給寄存器定義的名稱.使用示例:.req COUNT,7 /*定義寄存器7為COUNT*/ GNU編譯環(huán)境下的ARM偽指令-其他常用偽操作.err .err偽操作用于使編譯時(shí)產(chǎn)生錯(cuò)誤報(bào)告.print.print偽操作用于打印信息到標(biāo)準(zhǔn)輸出.例如:.print “Something is broken”.fail格式為.fail expr.fail偽操作用于匯編文件時(shí)產(chǎn)生警告.當(dāng)expr小于500時(shí)產(chǎn)生錯(cuò)誤信息,否則產(chǎn)生警告.ARM匯編程序?qū)嵗?注意:ADS編譯環(huán)境下的匯編代碼與GNU編譯環(huán)境下(Embest IDE內(nèi)部集成GNU的

52、開發(fā)工具)有較多不同點(diǎn),主要是符號及偽操作的不同.注釋行以/* */代替”;”操作數(shù)及運(yùn)算符號替換偽操作符替換操作數(shù)及運(yùn)算符替換如下所示ADS下的操作數(shù)及運(yùn)算符GNU下的操作數(shù)及運(yùn)算符LDR PC, PC,#&18LDR PC, PC,#0 x18LDR PC, PC,#&18LDR PC, PC,#0 x18偽操作數(shù)替換如下所示ADS下的偽操作符GNU下的偽操作符INCLUDE.incldueTCLK2 EQU PB25.equ TCLK2,PB25EXPORT.globalIMPORT.externDCD.longIF:DEF:.ifdefELSE.elseENDIF.en

53、dif:OR:|:SHLRN.reqGBLA.global偽操作數(shù)替換如下所示ADS下的偽操作符GNU下的偽操作符BUSWIDTH SETA 16.equ BUSEIDTH,16MACRO.macroMEND.endmEND.endAREA Word,CODE,READONLY.textAREA Block,DATA,READWRITE.dataCODE32.armCODE16.thumbLTORG.ltorg%.fillEntryEntry:5.2 ARM匯編語言語句格式 ARM匯編中的文件格式: ARM源程序文件可由任意一種文件編輯器來編寫程序代碼,它一般為文件格式。在ARM程序設(shè)計(jì)中,常

54、用的源文件可簡單分為以下幾種,不同種類的文件有不同的后綴名。源程序文件文件名說明匯編程序文件*.S用ARM匯編語言編寫的ARM程序或Thumb程序C程序文件*.C用C語言編寫的程序代碼頭文件*.H為了簡化源程序,把程序中常用到的常量命名,宏定義,數(shù)據(jù)結(jié)構(gòu)定義等單獨(dú)放在一個(gè)文件中,一般稱為頭文件5.2 ARM匯編語言語句格式 ARM匯編語言語句格式:symbolinstruction|directive|pseudo-instruction;comment為符號。 在ARM匯編語言中,符號必須從一行的行頭開始,并且符號中不能包含空格,在指令和偽指令中符號用作地址標(biāo)號,在有些偽操作中,符號用作變量

55、或者常量.為指令。在ARM匯編語言中,指令不能從一行的行頭開始.在一行語句中,指令的前面必須有空格或符號.為偽操作偽指令為語句的注釋.在ARM匯編語言中注釋以分號”;”開頭.注釋的結(jié)尾即為一行的結(jié)尾,注釋也可以單獨(dú)占用一行.5.2 ARM匯編語言語句格式 ARM匯編語言的語句格式:注意: 在ARM 匯編語言中,各個(gè)指令、偽指令及偽操作的助記符可全部用大寫字母,也可全部用小寫字母,但不能在一個(gè)助記符中既有大寫字母又有小寫字母. 源程序中,在語句之間適當(dāng)?shù)夭迦肟招?可提高源代碼的可讀性. 如果一條語句很長,為了提高可讀性,可使用”將該長語句分成若干行來寫,在”之后不能再有其他字符,包括空格和制表符

56、.5.2 ARM匯編語言語句格式 ARM匯編語言中的符號在ARM匯編語言中,符號可代表地址,變量和數(shù)字常量.當(dāng)符號代表地址時(shí)又稱為標(biāo)號.符號包括變量,數(shù)字常量,標(biāo)號和局部標(biāo)號.符號的命名規(guī)則如下:符號由大小寫字母,數(shù)字以及下劃線組成.局部標(biāo)號以數(shù)字開頭,其他符號都不能以數(shù)字開頭.符號是區(qū)分大小寫的符號在其作用范圍內(nèi)必須惟一,即在其作用范圍內(nèi)不可有同名的符號程序中的符號不能與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號同名.程序中的符號通常不要與指令助記符或者偽操作同名.5.2 ARM匯編語言語句格式 ARM匯編語言中的符號-變量 在ARM匯編語言中,變量有數(shù)字變量、邏輯變量和串變量3種類型.變量的類型在程

57、序中是不能改變的.數(shù)字變量的取值范圍為數(shù)字常量和數(shù)字表達(dá)式所能表示的數(shù)值范圍邏輯變量的取值為true和false.串變量的取值范圍為串表達(dá)式可表示的范圍.說明:在ARM匯編語言中,使用GBLA、GBLL、GBLS偽操作聲明全局變量,使用LCLA、LCLL、LCLS偽操作聲明局部變量,使用SETA,SETL,SETS偽操作為這些變量賦值.5.2 ARM匯編語言語句格式 ARM匯編語言中的符號-數(shù)字常量數(shù)字常量一般有3種表達(dá)方式:十進(jìn)制數(shù),如43,6,112等十六進(jìn)制數(shù),如0 x3214,0 xFE,0 x1等n進(jìn)制數(shù),表示為n_XXX,其中n為2-9,如8_123即十進(jìn)制數(shù)83.若數(shù)字常量是32

58、位整數(shù),當(dāng)作為無符號整數(shù)時(shí),其取值范圍為0232-1;當(dāng)作為有符號整數(shù)時(shí),其取值范圍為-231231-1.5.2 ARM匯編語言語句格式 ARM匯編語言中的符號-標(biāo)號在ARM匯編語言中,標(biāo)號是表示程序中的指令或數(shù)據(jù)地址的符號,一般它代表一個(gè)地址.根據(jù)地址值的生成方式可有3種:基于PC的標(biāo)號:是位于(將要跳轉(zhuǎn)到的)目標(biāo)指令前或程序中數(shù)據(jù)定義偽操作前的標(biāo)號,在匯編時(shí)將被處理成PC值加上(或減去)一個(gè)數(shù)字常量.它常用于表示跳轉(zhuǎn)指令的目標(biāo)地址,或者代碼段中所嵌入的少量數(shù)據(jù).基于寄存器的標(biāo)號:通常用MAP和FILED偽操作定義該標(biāo)號,也可用EQU偽操作定義.這種標(biāo)號在匯編時(shí)將被處理成寄存器的值加上(或減

59、去)一個(gè)數(shù)字常量.它常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù).絕對地址:是一個(gè)32位的數(shù)字量,尋址的范圍為0231-1,即直接可尋址整個(gè)內(nèi)存空間.5.2 ARM匯編語言語句格式 ARM匯編語言中的符號-局部標(biāo)號 局部標(biāo)號主要用于局部范圍代碼.它由一個(gè)099數(shù)字和一個(gè)通常表示該局部標(biāo)號作用范圍的符號組成,可重復(fù)定義.局部標(biāo)號的作用范圍通常為當(dāng)前段,也可用偽操作ROUT來定義局部標(biāo)號的作用范圍. 其引用的語法格式:%F|B A|T Nroutname F: 向前搜索 B:向后搜索 A:搜索宏的所有嵌套層 T:搜索宏的當(dāng)前層 ARM匯編語言偽指令-其他偽操作ROUT ROUT偽操作舉例routine ROUT

60、;定義局部標(biāo)號的有效范圍,名稱為routine .1 routine ;routine范圍內(nèi)的局部標(biāo)號 . BEQ %2 routine;若條件成立,則跳轉(zhuǎn)到routine范圍內(nèi)的局部標(biāo)號2 . BGE %1 routine ;若條件成立,則跳轉(zhuǎn)到routine范圍內(nèi)的局部標(biāo)號1 .2 routine . ;routine范圍內(nèi)的局部標(biāo)號2 .otherroutine ROUT ;定義新的局部標(biāo)號的有效范圍5.2 ARM匯編語言語句格式 ARM匯編語言中的表達(dá)式 表達(dá)式是由符號,數(shù)值,單目或多目操作符以及括號組成的,在一個(gè)表達(dá)式中各種元素的優(yōu)先級如下:括號內(nèi)的表達(dá)式由字符串,字符串變量,操作符以及括號組成.其優(yōu)先級最高.各

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論