工學(xué)zz-ARM匯編偽指令課件_第1頁
工學(xué)zz-ARM匯編偽指令課件_第2頁
工學(xué)zz-ARM匯編偽指令課件_第3頁
工學(xué)zz-ARM匯編偽指令課件_第4頁
工學(xué)zz-ARM匯編偽指令課件_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

zhaiQYARM偽指令zhaiQYARM偽指令1ARM匯編語言的偽操作ARM匯編語言的宏指令A(yù)RM匯編語言的偽指令A(yù)RM匯編語言程序設(shè)計(jì)主要內(nèi)容ARM匯編語言的偽操作主要內(nèi)容2兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ADS由ARM公司推出,使用了CodeWarrior公司的編譯器。針對ARM資源配置為用戶提供了在CodeWarriorIDE集成環(huán)境下配置各種ARM開發(fā)工具的能力。以ARM為目標(biāo)平臺的工程創(chuàng)建向?qū)В梢允褂脩粢源藶榛A(chǔ),快速創(chuàng)建ARM和Thumb工程。兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealView3兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ARM將Keil公司收購之后,正式推出了針對ARM微控制器的開發(fā)工具RealViewMDK或者M(jìn)DK,它將ARM開發(fā)工具RealViewDevelopmentSuite(簡稱RVDS)的編譯器RVCT與Keil的工程管理、調(diào)試仿真工具集成在一起,是一款非常強(qiáng)大的ARM微控制器開發(fā)工具。兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealView4兩種常見的ARM編譯開發(fā)環(huán)境GNUARM開發(fā)工具GNU是“GNU‘sNotUnix”的遞歸縮寫。在1983年9月27日由RichardStallman公開發(fā)起GNU計(jì)劃,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng)。GNU格式ARM匯編語言程序主要是面對在ARM平臺上移植嵌入式Linux操作系統(tǒng),GNU組織開發(fā)的基于ARM平臺的編譯工具有主要由GNU的匯編器as,交叉匯編器gcc和連接器ld組成。兩種常見的ARM編譯開發(fā)環(huán)境GNUARM開發(fā)工具5ADS編譯環(huán)境下的偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作可分為以下幾類:符號定義(SymbolDefinition)偽操作數(shù)據(jù)定義(DataDefinition)偽操作匯編控制(AssemblyControl)偽操作信息報(bào)告(Reporting)偽操作其他(Miscellaneous)偽操作ADS編譯環(huán)境下的偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作可6符號定義偽操作偽操作語法格式作用GBLAGBLAVariable聲明一個(gè)全局的算術(shù)變量,并將其初始化成0。GBLLGBLLVariable聲明一個(gè)全局的邏輯變量,并將其初始化成{FALSE}。GBLSGBLSVariable聲明一個(gè)全局的字符串變量,并將其初始化成空串“”。LCLALCLAVariable聲明一個(gè)局部的算術(shù)變量,并將其初始化成0。LCLLLCLLVariable聲明一個(gè)局部的邏輯變量,并將其初始化成{FALSE}。LCLSLCLSVariable聲明一個(gè)局部的串變量,并將其初始化成空串“”。SETASETAVariableexpr給一個(gè)全局或局部算術(shù)變量賦值。SETLSETLVariableexpr給一個(gè)全局或局部邏輯變量賦值。SETSSETSVariableexpr給一個(gè)全局或局部字符串變量賦值。RLISTnameLIST{listofregisters}為一個(gè)通用寄存器列表定義名稱。CNnameCNexpr為一個(gè)協(xié)處理器的寄存器定義名稱。CPnameCPexpr為一個(gè)協(xié)處理器定義名稱。DN/SNnameDN/SNexprDN/SN為一個(gè)雙精度/單精度的VFP寄存器定義名稱。FNnameFNexpr為一個(gè)FPA浮點(diǎn)寄存器定義名稱。符號定義偽操作偽操作語法格式作用GBLAGBLAVa7數(shù)據(jù)定義偽操作偽操作語法格式作用LTORGLTORG聲明一個(gè)數(shù)據(jù)緩沖池(也稱為文字池)的開始。MAPMAPexpr{,base-register}定義一個(gè)結(jié)構(gòu)化的內(nèi)存表(StorageMap)的首地址。FIELD{label}FIELDexpr定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。SPACE{label}SPACEexpr分配一塊連續(xù)內(nèi)存單元,并用0初始化。DCB{label}DCBexpr{,expr}分配一段字節(jié)內(nèi)存單元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字內(nèi)存單元。DCDO{label}DCDOexpr{,expr}…分配一段字對齊的字內(nèi)存單元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…為雙精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…為單精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。DCI{label}DCIexpr{,expr}…在ARM代碼中分配一段字對齊的內(nèi)存單元;在Thumb代碼中,分配一段半字對齊的半字內(nèi)存單元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以雙字(8個(gè)字節(jié))為單位的內(nèi)存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字對齊的半字內(nèi)存單元。數(shù)據(jù)定義偽操作偽操作語法格式作用LTORGLTORG聲明8匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能夠根據(jù)條件重復(fù)匯編相同的一段源代碼。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}…;宏代碼MENDMACRO標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束。MERIT用于從宏中跳轉(zhuǎn)出去。用MACRO和MEND定義的一段代碼,稱為宏定義體。通過宏名稱來調(diào)用宏。匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDI9信息報(bào)告?zhèn)尾僮?/p>

