嵌入式系統(tǒng)概論第八章_第1頁
嵌入式系統(tǒng)概論第八章_第2頁
嵌入式系統(tǒng)概論第八章_第3頁
嵌入式系統(tǒng)概論第八章_第4頁
嵌入式系統(tǒng)概論第八章_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章ARM匯編語言程序設(shè)計盡管ARM嵌入式系統(tǒng)主要采用C語言作為開發(fā)語言,但是一些底層代碼和關(guān)鍵代碼還是需要用匯編語言編寫。因為手工編寫的匯編代碼能達到最好的優(yōu)化效果。學習ARM匯編語言程序設(shè)計需要有ARM匯編語言編譯器。前主要的ARM匯編語言編譯器有三個:一個是ARM公司開發(fā)的標準ARM匯編語言編譯器armasm;另一個是GNU為支持ARM而開發(fā)的GNUARM匯編語言編譯器

arm-elf-as;還有一個是IAR公司開發(fā)的IARARM匯編語言編譯器iasmarm。本章主要介紹ADS環(huán)境下標準ARM匯編語言程序設(shè)計。目錄8.1用ADS調(diào)試ARM匯編語言程序8.2ARM匯編語言程序基本結(jié)構(gòu)8.3ARM匯編語言程序中的符號和表達式8.4ARM匯編語言偽操作8.5ARM匯編語言程序偽指令8.6ARM匯編語言程序宏指令8.7ARM匯編語言程序子程序8.8GNUARM匯編簡介習題8.1用ADS調(diào)試ARM匯編語言程序

ADS(ARMDeveloperSuite)是ARM公司推出的ARM系統(tǒng)開發(fā)工具,最新版本是1.2。主要應用平臺為各種版本的Windows。ARMADS由以下六部分組成:1.代碼生成工具(CodeGenerationTools)2.集成開發(fā)環(huán)境(CodeWarriorIDEfromMetrowerks)3.調(diào)試器(Debuggers)4.指令集模擬器(InstructionSetSimulators)5.ARM開發(fā)包(ARMFirmwareSuite)6.ARM應用庫(ARMApplicationsLibrary)8.1用ADS調(diào)試ARM匯編語言程序1.在命令行方式下調(diào)試假設(shè)ARM匯編語言源程序名為ex3_1.s

用工具armasm匯編ex3_1.s,生成目標代碼ex1.o:

c:\asm>armasmex3_1.s–oex1.o

用工具armlink鏈接目標代碼ex1.o,生成可執(zhí)行文件ex1:

c:\asm>armlinkex1.o–oex1

用工具armsd調(diào)試可執(zhí)行文件ex1:

c:\asm>armsdex18.1用ADS調(diào)試ARM匯編語言程序2.在IDE環(huán)境下調(diào)試創(chuàng)建一個新工程:8.1用ADS調(diào)試ARM匯編語言程序2.在IDE環(huán)境下調(diào)試編譯和鏈接工程:8.1用ADS調(diào)試ARM匯編語言程序2.在IDE環(huán)境下調(diào)試在AXD中調(diào)試工程:8.2ARM匯編語言程序基本結(jié)構(gòu)ARM匯編語言程序基本結(jié)構(gòu)包括ARM匯編語言語句格式和ARM匯編語言程序格式,下面分別介紹。1.ARM匯編語言語句格式:ARM匯編語言語句格式如下所示:{symbol}{instruction|pseudo-instruction|directive}{;comment}symbol為符號。instruction為機器指令。pseudo-instruction為偽指令。directive為偽操作。comment為注釋。8.2ARM匯編語言程序基本結(jié)構(gòu)2.ARM匯編語言程序結(jié)構(gòu):ARM匯編語言以段(section)為單位組織匯編語言源程序。段分為代碼段和數(shù)據(jù)段兩種,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼段運行時操作的數(shù)據(jù)。一個ARM匯編語言源程序可以沒有數(shù)據(jù)段,但至少要有一個代碼段。一個大的程序可能包含多個代碼段和數(shù)據(jù)段。ARM匯編語言源程序經(jīng)過匯編鏈接處理后生成一個可執(zhí)行的映像文件(elf或axf格式)。該可執(zhí)行的映像文件通常包括三個部分的內(nèi)容:一個或多個代碼段。代碼段通常是只讀的。零個或多個包含初始值的數(shù)據(jù)段。數(shù)據(jù)段通常是可讀寫的。零個或多個不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,通常是可讀寫的。8.3ARM匯編語言程序的符號和表達式在ARM匯編語言中,符號包括變量、數(shù)字常量、標號和局部標號,表達式包括數(shù)字表達式、字符串表達式、邏輯表達式和預定義表達式。1.ARM匯編語言中的符號在ARM匯編語言中,符號可以代表地址、變量和數(shù)字常量。變量在ARM匯編語言中,變量包括數(shù)字變量、邏輯變量和字符串變量。數(shù)字常量在ARM匯編語言中,數(shù)字常量是32位的整數(shù)。標號標號是程序中的指令或者數(shù)據(jù)地址的符號。局部標號局部標號是一個0~99之間的數(shù)字。8.3ARM匯編語言程序的符號和表達式2.ARM匯編語言中的表達式表達式是由符號、數(shù)值、單目或多目操作符以及符號組成的。數(shù)字表達式數(shù)字表達式由數(shù)字常量、數(shù)字變量、操作符和括號組成。字符串表達式字符串表達式由字符串常量、字符串變量、字符串操作符和括號組成。邏輯表達式邏輯表達式由邏輯常量{true}和{false}、邏輯變量、關(guān)系運算符、邏輯操作符和括號組成,取值范圍為{true}或{false}。預定義表達式在ARM匯編語言中,預定義表達式包括各種指令助記符、寄存器名和預定義變量。8.4ARM匯編語言的偽操作在ARM匯編語言中,共有如下6種偽操作,分別是符號定義偽操作、數(shù)據(jù)定義偽操作、雜項偽操作、匯編控制偽操作、信息報告?zhèn)尾僮骱涂蚣苊枋鰝尾僮鳌?.符號定義(SymbolDefinition)偽操作

