




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章ARM匯編偽指令與偽操作本章將詳細(xì)介紹進(jìn)行匯編語言程序設(shè)計(jì)時(shí)所用的ARM/Thumb匯編語言偽指令、由ARM公司推出的開發(fā)工具所支持的偽操作以及GNUARM開發(fā)工具所支持的偽操作。
內(nèi)容提要6.1匯編語言偽指令6.2ARM匯編語言偽操作6.3ARM匯編偽操作6.4GNUARM匯編偽操作6.1匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊助記符,它不在處理器運(yùn)行期間由機(jī)器執(zhí)行,只是在匯編時(shí)將被合適的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正的指令操作。
6.1.1ARM匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。LDR{cond} register,=expression6.1.1ARM匯編語言偽指令如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV或MVN指令替代LDR偽指令。如果加載的常數(shù)不符合MOV或MVN指令立即數(shù)的要求,匯編器將常量放入內(nèi)存文字池,并使用一條程序相對(duì)偏移的LDR指令從內(nèi)存文字池讀出常量。
6.1.1ARM匯編語言偽指令例:偽指令語句: LDR R0, =0x0AA00;R0<—0x0AA00 LDRR1,=0xAABBCCDD匯編后分別為:
MOV R0, #43520(#0xAA00) LDRR1,[PC,offset_Lpool] ……Lpool DCD0xAABBCCDD6.1.1ARM匯編語言偽指令2.中等范圍地址讀取偽指令A(yù)DRL它將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。
ADRL{cond} register,expression6.1.1ARM匯編語言偽指令匯編器在處理源程序時(shí),ADRL偽指令被兩條具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用兩條指令實(shí)現(xiàn)ADRL偽指令的功能,則編譯器報(bào)告錯(cuò)誤,編譯失敗。
6.1.1ARM匯編語言偽指令以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。start
MOV R0, #0x0F ADRL R0, start解:匯編后的結(jié)果為:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)6.1.1ARM匯編語言偽指令3.小范圍地址讀取偽指令A(yù)DR它將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。當(dāng)?shù)刂肥亲止?jié)對(duì)齊時(shí),取值范圍為-255~+255
ADR{cond} register,expression匯編器在處理源程序時(shí),ADR偽指令被一條具有ADR等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用一條指令實(shí)現(xiàn)ADR偽指令的功能,則編譯器報(bào)告錯(cuò)誤,編譯失敗。
6.1.1ARM匯編語言偽指令下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:
MOV R0, #0x0F ADR R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOVR0,#0x0F0x00008004 SUB R0,PC,#126.1.1ARM匯編語言偽指令A(yù)DR、ADRL、LDR的區(qū)別取值范圍不同ADR:-255~+255/-1020~+1020ADRL:-64KB~+64KB/-256KB~+256KBLDR:LDR偽指令處的PC值到數(shù)據(jù)緩沖區(qū)的目標(biāo)數(shù)據(jù)所在的地址之間的偏移量必須小于4KB。使用方法不同ADR、ADRL只能取同一段中標(biāo)號(hào)的地址;LDR還可以取不同段中的標(biāo)號(hào)地址或一個(gè)指定的立即數(shù)ADR、ADRL與LDR書寫標(biāo)號(hào)時(shí)語法有區(qū)別6.1.1ARM匯編語言偽指令4.空操作偽指令NOPNOP是空操作偽指令,在匯編時(shí)將會(huì)被替代成ARM中的空操作.例如MOVR0,R0ADDR0,R0,#0SUBR0,R0,#06.2 ARM匯編語言偽操作偽操作(Directive)是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準(zhǔn)備工作,對(duì)源程序運(yùn)行匯編程序處理,而不是在計(jì)算機(jī)運(yùn)行期間由處理器執(zhí)行。偽操作只是匯編過程中起作用,一旦匯編結(jié)束,偽操作也就隨之消失。目前常用的編譯環(huán)境有2種:1.
ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具2.
GNUARM開發(fā)工具1.
ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ADS由ARM公司推出,使用了CodeWarrior公司的編譯器。針對(duì)ARM資源配置為用戶提供了在CodeWarriorIDE集成環(huán)境下配置各種ARM開發(fā)工具的能力。以ARM為目標(biāo)平臺(tái)的工程創(chuàng)建向?qū)В梢允褂脩粢源藶榛A(chǔ),快速創(chuàng)建ARM和Thumb工程。ARM將Keil
公司收購之后,正式推出了針對(duì)ARM微控制器的開發(fā)工具RealView
MicrocontrollerDevelopmentKit(簡(jiǎn)稱RealViewMDK或者M(jìn)DK),它將ARM開發(fā)工具RealViewDevelopmentSuite(簡(jiǎn)稱RVDS)的編譯器RVCT與Keil的工程管理、調(diào)試仿真工具集成在一起,是一款非常強(qiáng)大的ARM微控制器開發(fā)工具。2.
GNUARM開發(fā)工具GNU是“GNU‘sNotUnix”的遞歸縮寫。在1983年9月27日由RichardStallman公開發(fā)起GNU計(jì)劃,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng)。GNU格式ARM匯編語言程序主要是面對(duì)在ARM平臺(tái)上移植嵌入式Linux操作系統(tǒng),GNU組織開發(fā)的基于ARM平臺(tái)的編譯工具有主要由GNU的匯編器as,交叉匯編器gcc和連接器ld組成。6.3ARM匯編偽操作ARM公司推出的開發(fā)工具所支持的匯編偽操作包括符號(hào)定義偽操作、數(shù)據(jù)定義偽操作、匯編信息報(bào)告控制偽操作、匯編代碼控制偽操作、文件包含偽操作、指令集類型標(biāo)識(shí)偽操作以及其他功能偽操作。6.3.1符號(hào)定義偽操作
符號(hào)定義偽操作用于在ARM匯編程序中定義變量、給寄存器定義別名和對(duì)變量進(jìn)行賦值等操作。1.局部變量定義LCLA、LCLL及LCLS語法格式:LCLA variableLCLL variableLCLS variable
功能:定義局部變量并初始化。其中:variable 所說明的局部變量名稱。6.3.1符號(hào)定義偽操作2.全局變量定義GBLA、GBLL及GBLS語法格式GBLA variableGBLL variableGBLS variable
功能:定義全局變量并初始化。其中:variable 所說明的全局變量名稱。在整個(gè)程序范圍內(nèi)必須唯一。6.3.1符號(hào)定義偽操作3.變量賦值偽操作SETA、SETL及SETS語法格式variable_a SETA expr_a
variable_l SETL expr_l
variable_s SETS expr_s
6.3.1符號(hào)定義偽操作例6-10定義全局變量并賦值 GBLAa_var GBLLl_var GBLSs_vara_var SETA0xFFl_var SETL{TRUE}s_var SETS“AABCD”變量如何在ARM語句中使用?MOVR0,#a_var6.3.1符號(hào)定義偽操作4.給通用寄存器列表定義名稱RLIST語法格式name RLIST {registers_list}其中:name 寄存器列表的名稱;registers_list
通用寄存器列表。例:Reglist RLIST{R0-R2,R5,R7,R10-R12}如何在ARM語句中使用? LDMFDR13!,Reglist6.3.2數(shù)據(jù)定義偽操作
數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,也可以完成已分配存儲(chǔ)單元的初始化。6.3.2數(shù)據(jù)定義偽操作1.分配字節(jié)存儲(chǔ)單元DCB語法格式
{label} DCB expr{,expr}…其中:label 可選的程序標(biāo)號(hào);expr
是-128~255之間的數(shù)字或字符串。例:Str_bufferDCB“ARM7andARM9”,0x0,0x16.3.2數(shù)據(jù)定義偽操作2.分配半字存儲(chǔ)單元DCW及DCWU語法格式{label} DCW expr{,expr}…{label} DCWU expr{,expr}…其中:label 可選的程序標(biāo)號(hào);expr
是-32768~65535之間的數(shù)字表達(dá)式。例:data_buffer1 DCW0x1,0x2,0x3 data_buffer2 DCWU0x1,0x2,0x36.3.2數(shù)據(jù)定義偽操作3.分配字存儲(chǔ)單元DCD及DCDU語法格式{label} DCD expr{,expr}…{label} DCDU expr{,expr}…其中:label 可選的程序標(biāo)號(hào);expr
表達(dá)式。例:data_buffer1 DCD0x1,0x2,0x3 data_buffer2 DCDU0x1,0x2,0x36.3.2數(shù)據(jù)定義偽操作8.分配存儲(chǔ)空間SPACE語法格式
{label} SPACE expr其中:label 可選的程序標(biāo)號(hào);expr
分配的字節(jié)數(shù)。功能:分配一片連續(xù)的字節(jié)存儲(chǔ)區(qū)域并將其初始化為0。6.3.3匯編代碼控制偽操作匯編器在對(duì)程序代碼進(jìn)行編譯時(shí),會(huì)根據(jù)匯編控制偽操作的定義情況對(duì)程序進(jìn)行編譯,常用的有條件編譯、重復(fù)匯編和宏定義
6.3.3匯編代碼控制偽操作1.IF條件編譯偽操作:根據(jù)條件來決定是否對(duì)一段程序代碼進(jìn)行編譯語法格式:IF logical_expression
程序代碼段A {ELSE
程序代碼段B}ENDIF例:IF UART0=ON BLUART0_initELSE BLUART1_initENDIF6.3.3匯編代碼控制偽操作2.WHILE條件編譯偽操作語法格式:WHILElogical_expression
程序代碼段WEND功能:重復(fù)編譯程序代碼段直到logical_expression不成立。例:counterSETA100WHILEcounter>0 ……counterSETAcounter-1WEND6.3.3匯編代碼控制偽操作3.MACRO宏定義偽操作語法格式:MACRO{$label} macroname {$parameter{,$parameter}…}
程序代碼段MEND其中:{$label}在宏指令被展開時(shí),標(biāo)號(hào)被替換成用戶定義的符號(hào)
{$parameter…}為宏的參數(shù)列表,當(dāng)宏被展開時(shí)被替換為相應(yīng)的值。功能:將一段程序代碼定義成一個(gè)宏。6.3.3匯編代碼控制偽操作3.MACRO宏定義偽操作宏在調(diào)用時(shí)被替換展開,沒有其他的附加操作。宏多用于所定義的程序代碼量較小,而需要傳送參數(shù)比較多的場(chǎng)合。相對(duì)子程序調(diào)用而言,能有效提高處理速度。如果變量在宏定義中被定義,則該變量只在該宏定義體中有效。6.3.3匯編代碼控制偽操作3.MACRO宏定義偽操作例6-30(驗(yàn)證)在ARM和Thumb代碼中,測(cè)試并跳轉(zhuǎn)操作需要執(zhí)行兩條ARM指令??梢远x一個(gè)與下面類似的宏來實(shí)現(xiàn)相應(yīng)的操作:MACRO $labelTestAndBranch$dest,$reg,$cc $labelCMP$reg,#0
B$cc$destMEND6.3.3匯編代碼控制偽操作3.MACRO宏定義偽操作例6-30
(續(xù))宏調(diào)用:testTestAndBranchNonZero,R0,NE ….NonZero替換后將變成:test CMPR0,#0 BNENonZero …NonZero…6.3.4匯編信息報(bào)告控制偽操作
信息報(bào)告?zhèn)尾僮饔糜诔绦騾R編指示,主要是在程序調(diào)試階段使用。這類偽操作分為錯(cuò)誤信息報(bào)告?zhèn)尾僮鳌⒃\斷信息報(bào)告?zhèn)尾僮?、列表選項(xiàng)設(shè)置偽操作、插入文件標(biāo)題偽操作
6.3.4匯編信息報(bào)告控制偽操作1、錯(cuò)誤信息報(bào)告ASSERT
語法格式:ASSERTlogical_expression其中:logical_expression用于表示的條件的邏輯表達(dá)式。功能:用于保證源程序被匯編時(shí)滿足相關(guān)的條件。如果匯編時(shí)邏輯表達(dá)式logical_expression不成立,ASSERT將報(bào)告錯(cuò)誤信息。6.3.4匯編信息報(bào)告控制偽操作2、診斷信息報(bào)告INFOINFOnumeric_expression,string_expression其中:numeric_expression數(shù)字表達(dá)式。如果numeric_expression為0,則在第二遍掃描時(shí),偽操作打印string_expression的內(nèi)容;如果numeric_expression的值不為0,則在匯編處理中,第一遍掃描時(shí),偽操作打印string-expression的內(nèi)容,并終止匯編。6.3.4匯編信息報(bào)告控制偽操作3、列表選項(xiàng)設(shè)置OPT
OPT為編譯列表選項(xiàng)設(shè)置偽操作,用于在源程序中設(shè)置匯編列表選項(xiàng)。語法格式:OPT n其中:n是OPT指令設(shè)置選項(xiàng)編號(hào)。教材中表6-5列出了有效的選項(xiàng)編號(hào)及其含義。6.3.4匯編信息報(bào)告控制偽操作4、插入文件標(biāo)題偽操作TTL與SUBT語法格式:TTLtitleSUBTsubtitle其中:title為所插入的列表文件的標(biāo)題;subtitle為所插入的列表文件的子標(biāo)題。功能:TTL/SUBT在列表文件顯示一個(gè)標(biāo)題/子標(biāo)題。如果要在列表文件的第一頁顯示標(biāo)題/子標(biāo)題,TTL/SUBT要放在源程序的第一行。6.3.5指令集類型標(biāo)識(shí)偽操作
指令集類型標(biāo)識(shí)偽操作用來告訴編譯器所處理的是32位的ARM指令還是16位的Thumb指令,實(shí)現(xiàn)這一操作的操作符有ARM、CODE32、THUMB、CODE16
指令集類型標(biāo)識(shí)偽操作
6.3.5指令集類型標(biāo)識(shí)偽操作例: AREAARMThumb,CODE,READONLY ENTRY CODE32start ADRR0,into_thumb+1 BXR0 CODE16into_thumb MOVSR0,#10 ……6.3.6文件包含偽操作
文件包含偽操作包括兩類:一類是將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理;另一類是也將一個(gè)源文件包含到當(dāng)前源文件中,但被包含文件不進(jìn)行匯編處理。
6.3.6文件包含偽操作 1.文件包含GET或INCLUDE語法格式:GET filenameINCLUDE filename其中:filename是要在匯編中包含的文件名稱。匯編程序接受UNIX或MS-DOS格式的路徑名。功能:將一個(gè)源文件包含到當(dāng)前源文件并進(jìn)行匯編處理。例: AREAExample,CODE,READONLY GETinclude_s.s GETd:\test\include_s.s6.3.6文件包含偽操作 2、文件原樣包含INCBIN
語法格式:INCBIN filename其中:filename是要在匯編中包含的文件名稱。匯編程序接受UNIX或MS-DOS格式的路徑名。功能:將一個(gè)文件包含到當(dāng)前源文件中,該文件按原樣包含,不進(jìn)行匯編處理。通常用于將目標(biāo)文件或數(shù)據(jù)文件包含到當(dāng)前源文件中。例: …… INCBINa1.dat
INCBINa2.o6.3.7其他類型偽操作
對(duì)齊方式設(shè)置ALIGN段屬性定義偽操作AREA
源程序結(jié)尾標(biāo)識(shí)END
聲明程序的入口點(diǎn)ENTRY
定義常量或標(biāo)號(hào)名稱EQU
聲明全局標(biāo)號(hào)EXPORT或GLOBAL
將符號(hào)導(dǎo)出到目標(biāo)文件EXPORTAS
外部符號(hào)聲明IMPORT和EXTERN保留局部符號(hào)KEEP
禁止使用浮點(diǎn)指令NOFP
指定段的相關(guān)性REQUIRE
堆棧八字節(jié)對(duì)齊REQUIRE8和PRESERVE8
局部變量范圍定義ROUT6.3.7其他類型偽操作 1.對(duì)齊方式設(shè)置ALIGN
對(duì)齊方式設(shè)置ALIGN偽操作通過用零或NOP指令進(jìn)行填充來使當(dāng)前位置與指定的邊界對(duì)齊。語法格式:ALIGN{expr{,offset{,pad{,padsize}}}}expr:用于指定對(duì)齊方式,值為2的n次冪,0≤n≤31;offset:表示偏移量,可以是任何數(shù)值表達(dá)式;pad:數(shù)值表達(dá)式,用于對(duì)齊時(shí)填充的內(nèi)容;padsize:可以為1、2、4,用于指定pad的類型(字節(jié)/半字/ 字)6.3.7其他類型偽操作 1.對(duì)齊方式設(shè)置ALIGN
使用場(chǎng)景:ADR偽指令用于Thumb代碼時(shí)只能加載字對(duì)齊的地址,但Thumb代碼內(nèi)的標(biāo)簽可能不是字對(duì)齊的,此時(shí)須使用ALIGN4來保證代碼內(nèi)地址為4字節(jié)對(duì)齊;使用ALIGN可確保ARM處理器高速緩存的使用效率。例如使用ALIGN16來確保在16字節(jié)邊界上對(duì)齊函數(shù)入口點(diǎn);LDRD和STRD雙字?jǐn)?shù)據(jù)傳送必須是8字節(jié)對(duì)齊的,此時(shí)就在內(nèi)存分配指令(如DCQ)前使用ALIGN8.6.3.7其他類型偽操作 2.段屬性定義偽操作AREA
匯編程序采用分段設(shè)計(jì),段屬性定義偽操作AREA用于定義一個(gè)代碼段或數(shù)據(jù)段,AREA偽操作指示匯編器匯編新的代碼段或數(shù)據(jù)段。段是不可分的已命名獨(dú)立代碼或數(shù)據(jù)塊,它們由鏈接器處理。語法格式:AREAsectionname{,attr}{,attr}...6.3.7其他類型偽操作 2.段屬性定義偽操作AREAsectionname:段名。如果以數(shù)字開始必須包含在“|…|”內(nèi);attr:段屬性,常用的選項(xiàng)如下:1)ALIGN=expr:規(guī)定段為2expr字節(jié)對(duì)齊,取值2~31;2)CODE:指定該段為代碼段,此時(shí)READONLY為默認(rèn)屬性;3)DATA:定義數(shù)據(jù)段,默認(rèn)屬性為READWRITE;4)READONLY:指定該段只讀;5)READWRITE:指定該段可讀可寫。6.3.7其他類型偽操作 2.段屬性定義偽操作AREA注意事項(xiàng):一組匯編代碼必須有一個(gè)AREA指令;可以在多個(gè)AREA指令中使用相同的名稱,名稱相同的所有區(qū)域都放在相同的ELF段中。通常對(duì)代碼和數(shù)據(jù)使用不同的ELF段。6.3.7其他類型偽操作 3、源程序結(jié)尾標(biāo)識(shí)ENDEND偽操作通知匯編程序它已到達(dá)源文件的末尾。語法格式: END6.3.7其他類型偽操作 4、聲明程序的入口點(diǎn)ENTRY
ENTRY偽操作聲明程序的入口點(diǎn)。語法格式: ENTRY注意:必須為一個(gè)程序指定至少一個(gè)ENTRY點(diǎn);一個(gè)源文件內(nèi)不能使用多個(gè)ENTRY指令;并非每個(gè)源文件都必須包含ENTRY指令。例: AREAARMex,CODE,READONLY ENTRY MOVR0,#1 ……6.3.7其他類型偽操作 5、定義常量或標(biāo)號(hào)名稱EQU
功能:為數(shù)值常量、標(biāo)號(hào)指定一個(gè)符號(hào)名稱。語法格式:nameEQUexpr{,type}其中:name:是要為數(shù)值
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息檢索語言與技巧考核試卷
- 化工生產(chǎn)過程中的能量集成考核試卷
- 小學(xué)生音樂律動(dòng)課件視頻
- 辦公文具創(chuàng)新設(shè)計(jì)理念與實(shí)踐考核試卷
- 城市綠化管理的城市設(shè)計(jì)與城市規(guī)劃考核試卷
- 秋季安全宣傳課件圖片
- 門市倉庫出租合同范本
- 醫(yī)藥器械采購合同范本
- 種植基地配送合同范本
- 酒店客房預(yù)訂操作規(guī)范及流程制度
- 馬工程《刑法學(xué)(下冊(cè))》教學(xué)課件 第22章 妨害社會(huì)管理秩序罪
- GB/T 14643.6-2009工業(yè)循環(huán)冷卻水中菌藻的測(cè)定方法第6部分:鐵細(xì)菌的測(cè)定MPN法
- 《政治經(jīng)濟(jì)學(xué)》全套課件(完整版)【復(fù)旦版】
- 國(guó)有企業(yè)干部選拔任用條例
- QSB質(zhì)量體系基礎(chǔ)課件
- 仁愛版八年級(jí)英語上復(fù)習(xí)課Unit 2 Keep Healthy Topic1 2教學(xué)課件
- 系統(tǒng)運(yùn)維投標(biāo)文件含運(yùn)維方案
- 心理健康教育課《在變化中成長(zhǎng)》課件
- JJF 1341-2012 鋼筋銹蝕測(cè)量?jī)x校準(zhǔn)規(guī)范-(高清現(xiàn)行)
- 人教版數(shù)學(xué)五年級(jí)下冊(cè) 全冊(cè)各單元教材解析
- 偏癱臨床路徑流程
評(píng)論
0/150
提交評(píng)論