偽操作語法格式作用ASSERTASSERTlogicalexpression對匯編程序的第二遍掃描中,如果其中ASSERT中條件不成立,ASSERT偽操作將報(bào)告該錯(cuò)誤信息。INFOINFOnumeric-expression,string-expression在匯編處理過程的第一遍掃描或者第二遍掃描時(shí)INFO偽操作報(bào)告診斷信息。OPTOPTn通過OPT偽操作可以在源程序中設(shè)置列表選項(xiàng)。TTLTTLtitle在列表文件的每一頁的開頭插入一個(gè)標(biāo)題。SUBTSUBTsubtitle在列表文件的每一頁的開頭插入一個(gè)子標(biāo)題。信息報(bào)告?zhèn)尾僮鱾尾僮髡Z法格式作用ASSERTASSERT10偽操作語法格式作用CODE16CODE16說明后面的指令序列為16位的Thumb指令CODE32CODE32說明后面的指令序列為32位的ARM指令。EQUnameEQUexpr{,type}定義一個(gè)字符名稱,類似于C語言中的#define宏定義。AREAAREAsectionname{,attr}{,attr}…定義一個(gè)代碼段或者數(shù)據(jù)段。ENTRYENTRY指定程序的入口點(diǎn)。ENDEND說明到了源程序結(jié)尾。ALIGNALIGN{expr{,offset}}通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。EXPORT/GLOBALEXPORTsymbol{[WEAK]}聲明一個(gè)符號可以被其他文件引用.IMPORTIMPORTsymbol{[WEAK]}說明當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。EXTERNEXTERNsymbol{〔WEAK〕}說明當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。GET/INCLUDEGETfilename

將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCBININCBINfilename將一個(gè)文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。KEEPKEEP{symbol}說明將局部符號包含在目標(biāo)文件的符號表中。NOFPNOFP禁止源程序中包含浮點(diǎn)運(yùn)算指令。REQUIREREQUIRElable指定段之間的相互依賴關(guān)系。RNnameRNexpr為一個(gè)特定的寄存器定義名稱。ROUT{name}ROUT定義局部變量的有效范圍。其他偽操作偽操作語法格式作用CODE16CODE16說明后面的指令序11GNU編譯環(huán)境下的偽操作和宏指令GNU編譯環(huán)境下的偽操作可分為以下幾類:常量編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作GNU編譯環(huán)境下的偽操作和宏指令GNU編譯環(huán)境下的偽操作可12常量編譯控制偽操作偽操作語法格式作用.byte.byteexpr{,expr}…分配一段字節(jié)內(nèi)存單元,并用expr初始化。.hword/.short.hwordexpr{,expr}…分配一段半字內(nèi)存單元,并用expr初始化。.ascii.asciiexpr{,expr}…定義字符串expr(非零結(jié)束符)。.asciz/.string.ascizexpr{,expr}…定義字符串expr(以/0為結(jié)束符)。.float/.single.floatexpr{,expr}…定義一個(gè)32bitIEEE浮點(diǎn)數(shù)expr。.double.doubleexpr{,expr}…定義64bitIEEE浮點(diǎn)數(shù)expr。word/.long/.int.wordexpr{,expr}…分配一段字內(nèi)存單元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字節(jié)內(nèi)存單元,用size長度value填充repeat次。.zero.zerosize分配一段字節(jié)內(nèi)存單元,并用0填充內(nèi)存。.space/.skip.spacesize{,value}分配一段內(nèi)存單元,用value將內(nèi)存單元初始化。常量編譯控制偽操作偽操作語法格式作用.byte.byte13匯編程序代碼控制偽操作偽操作語法格式作用.section.sectionexpr定義域中包含的段。.text.text{subsection}將操作符開始的代碼編譯到代碼段或代碼段子段。.data.data{subsection}將操作符開始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段。.bss.bss{subsection}將變量存放到.bss段或.bss段的子段。.code16/.thumb.code16.thumb表明當(dāng)前匯編指令的指令集選擇Thumb指令集。.code32/.arm.code32.arm表明當(dāng)前匯編指令的指令集選擇ARM指令集。.end.end標(biāo)記匯編文件的結(jié)束行,即標(biāo)號后的代碼不作處理。.include.include“filename”將一個(gè)源文件包含到當(dāng)前源文件中。.align/.balign.align{alignment}{,fill}{,max}通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式。匯編程序代碼控制偽操作偽操作語法格式作用.section14宏及條件編譯控制偽操作