符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名。常見的符號定義偽操作有如下幾種:Gable

LCLx

SETxRLIST其他符號定義偽操作8.4ARM匯編語言的偽操作2.數(shù)據(jù)定義(DataDefinition)偽操作

數(shù)據(jù)定義偽操作主要包括DCx、SPACE、MAP、FIELD及LTORG。

DCxDCx偽操作用于分配一塊數(shù)據(jù)單元并初始化,主要包括DCB、DCW、DCWU、DCD、DCDU、DCQ、DCQU、DCFS、DCFSU、DCFD、DCFDU、DCI和DCDO。SPACESPACE用于分配一段內(nèi)存單元,并用0初始化。

MAP和FIELDMAP偽操作和FIELD偽操作配合使用,用來定義結(jié)構(gòu)化內(nèi)存表的結(jié)構(gòu)。

LTORGLTORG偽操作用于聲明一個數(shù)據(jù)緩沖池(literalpool)的開始。

8.4ARM匯編語言的偽操作3.雜項偽操作

雜項偽操作主要包括AREA、ENTRY、CODE16和CODE32、END、RN、ALIGN、EQU、EXPORT或GLOBAL、EXTERN、GET或INCLUDE、IMPORT、INCBIN、KEEP、NOFP、REQUIRE、REQUIRE8及PRESERVER8和ROUT。8.4ARM匯編語言的偽操作4.匯編控制偽操作

匯編控制偽操作主要用于條件匯編,包括IF類和WHILE類偽操作。IF、ELSE及ENDIFIF類偽操作能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。ENDIFWHILE和WENDWHILE和WEND偽操作能夠根據(jù)條件重復匯編相同的或者幾乎相同的一段源代碼。8.4ARM匯編語言的偽操作5.信息報告?zhèn)尾僮?/p>

信息報告?zhèn)尾僮饔糜谠趨R編過程中報告匯編錯誤信息和診斷信息,主要包括ASSERT、INFO、OPT、TTL及SUBT。ASSERTASSERT偽操作在匯編編譯器對匯編程序的第二遍掃描中,如果發(fā)現(xiàn)assertion中條件不成立,則報告錯誤信息。INFOINFO偽操作支持在匯編處理過程的第一遍掃描或第二遍掃描中報告診斷信息。OPTOPT偽操作在源程序中設(shè)置列表選項。8.5ARM匯編語言程序偽指令

