版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第六章基于ARM的嵌入式程序設(shè)計6.1 ARM匯編語言的偽操作、宏指令與偽匯編語言的偽操作、宏指令與偽指令指令v6.1.1 兩種常見的ARM編譯開發(fā)環(huán)境v6.1.2 ADS編譯環(huán)境下的偽操作和宏指令v6.1.3 GNU編譯環(huán)境下的偽操作和宏指令v6.1.4 ARM匯編語言的偽指令 ARM匯編語言的偽操作、宏指令與偽指令匯編語言的偽操作、宏指令與偽指令v偽操作為匯編程序所用,在源程序進(jìn)行匯編時由匯編程序處理,只在匯編過程起作用,不參與程序運(yùn)行。v宏指令通過偽操作定義的一段獨(dú)立的代碼。在調(diào)用它時將宏體插入到源程序中。v偽指令是匯編語言程序里的特殊指令助記符,在匯編時被合適的機(jī)器指令替代。6.1.1
2、兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT IDE開發(fā)環(huán)境:它由ARM公司開發(fā),使用了CodeWarrior公司的編譯器; EmbestIDE開發(fā)環(huán)境:集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境,由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。 這兩種開發(fā)環(huán)境的編譯器都完全支持ARM指令集,但偽指令不同,代碼風(fēng)格不同。6.1.2ADS編譯環(huán)境下的偽操作和宏指令 ADS編譯環(huán)境下的偽操作可分為以下幾類:符號定義(Symbol Definition)偽操作 數(shù)據(jù)定義(Data Definition)偽操作 匯編控制(Assembly Control)偽操作 信息報告(Reporting)偽操
3、作 其他(Miscellaneous)偽操作 符號定義偽操作 vGBLA,GBLL,GBLS:聲明全局變量。vLCLA,LCLL,LCLS:聲明局部變量。vSETA,SETL,SETS:給變量賦值。vRLIST:為通用寄存器列表定義名稱。v1、GBLA,GBLL,GBLSv用于聲明一個ARM程序中的全局變量,并將其初始化。GBLA:聲明一個全局算術(shù)變量,并初始化成0。GBLL:聲明一個全局邏輯變量,并初始化成FALSE。GBLS:聲明一個全局串變量,并初始化成空串“”。v語法格式: variable全局變量的作用范圍為:包含該變量的源程序,全局變量名稱在作用范圍內(nèi)必須唯一。v2、LCLA,LC
4、LL,LCLSv用于聲明一個ARM程序中的局部變量,并將其初始化。LCLA:聲明一個局部算術(shù)變量,并初始化成0。LCLL:聲明一個局部邏輯變量,并初始化成FALSE。LCLS:聲明一個局部串變量,并初始化成空串“”。v語法格式: variable局部變量的作用范圍為:包含該局部變量的宏代碼的一個實(shí)例v3、 SETA,SETL,SETSv用于給ARM程序中的變量賦值。SETA:給一個算術(shù)變量賦值。SETL:給一個邏輯變量賦值。SETS:給一個串變量賦值。v語法格式: variable expression expression:賦給變量的值。在向變量賦值前,必須先聲明該變量。v例:vGBLS s
5、1vGBLS s2vLCLS s3vS1 SETS “strings1”vS2 SETS “strings2”vS3 SETS s1:CC:S2vGBLL logicvlogic SETL TRUEvLCLA arithmeticvarithmetic SETA 0 xff ;聲明一個全局串變量s1;聲明一個全局串變量s2;聲明一個局部串變量s3; 串變量s1賦值為“strings1”; 串變量s2賦值為” strings2”; 串變量s3賦值;聲明一個全局邏輯變量logic;聲明一個局部算術(shù)變量; 變量logic賦初值為TRUE; 變量arithmetic賦初值為oxffv4、RLISTv為
6、一個通用寄存器列表定義名稱。定義的名稱可以在LDM/STM指令中使用。v語法格式: name RLIST list-of-registers name:寄存器列表名稱。 list-of-registers:通用寄存器列表。例:context RLIST R0-R6 ;將寄存器列表名稱定義為contextLDMDF SP! ,context ;加載寄存器列表數(shù)據(jù)定義偽操作vLTORG:聲明一個數(shù)據(jù)緩沖池的開始。vSPACE:分配一塊內(nèi)存單元,并用0初始化。vMAP:定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。vFIELD:定義結(jié)構(gòu)化內(nèi)存表中的一個數(shù)據(jù)域。vDCB:分配一段字節(jié)內(nèi)存單元,并初始化。vDCD、D
7、CDU:分配一段字內(nèi)存單元,并初始化。v1、 LTORGv用于聲明一個數(shù)據(jù)緩沖池(文字池)的開始。v語法格式:v LTORGv例:start BL func func LDR R1,=0 x8000 ;子程序 MOV PC,LR ;子程序返回 LTORG ;定義數(shù)據(jù)緩沖池&0 x8000Data SPACE 4200 ;從當(dāng)前位置開始分配4200字節(jié)的內(nèi) 存單元,并初始化為0。 END 默認(rèn)數(shù)據(jù)緩沖池為空v注意:vLTORG偽操作通常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器不會錯誤地將數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來執(zhí)行。v通常ARM匯編編譯器把數(shù)據(jù)緩沖池放在代碼段的最后
8、面,即下一個代碼段開始之前,或者END偽操作之前。v2、SPACE也可以用符號“%”表示v用于分配一塊連續(xù)的內(nèi)存單元供程序使用,并且將這個內(nèi)存單元的內(nèi)容初始化為0。v語法格式:v label SPACE exprv或 label % exprv其中:label :是一個標(biāo)號,可選項(xiàng)。expr:數(shù)值表達(dá)式,用來規(guī)定內(nèi)存單元的字節(jié)數(shù)。 v例:vAREA DataSpace,Data,READWRITEvdata1 SPACE 256 ;定義大小為256字節(jié)的數(shù)據(jù)區(qū)v3、MAP、FIELDv使用MAP和FIELD偽操作描述數(shù)據(jù)結(jié)構(gòu)。vMAP用于定義數(shù)據(jù)結(jié)構(gòu)的起始地址;vFIELD用于定義結(jié)構(gòu)中的字段
9、(各數(shù)據(jù)域的字節(jié)長度),并可為每一個數(shù)據(jù)域指定一個標(biāo)號,其它指令可引用此標(biāo)號。v注:vMAP和FIELD偽操作只是定義數(shù)據(jù)結(jié)構(gòu)并不實(shí)際分配內(nèi)存單元。v(1)MAP 也可以用符號”表示v語法格式:v MAP expr ,base-registerv或 expr ,base-registerv其中:expr:數(shù)據(jù)表達(dá)式或程序中的標(biāo)號(使用MAP之 前已定義)。 base-register:基址寄存器v若指令中沒有此項(xiàng)時,expr為結(jié)構(gòu)的首地址。(基于絕對地址的數(shù)據(jù)結(jié)構(gòu))v若指令中包含此項(xiàng)時,expr+base-register的和為結(jié)構(gòu)首地址。(基于相對地址的數(shù)據(jù)結(jié)構(gòu))v例:vMAP 0 xC00
10、08 ;數(shù)據(jù)結(jié)構(gòu)存放的起始地址是0 xC0008v datalabel+64 ;數(shù)據(jù)結(jié)構(gòu)存放的起始地址是datalabel+64 ;(datalabel已定義過)v MAP 0 x10,R9 ;數(shù)據(jù)結(jié)構(gòu)存放的起始地址是R9中存放的數(shù)值加上0 x10 v(2)FIELD 也可以用符號”#”表示v用戶定義數(shù)據(jù)結(jié)構(gòu)中的字段。v語法格式: label FIELD expr或 label # exprv其中:label:字段的名稱(地址標(biāo)號)。expr: 此字段在數(shù)據(jù)結(jié)構(gòu)中所占的字節(jié)數(shù)。v由MAP和FIELD偽操作配合定義的數(shù)據(jù)結(jié)構(gòu)有3種:基于絕對地址的數(shù)據(jù)結(jié)構(gòu)基于寄存器相對偏移的數(shù)據(jù)結(jié)構(gòu)基于程序相對偏
11、移的數(shù)據(jù)結(jié)構(gòu)(基于PC)。v例1:基于絕對地址首地址固定MAP 0 x200 ;內(nèi)存的首地址為0 x200 a FIELD 4 ;字段a長度為4,相對位置為0b FIELD 4 ;字段b長度為4,相對位置為4x FIELD 8 ;字段x長度為8,相對位置為8y FIELD 8 ;字段y長度為8,相對位置為16s FIELD 16 ;字段s長度為16,相對位置為24引用結(jié)構(gòu)中的數(shù)據(jù): LDR R0,bv例2:基于寄存器相對偏移首地址基于基址寄存器 MAP 0,R9 ;內(nèi)存的首地址為R9寄存器的值 a FIELD 4 ;字段a長度為4,相對位置為0 b FIELD 4 ;字段b長度為4,相對位置為
12、4 x FIELD 8 ;字段x長度為8,相對位置為8 y FIELD 8 ;字段y長度為8,相對位置為16 s FIELD 16 ;字段s長度為16,相對位置為24v可通過下面的指令訪問數(shù)據(jù)結(jié)構(gòu)中的信息: ADR R9,datastart ; datastart是數(shù)據(jù)起始地址 LDR R0, b ;LDR R0,R9,#4通過在ADR指令中指定不同的基址寄存器的值,定義的數(shù)據(jù)結(jié)構(gòu)可在程序中有多個實(shí)例。v例3:基于程序相對偏移首地址基于PCDatastruc SPACE 280 ;分配280字節(jié)的內(nèi)存單元MAP Datastruc ;內(nèi)存的首地址為Datastruc內(nèi)存單元a FIELD 4
13、;字段a長度為4,相對位置為0b FIELD 4 ;字段b長度為4,相對位置為4x FIELD 8 ;字段x長度為8,相對位置為8y FIELD 8 ;字段y長度為8,相對位置為16s FIELD 256 ;字段s長度為16,相對位置為24v可通過下面的 指令訪問數(shù)據(jù)結(jié)構(gòu)中的信息: LDR R0, b ;LDR R0, Datastruc+4v例:判斷當(dāng)前內(nèi)存的使用情況是否超過程序分配的可用內(nèi)存的方法。startofmem EQU 1000 ;分配內(nèi)存首地址endofmem EQU 2000 ;分配內(nèi)存末地址MAP startofmem ;內(nèi)部首地址為startofmema FIELD 4 ;
14、字段a長度為4,相對位置為0b FIELD 4 ;字段b長度為4,相對位置為4x FIELD 8 ;字段x長度為8,相對位置為8y FIELD 8 ;字段y長度為8,相對位置為16s FIELD max ;字段s長度為max,相對位置為24endofstru FIELD 0 ;endofstru用于檢查內(nèi)存是否越界ASSERT endofstru=endofmem v4、DCB也可以用符號”=”表示v用于定義并且初始化一個或者多個字節(jié)的內(nèi)存區(qū)域。v語法格式: label DCB expr,expr或 label = expr,exprv其中:expr表示:v-128到255之間的一個數(shù)值常量或
15、者表達(dá)式。v一個字符串。當(dāng)DCB后面緊跟一個指令時,可能需要使用ALIGN確保指令是字對齊的。v例:vshort DCB 1 ;為short分配了一個字節(jié),并初始 化為1。vstring DCB “string”,0 ;構(gòu)造一個以0結(jié)尾的字 符串 v5、DCD、DCDUv(1)DCD 也可以用符號”&”表示v用于分配一段字內(nèi)存單元(分配的內(nèi)存單元都是字對齊的)并初始化。v語法格式: label DCD expr,expr或 label & expr,exprv其中:expr:數(shù)字表達(dá)式或程序中的標(biāo)號。DCD偽操作可能在分配的第一個內(nèi)存單元前插入填補(bǔ)字節(jié)以保證分配的內(nèi)存是字對齊的
16、。v例:vdata1 DCD 2,4,6 ;為data1分配三個字,內(nèi)容初始化為2,4,6vdata2 DCD label+4 ;初始化data2為label+4對應(yīng)的地址v(2)DCDUvDCDU與DCD的不同之處在于DCDU分配的內(nèi)存單元并不嚴(yán)格字對齊。匯編控制偽操作vIF,ELSE及ENDIFvWHILE及WENDvMACRO,MEND及MEXITv1、IF,ELSE及ENDIFvIF,ELSE及ENDIF偽操作能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。“是IF偽操作的同義詞“|“是ELSE偽操作的同義詞“”是ENDIF偽操作的同義詞v語法格式:vIF logi
17、c expression; logic expression控制選擇邏輯表達(dá)式 v ;指令或偽指令代碼段1vELSE ;可選v ;指令或偽指令代碼段2vvENDIFIF、ELSE及ENDIF偽操作可以嵌套使用v例:vIF Variable=16 ;如果Variable=16成立,則編譯下面代碼 v BNE SUB1v LDR R0,=SUB0v BX R0vELSE ;否則編譯下面代碼v BNE SUB0v LDR R0,=SUB0v BX R1vENDIF v2、WHILE及WENDvWHILE及WEND偽操作能夠根據(jù)條件重復(fù)匯編相同的一段源代碼。v語法格式: WHILE logic exp
18、ression instructions or derectives WENDWHILE和WEND偽操作可以嵌套使用v例:count SETA 1 ;設(shè)置循環(huán)計數(shù)變量count初始值為1WHILE count=4 ;由count控制循環(huán)執(zhí)行的次數(shù)count SETA count+1 ;將循環(huán)計數(shù)變量加1 ;代碼WEND ;結(jié)束v3、MACRO、MEND及MEXITMACRO:標(biāo)識宏定義的開始。MEND:標(biāo)識宏定義的結(jié)束。v MACRO和MEND之間的代碼稱為宏定義體。MEXIT:用于從宏中跳轉(zhuǎn)出去。宏體代表了一個預(yù)定義的匯編語言指令序列。在匯編程序中通過宏的名稱調(diào)用宏,編譯時,宏語句被展開。
19、v語法格式: MACRO $label macroname $parameter, $parameter. ;code ;code MEND其中: $label:在宏被展開時,label可被替換成相應(yīng)的符號。 macroname:多定義的宏的名稱。 $parameter:宏指令的參數(shù)。v例:(示例26) MACRO $label jump $a1,$a2 $label.loop1 BGE $label.loop1 $label.loop2 BL $a1 BGT $label.loop2 ADR $a2 MEND 在程序中調(diào)用此宏:exam jump sub,detexamloop1BGE ex
20、amloop1examloop2BL subBGT examloop2ADR det v例: MACRO $abc macroabc $param1,$param2 ;code IF condition1 ;code MEXIT ;從宏中跳出 ELSE ;code ENDIF ;code MEND子程序比較短,而需要傳遞的參數(shù)比較多是可以使用宏匯編技術(shù)。其他偽操作v1、CODE16和CODE32vCODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令。vCODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。v語法格式: CODE16 CODE32CODE16和CODE32只是
21、告訴編譯器后面指令的類型,該偽操作本身不進(jìn)行程序狀態(tài)的切換。v例:vAREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面為32位ARM指令 LDR R0,=start+1 BX R0 CODE16 ;下面為16位Thumb指令start MOV R1,#10 . END;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行v2、EQU 也可以用符號”*”表示vEQU偽操作為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號定義一個字符名稱。v語法格式: name EQU expr,typev其中:expr:基于寄存器的地址值、程序中的標(biāo)號、32位的地址常量或者32位
22、的常量。name:為expr定義的字符名稱。type:當(dāng)expr為32位常量時,可以使用type指示expr的數(shù)據(jù)的類型。取值為:vCODE32vCODE16vDATAv例: abcd EQU 2 ;定義abcd符號的值為2 abcd EQU label+16 ;定義abcd符號的值為(label+16) abcd EQU 0 x1c,CODE32 ;定義abcd符號的值為絕對地址 ;值0 x1c,而且此處為ARM指令v3、AREAv用于定義一個代碼段或是數(shù)據(jù)段。v語法格式: AREA sectionname,attr ,attrv其中:sectionname:為所定義的段的名稱。attr:該
23、段的屬性。具有的屬性為:vCODE:定義代碼段。vDATA:定義數(shù)據(jù)段。vREADONLY:指定本段為只讀,代碼段的默認(rèn)屬性。vREADWRITE:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性。vALIGN=expression:指定段的對齊方式為2expression。expression的取值為031。vASSOC=section:指定與本段相關(guān)的ELF段。vCOMDEF:定義一個通用的段。該段可以包含代碼和數(shù)據(jù)。在某個源文件中,同名的COMDEF段必須相同。vCOMMON:定一個通用段。該段不包含任何用戶代碼和數(shù)據(jù)。vNOINIT:指定此數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒有將各初始值寫入內(nèi)存單元,或
24、者將各個內(nèi)存單元值初始化為0。一個大的程序可包含多個代碼段和數(shù)據(jù)段。一個匯編程序至少包含一個代碼段。v4、ENTRYv指定程序的入口點(diǎn)。v語法格式:v ENTRYv注意:v 一個程序(可包含多個源文件)中至少要有一個ENTRY(可以有多個ENTRY),但一個源文件中最多只能有一個ENTRY(可以沒有ENTRY)v5、ENDvEND偽操作告訴編譯器已經(jīng)到了源程序結(jié)尾。v語法格式:v ENDv注意:v每一個匯編源程序都必須包含END偽操作,以表明本源程序的結(jié)束。v6、ALIGNvALIGN偽操作通過填充0將當(dāng)前的位置以某種形式對齊。v語法格式:vALIGN expr,offsetv其中:expr:
25、一個數(shù)字,表示對齊的單位。這個數(shù)字是2的整數(shù)次冪,范圍在20231之間。(如果沒有指定expr,則當(dāng)前位置對齊到下一個字邊界處。)offset:偏移量,可以為常數(shù)或數(shù)值表達(dá)式。不指定offset表示將當(dāng)前位置對齊到以expr為單位的起始位置。v例1:vshort DCB 1 ;本位操作使字對齊被破壞vALIGN ;重新使其為字對齊vMOV R0,1v例2:vALIGN 8 ;當(dāng)前位置以2個字的方式對齊v7、EXPORT及GLOBALv聲明一個源文件中的符號,使得此符號可以被其他源文件引用。v語法格式:vEXPORT/GLOBAL symbol weakv其中:symbol:聲明的符號的名稱。(
26、區(qū)分大小寫)weak:聲明其他同名符號優(yōu)先于本符號被引用。v例: AREA example,CODE,READONLYv EXPORT DoAdd v DoAdd ADD R0,R0,R1v8、IMPORT及EXTERNv聲明一個符號是在其他源文件中定義的。v語法格式:vIMPORT symbolweakvEXTERN symbolweakv其中:symbol:聲明的符號的名稱。weak:v當(dāng)沒有指定此項(xiàng)時,如果symbol在所有的源文件中都沒有被定義,則連接器會報告錯誤。v當(dāng)指定此項(xiàng)時,如果symbol在所有的源文件中都沒有被定義,則連接器不會報告錯誤,而是進(jìn)行下面的操作。v1、如果該符號被
27、B或者BL指令引用,則該符號被設(shè)置成下一條指令的地址,該B或BL指令相當(dāng)于一條NOP指令。v2、其他情況下此符號被設(shè)置成0。v9、GET及INCLUDEv將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。v指令格式:vGET filenamevINCLUDE filenamev其中: filename:包含的源文件名,可以使用路徑信息(可包含空格)。v例:GET d:armfile.sv10、INCBINv將一個文件包含到當(dāng)前源文件中,而被包含的文件不進(jìn)行匯編處理v指令格式:vINCBIN filenamev其中:filename:被包含的文件名稱,可使用路徑信息(不能
28、有空格)。v通常使用此偽操作將一個可執(zhí)行文件或者任意數(shù)據(jù)包含到當(dāng)前文件中。v例:INCBIN d:armfile.txt6.1.3 GNU編譯環(huán)境下的偽操作和宏指令 vGNU編譯環(huán)境下的偽操作可分為以下幾類:常量編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作v常量編譯控制偽操作偽操作語法格式作 用.byte.byte expr ,expr 分配一段字節(jié)內(nèi)存單元,并用expr初始化。.hword/.short.hword expr ,expr 分配一段半字內(nèi)存單元,并用expr初始化。.ascii.ascii expr ,expr 定義字符串expr(非零結(jié)束符)。.asc
29、iz /.string.asciz expr ,expr 定義字符串expr(以/0為結(jié)束符)。.float/.single.float expr ,expr 定義一個32bit IEEE 浮點(diǎn)數(shù)expr。.double.double expr ,expr 定義64bit IEEE浮點(diǎn)數(shù)expr。.word/.long /.int.word expr ,expr 分配一段字內(nèi)存單元,并用expr初始化。.fill.fill repeat ,size,value分配一段字節(jié)內(nèi)存單元( repeat個size長度的內(nèi)存單元),用value初始化每個內(nèi)存單元。.zero.zero size分配一段字
30、節(jié)內(nèi)存單元,并用0填充內(nèi)存。.space/.skip.space size , value分配一段內(nèi)存單元,用value將內(nèi)存單元初始化。v字符編譯控制偽操作偽操作語法格式作用.equ/.set.equ symbol, expr.set symbol, expr為一個常量、標(biāo)號等定義一個字符名稱 例:.equ rPLLCON, 0 x01d80000 .equ zhen, “student” .global/.globl.global symbol定義本模塊中一個可被其它文件引用的全局變量例: .global Func.extern.extern symbol聲明本文件中要使用的其它文件中的全
31、局變量(亦可不聲明)例: .extern Funcv匯編程序代碼控制偽操作偽操作語法格式作 用.section.section expr定義域中包含的段。.text.text subsection將操作符開始的代碼編譯到代碼段或代碼段子段。.data.data subsection將操作符開始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段。.bss.bss subsection將變量存放到.bss段或.bss段的子段。.code 16/.thumb.code 16.thumb表明當(dāng)前匯編指令的指令集選擇Thumb指令集。.code 32/.arm.code 32.arm表明當(dāng)前匯編指令的指令集選擇ARM指令集
32、。.end.end標(biāo)記匯編文件的結(jié)束行,即標(biāo)號后的代碼不作處理。.include.include “filename”將一個源文件包含到當(dāng)前源文件中。.align/.balign.align alignment ,fill ,max通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式。v宏及條件編譯控制偽操作偽操作語法格式作 用.macro、.exitm及.endm.macro acronameparameter, parameter.endm.macro偽操作標(biāo)識宏定義的開始,.endm標(biāo)識宏定義的結(jié)束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。.ifd
33、ef,.else及.endif.ifdef condition.else.endif當(dāng)滿足某條件時對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時則編譯另一組語句。其中else可以缺省。v其他偽操作v.ltorg 在當(dāng)前段(一般為代碼段)的當(dāng)前地址(字對齊)產(chǎn)生一個文字池。一般放在一段程序的后面。v 例:v mov pc, lrv.ltorgvsrc:v .long 1,2,3,4,5vdst:v .long 0,0,0,0 v.req name,expr 為一個特定的寄存器定義名稱。v例:req count, 7 ;定義R7 為count6.1.4 ARM匯編語言的偽指令vARM偽指令不屬于ARM指令集
34、中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別是:ADR:小范圍的地址讀取偽指令。ADRL:中等范圍的地址讀取偽指令。LDR:大范圍的地址讀取偽指令。NOP:空操作偽指令。v1、ADR小范圍的地址讀取vADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實(shí)現(xiàn)此ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯誤,編譯失敗。v語法格式:v ADRcond regist
35、er,exprv其中:register:加載的目標(biāo)寄存器。expr:地址表達(dá)式。取值范圍是參考P212v例1: (0 x20) ADR R1,Delay Delay(0 x64) MOV R0,R14 使用ADR將程序標(biāo)號Delay所表示的地址存入R1。編譯后的反匯編代碼: ADD R1,PC,#0 x3C MOV R0,R14 PC+0 x3C=0 x20+0 x08+0 x3C=0 x64v例2:查表 ADR R0,D_TAB ;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2 ;使用R2作為參數(shù),進(jìn)行查表 D_TAB DCB 0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99,
36、 0 x92v2、ADRL中等范圍的地址讀取vADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯誤,編譯失敗。v語法格式: ADRLcond register,exprv其中:register:加載的目標(biāo)寄存器。expr:地址表達(dá)式。取值范圍參考P212v例: (0 x20) ADRL R1,Delay Delay(0 x64) MOV R0,R14 使用ADRL將程序標(biāo)號Delay所表示的地址存入R1。編譯后的反匯編代碼: ADD R1,PC,#0 x3CADD R1,R1,#0 MOV R0,R14ADRL偽指令被匯編成兩條指令,盡管第2條指令并沒有意義。v3、LDR 大范圍的地址讀取vLDR偽指令用于加載32位立即數(shù)或一個地址值到指定的寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超過MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。v語法格式: LDRcond register,=exprv其中:Register:加載的目標(biāo)寄存器。expr:32位常量或地址表達(dá)式。v
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年公益文化傳播協(xié)議
- 2024年個人車位互換協(xié)議
- 2024年臨時崗位派遣協(xié)議
- 2024年國際空運(yùn)代理服務(wù)協(xié)議
- 2024年企業(yè)通勤包車協(xié)議
- 2024年專業(yè)護(hù)欄供應(yīng)與采購協(xié)議
- 2024年專用:企業(yè)員工戒煙獎勵協(xié)議
- 2024年信貸協(xié)議:借款與擔(dān)保專項(xiàng)條款
- 2024年醫(yī)療手術(shù)預(yù)付借款協(xié)議
- 2024年員工保密與競業(yè)禁止協(xié)議
- 有限空間作業(yè)審批表
- 《免疫學(xué)與病原生物學(xué)》課程標(biāo)準(zhǔn)
- 左宗棠生平及評價
- c90溫控表說明書
- 智能除草機(jī)器人
- 宮外孕破裂出血護(hù)理查房
- 諾如病毒應(yīng)急演練方案
- 農(nóng)耕研學(xué)基地可行性方案
- PCN、ECN變更管理流程
- 傳菜培訓(xùn)課件
- 降低危重患者早期腸內(nèi)營養(yǎng)的不耐受性品管圈課件
評論
0/150
提交評論