偽操作語法格式作用.macro、.exitm及.endm.macroacroname{parameter{,parameter}…}….endm.macro偽操作標(biāo)識宏定義的開始,.endm標(biāo)識宏定義的結(jié)束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif當(dāng)滿足某條件時(shí)對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時(shí)則編譯另一組語句。其中else可以缺省。宏及條件編譯控制偽操作偽操作語法格式作用.macro、.15其他偽操作偽操作語法格式作用.eject.eject在匯編符號列表文件中插入一分頁符。.list.list產(chǎn)生匯編列表(從.list到.nolist)。.nolist.nolist表示匯編列表結(jié)束處。.title.title“heading”使用“heading”作為標(biāo)題。.sbttl.sbttl“heading”使用“heading”作為子標(biāo)題。.ltorg.ltorg在當(dāng)前段的當(dāng)前地址(字對齊)產(chǎn)生一個(gè)文字池。.req.reqname,expr為一個(gè)特定的寄存器定義名稱。.err.err使編譯時(shí)產(chǎn)生錯(cuò)誤報(bào)告。.print.printstring打印信息到標(biāo)準(zhǔn)輸出。.fail.failexpr編譯匯編文件時(shí)產(chǎn)生警告。其他偽操作偽操作語法格式作用.eject.eject在匯16匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊助記符,它不在處理器運(yùn)行期間由機(jī)器執(zhí)行,只是在匯編時(shí)將被合適的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正的指令操作。匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊17ARM匯編語言語句格式

ARM匯編語言語句格式如下所示:{symbol}

{instruction|directive|pseudo-instruction}

{;comment}

其中:instruction為指令。directive為偽操作。pseudo-instruction為偽指令。symbol為符號。comment為語句的注釋。

ARM匯編語言語句格式ARM匯編語言語句格式如下所示:18ARM匯編語言的偽指令