ARM匯編語言提供的偽操作和偽指令都是為了方便用戶編寫匯編語言程序,但二者的使用方法是有區(qū)別的。上一節(jié)介紹的偽操作只供匯編編譯器和連接器在匯編何連接時使用,在程序運行時不會出現(xiàn)任何偽操作,而本節(jié)將要介紹的偽指令則在匯編時被匯編編譯器替換成能完成該偽指令功能的ARM或Thumb指令序列。ARM偽指令包括ADR、ADRL、LDR和NOP,其中NOP偽指令在匯編時被替換成ARM中的空操作,比如MOVR0,R0,其含義就是什么都不做,但占用了指令周期。本節(jié)主要介紹前3個偽指令。8.5ARM匯編語言程序偽指令1.ADR:ADR偽指令將基于PC的地址值或基于寄存器的地址值讀取到寄存器中,在編譯時被替換成一條合適的指令。其語法格式為:ADR{cond} register,expr其中,cond為指令執(zhí)行的條件;register為目標寄存器;expr為基于PC或基于寄存器(MAP和FIELD偽操作)的地址表達式,其取值范圍為:當?shù)刂分挡皇亲謱R時,其取值范圍為-255~255。當?shù)刂分凳亲謱R時,其取值范圍為-1020~1020(255個字)。在匯編編譯器處理源程序時,ADR偽指令通常用一條ADD或SUB指令來實現(xiàn)ADR偽指令的功能。如果不能用一條指令實現(xiàn)ADR偽指令的功能,編譯器將報告錯誤。8.5ARM匯編語言程序偽指令2.ADRL:ADRL偽指令將基于PC的地址值或基于寄存器的地址值讀取到寄存器中,ADRL偽指令比ADR偽指令可以讀取范圍更大的地址,在編譯時被替換成2條合適的指令。其語法格式為:ADRL{cond} register,expr其中,cond為指令執(zhí)行的條件;register為目標寄存器;expr為基于PC或基于寄存器的地址表達式,其取值范圍為:當?shù)刂分挡皇亲謱R時,其取值范圍為-64K~64K。當?shù)刂分凳亲謱R時,其取值范圍為-256K~256K。在匯編編譯器處理源程序時,ADRL偽指令通常用兩條指令來實現(xiàn)ADRL偽指令的功能,即使一條指令可以完成該偽指令的功能,匯編器也將用兩條指令來替換該偽指令。8.5ARM匯編語言程序偽指令3.LDR:LDR偽指令將一個32位的常數(shù)或者一個地址值讀取到寄存器中,LDR偽指令比ADRL偽指令可以讀取范圍更大的地址。其語法格式為:LDR{cond}register,=[expr|label-expr]其中,cond為指令執(zhí)行的條件;register為目標寄存器;=是LDR偽指令與LDR機器指令區(qū)別的標志;expr為32位的常數(shù),編譯器將根據(jù)expr的取值情況,如下處理LDR偽指令:當expr表示的數(shù)值沒有超過MOV或MVN指令中立即數(shù)的范圍時,編譯器用合適的MOV或MVN指令來替代LDR偽指令。MOV指令中立即數(shù)的范圍是0~255或者是能通過循環(huán)右移一個8位二進制數(shù)偶數(shù)次能產(chǎn)生的數(shù)(參見7.2節(jié)操作數(shù)預處理的內(nèi)容)。當expr表示的數(shù)值超過MOV或MVN指令中立即數(shù)的范圍時,編譯器將該數(shù)值放到數(shù)據(jù)緩沖區(qū)中,同時用一條基于PC的LDR指令讀取該數(shù)值。8.6ARM匯編語言程序宏指令宏是匯編語言程序設(shè)計中一個非常重要的概念。從功能上來說,宏類似于C語言中的函數(shù),因為宏能實現(xiàn)某種特定的功能,并且還能實現(xiàn)參數(shù)傳遞。從實現(xiàn)上來說,宏又像匯編程序中的偽指令,因為宏在匯編時將其名稱直接替換為相應的代碼段。ARM匯編語言用MACRO和MEND兩條偽操作來定義一個宏,其中MACRO偽操作標識宏定義的開始,MEND標識宏定義的結(jié)束,中間的代碼稱為宏定義體。為便于引用,為每個定義的宏要取個名字,稱為宏指令。這樣在程序中就可以通過宏指令多次調(diào)用定義的代碼段。8.6ARM匯編語言程序宏指令ARM匯編語言宏指令的其語法格式為:MACRO{$label}macroname{$parameter{,$parameter}…};code…;codeMEND其中,$label在宏指令被展開時替換成相應的符號,通常是一個標號,在一個符號前使用$表示程序被匯編時將使用相應的值來替換$后的符號;macroname為所定義的宏的名稱,即宏指令;$parameter為宏指令的參數(shù),當宏指令被展開時將被替換成相應的值,類似于函數(shù)中的形式參數(shù),可以在宏定義時為參數(shù)指定相應的默認值;code表示宏定義體中的代碼。8.7ARM匯編語言程序子程序

ARM匯編語言程序的子程序調(diào)用比較簡單。首先,子程序不需要定義,任何一段代碼都可以當作子程序,只要在該代碼中含有返回的匯編語句即可;其次,調(diào)用子程序只需BL或BX指令即可。8.7ARM匯編語言程序子程序

ARM匯編語言程序子程序?qū)嵗? AREA ex10,CODE,READONLY2 ENTRY3 CODE324 ADR r0,start+15 BX r06 CODE167start MOV r0,#108 MOV r1,#39 BL doadd10 stop MOV r0,#0x1811 LDR r1,=0x2002612 SWI 0xAB13 doadd ADD r0,r0,r114 MOV pc,lr15 END8.8GNUARM匯編簡介GNU匯編支持多種

溫馨提示

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

評論

0/150

提交評論