偽指令語法格式作用ADRADR{cond}register,expr將基于PC或基于寄存器的地址值讀取到寄存器中。小范圍的地址讀取。ADRLADRL{cond}register,expr將基于PC或基于寄存器的地址值讀取到寄存器中。中等范圍的地址讀取。LDRLDR{cond}register,=[expr|label-expr]將一個(gè)32位的立即數(shù)或者一個(gè)地址值讀取到寄存器中。大范圍的地址讀取。NOPNOP在匯編時(shí)將被替換成ARM中的空操作。ARM匯編語言的偽指令偽指令語法格式作用ADRADR{c19ARM匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。LDR{cond} register,=expression

ARM匯編語言偽指令1.大范圍地址讀取偽指令LDR20如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV或MVN指令替代LDR偽指令。如果加載的常數(shù)不符合MOV或MVN指令立即數(shù)的要求,匯編器將常量放入內(nèi)存文字池,并使用一條程序相對偏移的LDR指令從內(nèi)存文字池讀出常量。如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV21偽指令語句:LDR R0, =0x0AA00;R0<—0x0AA00匯編后: MOV R0, #43520偽指令語句:222.中等范圍地址讀取偽指令A(yù)DRL它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。ADRL{cond} register,=expression2.中等范圍地址讀取偽指令A(yù)DRL23匯編器在處理源程序時(shí),ADRL偽指令被兩條具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用兩條指令實(shí)現(xiàn)ADRL偽指令的功能,則編譯器報(bào)告錯(cuò)誤,編譯失敗。匯編器在處理源程序時(shí),ADRL偽指令被兩條具有ADRL等同功24以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:

MOV R0, #0x0F ADRL R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。253.小范圍地址讀取偽指令A(yù)DR它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。當(dāng)?shù)刂肥亲止?jié)對齊時(shí),取值范圍為-255~+255ADR{cond} register,=expression3.小范圍地址讀取偽指令A(yù)DR26下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:

MOV R0, #0x0F ADR R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOVR0,#0x0F0x00008004 SUBR0,PC,#12下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。274.空操作偽指令NOPNOP是空操作偽指令,在匯編時(shí)將會被替代成ARM中的空操作.4.空操作偽指令NOP28Thumb匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。其語法格式如下:LDR register,=expressionThumb匯編語言偽指令1.大范圍地址讀取偽指令LDR292.小范圍地址讀取偽指令A(yù)DRADR為小范圍地址讀取偽指令,它將基于PC相對偏移的地址值讀取到寄存器中。偏移量必須是正數(shù)并小于1KB。ADR register,=expression相當(dāng)于PC寄存器或其它寄存器的長轉(zhuǎn)移。2.小范圍地址讀取偽指令A(yù)DR30匯編器在處理源程序時(shí),ADR偽指令一條具有ADR等同功能的thumb指令(通常用ADD或SUB指令)替代。如果不能用一條指令實(shí)現(xiàn)ADR偽指令的功能,則編譯器報(bào)告錯(cuò)誤,編譯失敗。匯編器在處理源程序時(shí),ADR偽指令一條具有ADR等同功能的t313.空操作偽指令NOP

NOP是空操作偽指令,在匯編時(shí)將會被替代成ARM中的空操作(也就是什么也沒做)指令,例如可能為:“MOV R0,R0”NOP空操作偽指令可用于延時(shí)操作。3.空操作偽指令NOP32ARM匯編語言程序格式ARM匯編語言是以段(section)為單位來組織源文件的。段是相對獨(dú)立的、具有特定名稱的、不可分割的指令或者數(shù)據(jù)序列。段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。ARM匯編語言程序格式ARM匯編語言是以段(section33源程序的基本結(jié)構(gòu)舉例AREAEXAMPLE,CODE,READONLYENTRYstartMOVr0,#10MOVr1,#3ADDr0,r0,r1END本程序的程序體部分實(shí)現(xiàn)了一個(gè)簡單的加法運(yùn)算。

源程序的基本結(jié)構(gòu)舉例AREAEXAMPLE,CODE,R34源程序的基本結(jié)構(gòu)舉例/*MemorySetupstuff-takenfromblobmemsetup.S*/#include<config.h>#include<version.h>#defineBWSCON 0x48000000/*BWSCON*/#defineDW8 (0x0)#defineDW16 (0x1)_TEXT_BASE: .word TEXT_BASE.globllowlevel_initlowlevel_init:

/*memorycontrolconfiguration*/ /*maker0relativethecurrentlocationsothatit*/ /*readsSMRDATAoutofFLASHratherthanmemory!*/ ldrr0,=SMRDATA ldr r1,=lowlevel_init sub r0,r0,r1 adr r3,lowlevel_init /*r3<-currentpositionofcode*/ addr0,r0,r3 ldr r1,=BWSCON /*BusWidthStatusController*/ addr2,r0,#13*4源程序的基本結(jié)構(gòu)舉例/*MemorySetupstuf35源程序的基本結(jié)構(gòu)舉例0: ldrr3,[r0],#4 strr3,[r1],#4 cmpr2,r0 bne0b /*everythingisfinenow*/ mov pc,lr .ltorg/*theliteralpoolsorigin*/SMRDATA:.word(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)).word0x30.word0x30源程序的基本結(jié)構(gòu)舉例0:36zhaiQYARM偽指令zhaiQYARM偽指令37ARM匯編語言的偽操作ARM匯編語言的宏指令A(yù)RM匯編語言的偽指令A(yù)RM匯編語言程序設(shè)計(jì)主要內(nèi)容ARM匯編語言的偽操作主要內(nèi)容38兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ADS由ARM公司推出,使用了CodeWarrior公司的編譯器。針對ARM資源配置為用戶提供了在CodeWarriorIDE集成環(huán)境下配置各種ARM開發(fā)工具的能力。以ARM為目標(biāo)平臺的工程創(chuàng)建向?qū)В梢允褂脩粢源藶榛A(chǔ),快速創(chuàng)建ARM和Thumb工程。兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealView39兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ARM將Keil公司收購之后,正式推出了針對ARM微控制器的開發(fā)工具RealViewMDK或者M(jìn)DK,它將ARM開發(fā)工具RealViewDevelopmentSuite(簡稱RVDS)的編譯器RVCT與Keil的工程管理、調(diào)試仿真工具集成在一起,是一款非常強(qiáng)大的ARM微控制器開發(fā)工具。兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDT、RealView40兩種常見的ARM編譯開發(fā)環(huán)境GNUARM開發(fā)工具GNU是“GNU‘sNotUnix”的遞歸縮寫。在1983年9月27日由RichardStallman公開發(fā)起GNU計(jì)劃,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng)。GNU格式ARM匯編語言程序主要是面對在ARM平臺上移植嵌入式Linux操作系統(tǒng),GNU組織開發(fā)的基于ARM平臺的編譯工具有主要由GNU的匯編器as,交叉匯編器gcc和連接器ld組成。兩種常見的ARM編譯開發(fā)環(huán)境GNUARM開發(fā)工具41ADS編譯環(huán)境下的偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作可分為以下幾類:符號定義(SymbolDefinition)偽操作數(shù)據(jù)定義(DataDefinition)偽操作匯編控制(AssemblyControl)偽操作信息報(bào)告(Reporting)偽操作其他(Miscellaneous)偽操作ADS編譯環(huán)境下的偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作可42符號定義偽操作偽操作語法格式作用GBLAGBLAVariable聲明一個(gè)全局的算術(shù)變量,并將其初始化成0。GBLLGBLLVariable聲明一個(gè)全局的邏輯變量,并將其初始化成{FALSE}。GBLSGBLSVariable聲明一個(gè)全局的字符串變量,并將其初始化成空串“”。LCLALCLAVariable聲明一個(gè)局部的算術(shù)變量,并將其初始化成0。LCLLLCLLVariable聲明一個(gè)局部的邏輯變量,并將其初始化成{FALSE}。LCLSLCLSVariable聲明一個(gè)局部的串變量,并將其初始化成空串“”。SETASETAVariableexpr給一個(gè)全局或局部算術(shù)變量賦值。SETLSETLVariableexpr給一個(gè)全局或局部邏輯變量賦值。SETSSETSVariableexpr給一個(gè)全局或局部字符串變量賦值。RLISTnameLIST{listofregisters}為一個(gè)通用寄存器列表定義名稱。CNnameCNexpr為一個(gè)協(xié)處理器的寄存器定義名稱。CPnameCPexpr為一個(gè)協(xié)處理器定義名稱。DN/SNnameDN/SNexprDN/SN為一個(gè)雙精度/單精度的VFP寄存器定義名稱。FNnameFNexpr為一個(gè)FPA浮點(diǎn)寄存器定義名稱。符號定義偽操作偽操作語法格式作用GBLAGBLAVa43數(shù)據(jù)定義偽操作偽操作語法格式作用LTORGLTORG聲明一個(gè)數(shù)據(jù)緩沖池(也稱為文字池)的開始。MAPMAPexpr{,base-register}定義一個(gè)結(jié)構(gòu)化的內(nèi)存表(StorageMap)的首地址。FIELD{label}FIELDexpr定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。SPACE{label}SPACEexpr分配一塊連續(xù)內(nèi)存單元,并用0初始化。DCB{label}DCBexpr{,expr}分配一段字節(jié)內(nèi)存單元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字內(nèi)存單元。DCDO{label}DCDOexpr{,expr}…分配一段字對齊的字內(nèi)存單元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…為雙精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…為單精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。DCI{label}DCIexpr{,expr}…在ARM代碼中分配一段字對齊的內(nèi)存單元;在Thumb代碼中,分配一段半字對齊的半字內(nèi)存單元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以雙字(8個(gè)字節(jié))為單位的內(nèi)存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字對齊的半字內(nèi)存單元。數(shù)據(jù)定義偽操作偽操作語法格式作用LTORGLTORG聲明44匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能夠根據(jù)條件重復(fù)匯編相同的一段源代碼。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}…;宏代碼MENDMACRO標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束。MERIT用于從宏中跳轉(zhuǎn)出去。用MACRO和MEND定義的一段代碼,稱為宏定義體。通過宏名稱來調(diào)用宏。匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDI45信息報(bào)告?zhèn)尾僮?/p>

偽操作語法格式作用ASSERTASSERTlogicalexpression對匯編程序的第二遍掃描中,如果其中ASSERT中條件不成立,ASSERT偽操作將報(bào)告該錯(cuò)誤信息。INFOINFOnumeric-expression,string-expression在匯編處理過程的第一遍掃描或者第二遍掃描時(shí)INFO偽操作報(bào)告診斷信息。OPTOPTn通過OPT偽操作可以在源程序中設(shè)置列表選項(xiàng)。TTLTTLtitle在列表文件的每一頁的開頭插入一個(gè)標(biāo)題。SUBTSUBTsubtitle在列表文件的每一頁的開頭插入一個(gè)子標(biāo)題。信息報(bào)告?zhèn)尾僮鱾尾僮髡Z法格式作用ASSERTASSERT46偽操作語法格式作用CODE16CODE16說明后面的指令序列為16位的Thumb指令CODE32CODE32說明后面的指令序列為32位的ARM指令。EQUnameEQUexpr{,type}定義一個(gè)字符名稱,類似于C語言中的#define宏定義。AREAAREAsectionname{,attr}{,attr}…定義一個(gè)代碼段或者數(shù)據(jù)段。ENTRYENTRY指定程序的入口點(diǎn)。ENDEND說明到了源程序結(jié)尾。ALIGNALIGN{expr{,offset}}通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。EXPORT/GLOBALEXPORTsymbol{[WEAK]}聲明一個(gè)符號可以被其他文件引用.IMPORTIMPORTsymbol{[WEAK]}說明當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。EXTERNEXTERNsymbol{〔WEAK〕}說明當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。GET/INCLUDEGETfilename

將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCBININCBINfilename將一個(gè)文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。KEEPKEEP{symbol}說明將局部符號包含在目標(biāo)文件的符號表中。NOFPNOFP禁止源程序中包含浮點(diǎn)運(yùn)算指令。REQUIREREQUIRElable指定段之間的相互依賴關(guān)系。RNnameRNexpr為一個(gè)特定的寄存器定義名稱。ROUT{name}ROUT定義局部變量的有效范圍。其他偽操作偽操作語法格式作用CODE16CODE16說明后面的指令序47GNU編譯環(huán)境下的偽操作和宏指令GNU編譯環(huán)境下的偽操作可分為以下幾類:常量編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作GNU編譯環(huán)境下的偽操作和宏指令GNU編譯環(huán)境下的偽操作可48常量編譯控制偽操作偽操作語法格式作用.byte.byteexpr{,expr}…分配一段字節(jié)內(nèi)存單元,并用expr初始化。.hword/.short.hwordexpr{,expr}…分配一段半字內(nèi)存單元,并用expr初始化。.ascii.asciiexpr{,expr}…定義字符串expr(非零結(jié)束符)。.asciz/.string.ascizexpr{,expr}…定義字符串expr(以/0為結(jié)束符)。.float/.single.floatexpr{,expr}…定義一個(gè)32bitIEEE浮點(diǎn)數(shù)expr。.double.doubleexpr{,expr}…定義64bitIEEE浮點(diǎn)數(shù)expr。word/.long/.int.wordexpr{,expr}…分配一段字內(nèi)存單元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字節(jié)內(nèi)存單元,用size長度value填充repeat次。.zero.zerosize分配一段字節(jié)內(nèi)存單元,并用0填充內(nèi)存。.space/.skip.spacesize{,value}分配一段內(nèi)存單元,用value將內(nèi)存單元初始化。常量編譯控制偽操作偽操作語法格式作用.byte.byte49匯編程序代碼控制偽操作偽操作語法格式作用.section.sectionexpr定義域中包含的段。.text.text{subsection}將操作符開始的代碼編譯到代碼段或代碼段子段。.data.data{subsection}將操作符開始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段。.bss.bss{subsection}將變量存放到.bss段或.bss段的子段。.code16/.thumb.code16.thumb表明當(dāng)前匯編指令的指令集選擇Thumb指令集。.code32/.arm.code32.arm表明當(dāng)前匯編指令的指令集選擇ARM指令集。.end.end標(biāo)記匯編文件的結(jié)束行,即標(biāo)號后的代碼不作處理。.include.include“filename”將一個(gè)源文件包含到當(dāng)前源文件中。.align/.balign.align{alignment}{,fill}{,max}通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式。匯編程序代碼控制偽操作偽操作語法格式作用.section50宏及條件編譯控制偽操作

偽操作語法格式作用.macro、.exitm及.endm.macroacroname{parameter{,parameter}…}….endm.macro偽操作標(biāo)識宏定義的開始,.endm標(biāo)識宏定義的結(jié)束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif當(dāng)滿足某條件時(shí)對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時(shí)則編譯另一組語句。其中else可以缺省。宏及條件編譯控制偽操作偽操作語法格式作用.macro、.51其他偽操作偽操作語法格式作用.eject.eject在匯編符號列表文件中插入一分頁符。.list.list產(chǎn)生匯編列表(從.list到.nolist)。.nolist.nolist表示匯編列表結(jié)束處。.title.title“heading”使用“heading”作為標(biāo)題。.sbttl.sbttl“heading”使用“heading”作為子標(biāo)題。.ltorg.ltorg在當(dāng)前段的當(dāng)前地址(字對齊)產(chǎn)生一個(gè)文字池。.req.reqname,expr為一個(gè)特定的寄存器定義名稱。.err.err使編譯時(shí)產(chǎn)生錯(cuò)誤報(bào)告。.print.printstring打印信息到標(biāo)準(zhǔn)輸出。.fail.failexpr編譯匯編文件時(shí)產(chǎn)生警告。其他偽操作偽操作語法格式作用.eject.eject在匯52匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊助記符,它不在處理器運(yùn)行期間由機(jī)器執(zhí)行,只是在匯編時(shí)將被合適的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正的指令操作。匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊53ARM匯編語言語句格式

ARM匯編語言語句格式如下所示:{symbol}

{instruction|directive|pseudo-instruction}

{;comment}

其中:instruction為指令。directive為偽操作。pseudo-instruction為偽指令。symbol為符號。comment為語句的注釋。

ARM匯編語言語句格式ARM匯編語言語句格式如下所示:54ARM匯編語言的偽指令

偽指令語法格式作用ADRADR{cond}register,expr將基于PC或基于寄存器的地址值讀取到寄存器中。小范圍的地址讀取。ADRLADRL{cond}register,expr將基于PC或基于寄存器的地址值讀取到寄存器中。中等范圍的地址讀取。LDRLDR{cond}register,=[expr|label-expr]將一個(gè)32位的立即數(shù)或者一個(gè)地址值讀取到寄存器中。大范圍的地址讀取。NOPNOP在匯編時(shí)將被替換成ARM中的空操作。ARM匯編語言的偽指令偽指令語法格式作用ADRADR{c55ARM匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。LDR{cond} register,=expression

ARM匯編語言偽指令1.大范圍地址讀取偽指令LDR56如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV或MVN指令替代LDR偽指令。如果加載的常數(shù)不符合MOV或MVN指令立即數(shù)的要求,匯編器將常量放入內(nèi)存文字池,并使用一條程序相對偏移的LDR指令從內(nèi)存文字池讀出常量。如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV57偽指令語句:LDR R0, =0x0AA00;R0<—0x0AA00匯編后: MOV R0, #43520偽指令語句:582.中等范圍地址讀取偽指令A(yù)DRL它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。ADRL{cond} register,=expression2.中等范圍地址讀取偽指令A(yù)DRL59匯編器在處理源程序時(shí),ADRL偽指令被兩條具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用兩條指令實(shí)現(xiàn)ADRL偽指令的功能,則編譯器報(bào)告錯(cuò)誤,編譯失敗。匯編器在處理源程序時(shí),ADRL偽指令被兩條具有ADRL等同功60以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:

MOV R0, #0x0F ADRL R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。613.小范圍地址讀取偽指令A(yù)DR它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。當(dāng)?shù)刂肥亲止?jié)對齊時(shí),取值范圍為-255~+255ADR{cond} register,=expression3.小范圍地址讀取偽指令A(yù)DR62下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:

MOV R0, #0x0F ADR R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOVR0,#0x0F0x00008004 SUBR0,PC,#12下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。6

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論