版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章ARM指令集和匯編語言程序本章主要介紹以下內(nèi)容:ARM指令集的基本特點(diǎn)與Thumb指令集的區(qū)別與x86處理器的區(qū)別ARM指令格式ARM尋址方式ARM指令集分類詳解ARM匯編語言的指示符ARM匯編語言語句格式ARM匯編語言程序格式ARM匯編語句格式和程序格式進(jìn)階ARM匯編語言程序舉例4/3/20241第5章ARM指令集和匯編語言程序本章主要介紹以下內(nèi)容:4/本講主要參考文獻(xiàn)ARM公司英文資料:ADS_AssemblerGuide_B.pdfDDI0100E_ARM_ARM.pdf中文圖書《ARM體系結(jié)構(gòu)與編程》,清華大學(xué)出版社《嵌入式系統(tǒng)基礎(chǔ)教程》,機(jī)械工業(yè)出版社4/3/20242本講主要參考文獻(xiàn)ARM公司英文資料:4/2/202425.4ARM匯編語言程序的指示符ARM匯編語言源程序中語句由指令、指示符和宏指令組成。在ARM中將directive稱做指示符ARM的指示符指令相當(dāng)于x86的偽指令在ARM中pseudo-instruction被稱為偽指令A(yù)RM指令集中只有4條偽指令而宏指令則是通過指示符定義的。使用MACRO和MEND指示符4/3/202435.4ARM匯編語言程序的指示符ARM匯編語言源程序中語句5.4.1符號(hào)定義指示符符號(hào)定義(Symboldefinition)指示符用于定義ARM匯編程序中的變量,對(duì)變量進(jìn)行賦值以及定義寄存器名稱。包括以下指示符:GBLA,GBLL及GBLS聲明全局變量;LCLA,LCLL及LCLS聲明局部變量;SETA,SETL及SETS給變量賦值;RLIST為通用寄存器列表定義名稱;CN為協(xié)處理器的寄存器定義名稱;CP為協(xié)處理器定義名稱;DN及SN為VFP的寄存器定義名稱;FN為FPA的浮點(diǎn)寄存器定義名稱。4/3/202445.4.1符號(hào)定義指示符符號(hào)定義(Symboldefin5.4.2數(shù)據(jù)定義指示符數(shù)據(jù)定義(Datadefinition)指示符包括以下的指示符:LTORG聲明一個(gè)數(shù)據(jù)緩沖池(literalpool)的開始;MAP定義一個(gè)結(jié)構(gòu)化的內(nèi)存表(storagemap)的首地址;FIELD定義結(jié)構(gòu)化的內(nèi)存表中的一個(gè)數(shù)據(jù)域(field);SPACE分配一塊內(nèi)存單元,并用0初始化;DCB分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化;DCD及DCDU分配一段字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化;DCDO分配一段字的內(nèi)存單元,并將單元的內(nèi)容初始化成該單元相對(duì)于靜態(tài)基值寄存器的偏移量。4/3/202455.4.2數(shù)據(jù)定義指示符數(shù)據(jù)定義(Datadefini數(shù)據(jù)定義指示符(續(xù))DCFD及DCFDU分配一段雙字的內(nèi)存單元,并用雙精度的浮點(diǎn)數(shù)據(jù)初始化。DCFS及DCFSU分配一段字的內(nèi)存單元,并用單精度的浮點(diǎn)數(shù)據(jù)初始化。DCI分配一段字節(jié)的內(nèi)存單元,用指定的數(shù)據(jù)初始化,指定內(nèi)存單元中存放的是代碼,而不是數(shù)據(jù)。DCQ及DCQU分配一段雙字的內(nèi)存單元,并用64位的整數(shù)數(shù)據(jù)初始化。DCW及DCWU分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化。DATA在代碼段中使用數(shù)據(jù)?,F(xiàn)已不再使用,僅用于保持向前兼容。4/3/20246數(shù)據(jù)定義指示符(續(xù))DCFD及DCFDU分配一段雙字的內(nèi)5.4.3匯編控制指示符匯編控制(Assemblycontrol)指示符包括下面的指示符:IF,ELSE及ENDIF匯編或者不匯編一段源代碼WHILE及WEND條件重復(fù)匯編相同的一段源代碼MACRO及MEND標(biāo)識(shí)宏定義開始與結(jié)束MEXIT用于從宏跳轉(zhuǎn)出去4/3/202475.4.3匯編控制指示符匯編控制(Assemblyco5.4.4信息報(bào)告指示符信息報(bào)告(Reporting)指示符包括下列指示符:ASSERT在匯編編譯器對(duì)匯編程序的第二趟掃描中,如果其中的ASSERTION中條件不成立,ASSERT偽操作將報(bào)告該錯(cuò)誤信息。INFO支持第一二趟匯編掃描時(shí)報(bào)告診斷信息。OPTTTL及SUBT4/3/202485.4.4信息報(bào)告指示符信息報(bào)告(Reporting)指5.4.5其他指示符這些雜類的指示符包括:ALIGNAREACODE16及CODE32ENDENTRYEQUEXPORT或GLOBAL4/3/202495.4.5其他指示符這些雜類的指示符包括:4/2/202其他的指示符(續(xù))EXTERNGET或INCLUDEIMPORTINCBINKEEPNOFPREQUIREREQUIRE8及PRESERVE8RNROUT4/3/202410其他的指示符(續(xù))EXTERN4/2/2024105.4.5.1AREAAREA指示符用于定義一個(gè)代碼段或者數(shù)據(jù)段。語法格式AREAsectionname{,attr}{,attr}....其中:sectionname為所定義的代碼段或者數(shù)據(jù)段的名稱。如果該名稱是以數(shù)字開頭的,則該名稱必須用“|”括起來,如|1_datasec|。還有一些代碼段具有約定的名稱,如|.text|表示C語言編譯器產(chǎn)生的代碼段或者是與C語言庫(kù)相關(guān)的代碼段。Attr是該代碼段(或者程序段)的屬性。在AREA指示符中,各屬性間用逗號(hào)隔開。4/3/2024115.4.5.1AREAAREA指示符用于定義一個(gè)代碼段或AREA的屬性下面列舉主要的屬性:ALIGN=expression。默認(rèn)的情況下,ELF的代碼段和數(shù)據(jù)段是4字節(jié)對(duì)齊的。Expression可以取0~31的數(shù)值,相應(yīng)的對(duì)齊方式為(2expression)字節(jié)對(duì)齊。如expression=3時(shí)為8字節(jié)對(duì)齊。ASSOC=section。指定與本段相關(guān)的ELF段。任何時(shí)候連接section段也必須包括sectionname段。CODE定義代碼段。默認(rèn)屬性為READONLY。COMDEF定義一個(gè)通用的段。該段可以包含代碼或者數(shù)據(jù)。在個(gè)源文件中,同名的COMDEF段必須相同。4/3/202412AREA的屬性下面列舉主要的屬性:4/2/202412AREA的屬性(續(xù))COMMON定義一個(gè)通用的段。該段不包含任何用戶代碼和數(shù)據(jù),連接器將其初始化為0。各源文件中同名的COMMON段公用同樣的內(nèi)存單元,連接器為起分配合適的尺寸。DATA
定義數(shù)據(jù)段。默認(rèn)屬性為READWRITE。NOINIT指定本數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒有將各初始值寫入內(nèi)存單元,或者將個(gè)內(nèi)存單元值初始化為0。READONLY指定本段為只讀,代碼段的默認(rèn)屬性為READONLY。READWRITE指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE。4/3/202413AREA的屬性(續(xù))COMMON定義一個(gè)通用的段。該段不包AREA指示符舉例舉例下面的指示符定義了一個(gè)代碼段,代碼段的名稱為Mainpro,屬性為READONLY。AREAMainpro,CODE,READONLY;codesegment4/3/202414AREA指示符舉例舉例4/2/2024145.4.5.2EQUEQU指示符為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)(基于PC的值)定義一個(gè)字符名稱。*是EQU的同義詞。語法格式nameEQUexpr{,type}其中:expr為基于寄存器的地址值、程序中的標(biāo)號(hào)、32位的地址常量或者32位的常量。name為EQU指示符為expr定義的字符名稱。type當(dāng)expr為32位常量時(shí),可以使用type指示expr表示的數(shù)據(jù)的類型。4/3/2024155.4.5.2EQUEQU指示符為數(shù)字常量、基于寄存器的EQU(續(xù))type有下面3種取值:CODE16CODE32DATA使用說明EQU指示符的作用類似于C語言中的#define,用于為一個(gè)常量定義字符名稱。示例abcdEQU2 ;定義abcd符號(hào)的值為2abcdEQUlabel+16 ;定義abcd符號(hào)的值(label+16)addr1EQU0xlC,CODE32 ;定義addr1符號(hào)值為 ;絕對(duì)地址值0xlC,而且該處為ARM指令。4/3/202416EQU(續(xù))type有下面3種取值:4/2/2024165.4.5.3ENTRYENTRY指示符指定程序的入口點(diǎn)語法格式ENTRY使用說明一個(gè)程序(可以包含多個(gè)源文件)中至少要有一個(gè)ENTRY(可以有多個(gè)ENTRY),但一個(gè)源文件中最多只能有一個(gè)ENTRY(可以沒有ENTRY)。示例AREAexample,CODE,READONLYENTRY;應(yīng)用程序的入口點(diǎn)4/3/2024175.4.5.3ENTRYENTRY指示符指定程序的入口點(diǎn)5.4.5.4CODE16和CODE32CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令。CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。語法格式CODE16CODE32使用說明當(dāng)匯編源程序中同時(shí)包含ARM指令和Thumb指令時(shí),使用CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令;使用CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告訴編譯器后面指令的類型,該指示符本身并不進(jìn)行程序狀態(tài)的切換。4/3/2024185.4.5.4CODE16和CODE32CODE16指示CODE16/CODE32舉例 在下面的例子中,程序先在ARM狀態(tài)下執(zhí)行,然后通過BX指令切換到Thumb狀態(tài),并跳轉(zhuǎn)到相應(yīng)的Thumb指令處執(zhí)行。在Thumb程序入口處用CODE16指示符標(biāo)識(shí)下面的指令為Thumb指令。參看下面的指令段:
………………. AREAChangeState,CODE,READONLY CODE32 ;指示下面的指令為ARM指令 LDRr0,=start+1 BXr0 ;切換到Thumb,并跳轉(zhuǎn)到start處執(zhí)行 CODE16 ;指示下面的指令為Thumb指令start MOVr1,#104/3/202419CODE16/CODE32舉例 在下面的例子中,程序先在AR5.4.5.5ENDEND指示符告訴編譯器已經(jīng)到了源程序結(jié)尾。語法格式:END使用說明:每一個(gè)匯編源程序都包含END指示符,以告訴本源程序的結(jié)束。示例: AREAexampleCODE,READONLY………………END………4/3/2024205.4.5.5ENDEND指示符告訴編譯器已經(jīng)到了源程序5.4.5.6ALIGNALIGN指示符通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式。語法格式ALIGN{expr{,offset}}其中,expr為數(shù)字表達(dá)式,用于指定對(duì)齊方式。可能的取值為2的次冪,如1、2、4、8等。如果指示符中沒有指定expr,則當(dāng)前位置對(duì)齊到下一個(gè)字邊界處。offset為數(shù)字表達(dá)式。當(dāng)前位置對(duì)齊到下面形式的地址處:offset+n*expr。4/3/2024215.4.5.6ALIGNALIGN指示符通過添加補(bǔ)丁字節(jié)使ALIGN(續(xù)1)使用說明下面的情況中,需要特定的地址對(duì)齊方式:Thumb的宏指令A(yù)DR要求地址是字對(duì)齊的,而Thumb代碼中地址標(biāo)號(hào)可能不是字對(duì)齊的。這時(shí)就要使用指示符ALIGN4使Thumb代碼中的地址標(biāo)號(hào)字對(duì)齊。由于有些ARM處理器的CACHE采用了其他對(duì)齊方式,如16字節(jié)的對(duì)齊方式,這時(shí)使用ALIGN指示符指定合適的對(duì)齊方式可以充分發(fā)揮該CACHE的性能優(yōu)勢(shì)。LDRD及STRD指令要求內(nèi)存單元是8字節(jié)對(duì)齊的。這樣在為這兩個(gè)指令分配的內(nèi)存單元前要使用ALIGN8實(shí)現(xiàn)8字節(jié)對(duì)齊方式。地址標(biāo)號(hào)通常自身沒有對(duì)齊要求。而在ARM代碼中要求地址標(biāo)號(hào)是字對(duì)齊的,在Thumb代碼中要求字節(jié)對(duì)齊。這樣需要使用合適的ALIGN指示符來調(diào)整對(duì)齊方式。4/3/202422ALIGN(續(xù)1)使用說明4/2/2024225.4.5.7EXPORT及GLOBALEXPRORT聲明一個(gè)符號(hào)可以被其他文件引用。相當(dāng)于聲明了一個(gè)全局變量。GLOBAL是EXPORT的同義詞。語法格式EXPORTsymbol{[WEAK]}其中,symbol為聲明的符號(hào)名稱,大小寫敏感。[WEAK]選項(xiàng)聲明其他的同名符號(hào)優(yōu)先于本符號(hào)被引用。使用說明使用EXPORT指示符聲明一個(gè)源文件中的符號(hào),使得該符號(hào)可以被其他源文件引用。示例AREAExample,CODE,READONLYEXPORTDo_Add;函數(shù)名稱DoAdd可以被引用4/3/2024235.4.5.7EXPORT及GLOBALEXPRORT聲明5.4.5.8IMPORTIMPORT指示符告訴編譯器當(dāng)前的符號(hào)不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號(hào),而且不論本源文件是否實(shí)際引用該符號(hào),該符號(hào)都將被加入到本源文件的符號(hào)表中。語法格式IMPORTsymbol{[WEAK]}其中:symbol為聲明的符號(hào)的名稱。它是區(qū)分大小寫的。[WEAK]指定這個(gè)選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來的庫(kù)中去查找該符號(hào)。4/3/2024245.4.5.8IMPORTIMPORT指示符告訴編譯器當(dāng)IMPORT(續(xù))使用說明使用IMPORT指示符聲明一個(gè)符號(hào)是在其他源文件中定義的。如果連接器在連接處理時(shí)不能解析該符號(hào),而IMPORT指示符中沒有指定[WEAK]選項(xiàng),則連接器將會(huì)報(bào)告錯(cuò)誤。如果連接器在連接處理時(shí)不能解析該符號(hào),而IMPORT指示符中指定了[WEAK]選項(xiàng),則連接器將不會(huì)報(bào)告錯(cuò)誤,而是進(jìn)行下面的操作:<1>如果該符號(hào)被B或者BL指令引用,則該符號(hào)被設(shè)置成下一條指令的地址,該B或者BL指令相當(dāng)于一條NOP指令。<2>其他情況下該符號(hào)被設(shè)置為0。4/3/202425IMPORT(續(xù))使用說明4/2/2024255.4.5.9EXTERNEXTERN指示符告訴編譯器當(dāng)前的符號(hào)不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號(hào)。如果本源文件沒有實(shí)際引用該符號(hào),該符號(hào)都將不會(huì)被加入到本源文件的符號(hào)表中。語法格式EXTERNsymbol{[WEAK]}其中,symbol為聲明的符號(hào)的名稱。它是區(qū)分大小寫的。[WEAK]指定該選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來的庫(kù)中去查找該符號(hào)。4/3/2024265.4.5.9EXTERNEXTERN指示符告訴編譯器當(dāng)前EXTERN(續(xù)1)使用說明使用EXTERN指示符聲明一個(gè)符號(hào)是在其他源文件中定義的。如果連接器在連接處理時(shí)不能解析該符號(hào),而EXTERN指示符中沒有指定[WEAK]選項(xiàng),則連接器將會(huì)報(bào)告錯(cuò)誤。如果連接器在連接處理時(shí)不能解析該符號(hào),而EXTERN指示符中指定了[WEAK]選項(xiàng),則連接器將不會(huì)報(bào)告錯(cuò)誤,而是進(jìn)行下面的操作:<1>如果該符號(hào)被B或者BL指令引用,則該符號(hào)被設(shè)置成下一條指令的地址,該B或者BL指令相當(dāng)于一條NOP指令。<2>其他情況下該符號(hào)被設(shè)置為0。4/3/202427EXTERN(續(xù)1)使用說明4/2/202427EXTERN(續(xù)2)示例下面的代碼測(cè)試是否連接了C++庫(kù),并根據(jù)結(jié)果執(zhí)行不同的代碼AREAExample,CODE,READONLYEXTERN_CPP_INITIALIZE[WEAK] ;如果連接了c++庫(kù)則讀取;函數(shù)_CPP_INITIALIZE地址LDRr0,_CPP_INITIALIZECMPr0,#0 ;Testifzero.BEQnocplusplus;如果沒有連接C++庫(kù),則跳轉(zhuǎn)到nocplusplus4/3/202428EXTERN(續(xù)2)示例4/2/2024285.4.5.10GET及INCLUDEGET指示符將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCLUDE是GET的同義詞。語法格式GETfilename其中,filename為被包含的源文件的名稱。這里可以使用路徑信息。使用說明(1)通??梢栽谝粋€(gè)源文件中定義宏,用EQU定義常量的符號(hào)名稱,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,這樣的源文件類似于C語言中的.H文件。然后用GET指示符將這個(gè)源文件包含到它們的源文件中,類似于在C源程序的“include*.h”。4/3/2024295.4.5.10GET及INCLUDEGET指示符將一個(gè)源GET及INCLUDE(續(xù)1)使用說明(2)編譯器通常在當(dāng)前目錄中查找被包含的源文件??梢允褂镁幾g選項(xiàng)-I添加其他的查找目錄。同時(shí),被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。編譯器在查找C源文件時(shí)將把源文件B所在的目錄作為當(dāng)前目錄。GET指示符不能用來包含目標(biāo)文件(二進(jìn)制執(zhí)行文件)。包含目標(biāo)文件需要使用INCBIN指示符。4/3/202430GET及INCLUDE(續(xù)1)使用說明(2)4/2/2024GET及INCLUDE(續(xù)2)示例AREAExample,CODE,READONLYGETfile1.s ;包含源文件file1.sGETc:\project\file2.s;包含源文件file2.s,可以包含路徑信息GETc:\programfiles\file3.s;包含源文件file3.s,路徑信息中可以包含空格4/3/202431GET及INCLUDE(續(xù)2)示例4/2/2024315.4.5.11INCBININCBIN指示符將一個(gè)文件包含到(INCLUDE)當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。語法格式INCBINfilename其中,filename為被包含的文件的名稱。這里可以使用路徑信息。使用說明通??梢允褂肐NCBIN將一個(gè)執(zhí)行文件或者任意的數(shù)據(jù)包含到當(dāng)前文件中。被包含的執(zhí)行文件或數(shù)據(jù)將被原封不動(dòng)地放到當(dāng)前文件中。編譯器從INCBIN指示符后面開始繼續(xù)處理。4/3/2024325.4.5.11INCBININCBIN指示符將一個(gè)文件包INCBIN(續(xù))使用說明編譯器通常在當(dāng)前目錄中查找被包含的源文件??梢允褂镁幾g選項(xiàng)-I添加其他的查找目錄。同時(shí),被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。編譯器在查找C源文件時(shí)將把源文件B所在的目錄作為當(dāng)前目錄。這里所包含的文件名及路徑信息中都不能有空格。示例AREAExample,CODE,READONLYINCBINfile1.dat ;包含文件file1.datINCBINc:\project\file2.txt ;包含文件file2.txt4/3/202433INCBIN(續(xù))使用說明4/2/2024335.4.5.12NOFP使用NOFP指示符禁止源程序中包含浮點(diǎn)運(yùn)算指令。語法格式NOFP使用說明當(dāng)系統(tǒng)中沒有硬件或軟件仿真代碼支持浮點(diǎn)運(yùn)算指令時(shí),使用NOFP指示符禁止在源程序中使用浮點(diǎn)運(yùn)算指令。這時(shí)如果源程序中包含浮點(diǎn)運(yùn)算指令,編譯器將會(huì)報(bào)告錯(cuò)誤。同樣如果在浮點(diǎn)運(yùn)算指令的后面使用NOFP指示符,編譯器同樣將會(huì)報(bào)告錯(cuò)誤。4/3/2024345.4.5.12NOFP使用NOFP指示符禁止源程序中包含5.4.5.13REQUIREREQUIRE指示符指定段之間的相互依賴關(guān)系。語法格式REQUIRElabel
其中,label為所需要的標(biāo)號(hào)的名稱。使用說明當(dāng)進(jìn)行連接處理時(shí)包含了有REQUIRElabel指示符的源文件,則定義label的源文件也將被包含。4/3/2024355.4.5.13REQUIREREQUIRE指示符指定段之5.4.5.14RNRN指示符為一個(gè)特定的寄存器定義名稱。語法格式nameRNexpr其中:expr為某個(gè)寄存器的編碼。name為本指示符給寄存器expr定義的名稱。使用說明RN指示符用于給一個(gè)寄存器定義名稱。方便程序員記憶該寄存器的功能。4/3/2024365.4.5.14RNRN指示符為一個(gè)特定的寄存器定義名稱。5.5ARM匯編語言語句格式ARM匯編語言語句格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}其中:instruction為指令。在ARM匯編語言中,指令不能從一行的行頭開始。在一行語句中,指令的前面必須有空格或者符號(hào)。Directive是指示符。pseudo-instruction是偽指令。4/3/2024375.5ARM匯編語言語句格式ARM匯編語言語句格式如下所示ARM匯編語言語句格式(續(xù))symbol為符號(hào)。在ARM匯編語言中,符號(hào)必須從一行的行頭開始,并且符號(hào)中不能包含空格。在指令和偽指令中符號(hào)用作地址標(biāo)號(hào)(label);在有些指示符中,符號(hào)用作變量或者常量。comment為語句的注釋。在ARM匯編語言中注釋以分號(hào)“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨(dú)占用一行。4/3/202438ARM匯編語言語句格式(續(xù))symbol為符號(hào)。在ARM匯編ARM匯編程序編寫規(guī)范匯編語句格式ARM匯編中,所有標(biāo)號(hào)必須在一行的頂格書寫,其后面不要添加符號(hào)“:”。而所有指令均不能頂格書寫。ARM匯編器對(duì)標(biāo)識(shí)符大小寫敏感(即區(qū)分大小寫字母),書寫標(biāo)號(hào)及指令時(shí)字母大小寫要一致。在ARM匯編程序中,ARM指令、偽指令、寄存器名可以全部為大寫字母,也可以全部為小寫字母,但不要大小寫混合使用。源程序中,語句之間可以插入空行,以使得源代碼的可讀性更好。
4/3/202439ARM匯編程序編寫規(guī)范匯編語句格式4/2/202439ARM匯編程序編寫規(guī)范(續(xù))格式如下:[標(biāo)號(hào)]<指令|條件|S><操作數(shù)>[;注釋]源程序中允許有空行。適當(dāng)?shù)夭迦肟招?,可以提高源程序的可讀性。如果單行代碼太長(zhǎng),可以使用字符“\”將其分行?!癨”后不能有任何字符,包括空格和制表符等。對(duì)于變量的設(shè)置、常量的定義,其標(biāo)識(shí)符必須在一行的頂格書寫。下面給出了匯編指令正確和錯(cuò)誤的例子4/3/202440ARM匯編程序編寫規(guī)范(續(xù))格式如下:4/2/202440匯編指令正確的例子…Str1 SETS“MyString1.” ;設(shè)置字符串變量Str1Count RNR0 ;定義寄存器名CountUSR_STACK EQU64 ;定義常量
START LDRR0,=0x12345678;1235678H MOVR1,#0LOOP MOVR2,#1…4/3/202441匯編指令正確的例子…4/2/202441匯編指令錯(cuò)誤的例子
DOBMOVR0,#1 ;標(biāo)號(hào)DOB沒有頂格書寫ABC: MOVR1,#2 ;標(biāo)號(hào)不允許用符號(hào)“:”修飾MOV R2,#3 ;命令不允許頂格書寫loop Mov R2,#3 ;指令中大小寫混合 B Loop ;無法跳轉(zhuǎn)到loop標(biāo)號(hào),大小寫 ;不一致4/3/202442匯編指令錯(cuò)誤的例子DOBMOVR0,#1 5.6ARM匯編語言程序格式ARM匯編語言以段(section)為單位組織源文件。段是相對(duì)獨(dú)立的、具有特定名稱的、不可分割的指令或者數(shù)據(jù)序列。段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。4/3/2024435.6ARM匯編語言程序格式ARM匯編語言以段(sectiARM匯編源程序和映像文件ARM匯編語言源程序經(jīng)過匯編處理后生成一個(gè)可執(zhí)行的映像文件(類似于Windows系統(tǒng)下的EXE文件)。該可執(zhí)行的映像文件通常包括下面3部分:一個(gè)或多個(gè)代碼段。代碼段通常是只讀的。零個(gè)或多個(gè)包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段通常是可讀寫的。零個(gè)或多個(gè)不包含初始值的數(shù)據(jù)段。這些數(shù)據(jù)段被初始化為0,通常是可讀寫的。連接器根據(jù)一定的規(guī)則將各個(gè)段安排到內(nèi)存中的相應(yīng)位置。源程序中段之間的相鄰關(guān)系與執(zhí)行的映像文件中段之間的相鄰關(guān)系并不一定相同。4/3/202444ARM匯編源程序和映像文件ARM匯編語言源程序經(jīng)過匯編處理后ARM匯編源程序基本結(jié)構(gòu)舉例源程序基本結(jié)構(gòu)如下示出: AREAEXAMPLE1,CODE,READONLY ENTRYstart MOV r0,#10 MOV r1,#3 ADD r0,r0,r1 END4/3/202445ARM匯編源程序基本結(jié)構(gòu)舉例源程序基本結(jié)構(gòu)如下示出:4/2/案例ARM匯編源程序說明在ARM匯編語言源程序中,指示符AREA定義一個(gè)段。AREA指示符表示了一個(gè)段的開始,同時(shí)定義了這個(gè)段的名稱及相關(guān)屬性。在本例中定義了一個(gè)只讀的代碼段,其名稱為EXAMPLE1。ENTRY指示符標(biāo)識(shí)了程序執(zhí)行的第一條指令。一個(gè)ARM程序中可以有多個(gè)ENTRY,至少要有一個(gè)ENTRY。初始化部分的代碼以及異常中斷處理程序中都包含了ENTRY。如果程序包含了C代碼,C語言庫(kù)文件的初始化部分也包含了ENTRY。本程序的程序體部分實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的加法運(yùn)算。END指示符告訴匯編編譯器源文件結(jié)束。每一個(gè)匯編模塊必須包含一個(gè)END指示符,指示本模塊結(jié)束。4/3/202446案例ARM匯編源程序說明在ARM匯編語言源程序中,指示符AR匯編語言子程序調(diào)用在ARM匯編語言中,子程序調(diào)用是通過BL指令完成的。BL指令的語法格式如下:BLsubname其中,subname是調(diào)用的子程序的名稱。BL指令完成兩個(gè)操作:將子程序的返回地址放在LR寄存器中,同時(shí)將PC寄存器值設(shè)置成目標(biāo)子程序的第一條指令地址。在子程序返回時(shí)可以通過將LR寄存器的值傳送到PC寄存器中來實(shí)現(xiàn)。子程序調(diào)用時(shí)通常使用寄存器R0~R3來傳遞參數(shù)和返回結(jié)果。4/3/202447匯編語言子程序調(diào)用在ARM匯編語言中,子程序調(diào)用是通過BL指匯編子程序調(diào)用舉例子程序DOADD完成加法運(yùn)算,操作數(shù)放在R0和R1寄存器中,結(jié)果放在R0中。AREA EXAMPLE2,CODE,READONLY ENTRYstart MOVr0,#10 ;R0設(shè)置輸入?yún)?shù) MOVr1,#3 ;R1設(shè)置輸入?yún)?shù) BL doadd ;調(diào)用子程序doadddoadd ADDr0,r0,r1 ;子程序 MOV pc,lr ;從子程序中返回 END4/3/202448匯編子程序調(diào)用舉例子程序DOADD完成加法運(yùn)算,操作數(shù)放在RARM匯編子程序的嵌套調(diào)用舉例-1這里給出的ARM匯編程序嵌套調(diào)用范例程序做如下計(jì)算:求自然數(shù)1到9的階乘的總和,半主機(jī)方式輸出運(yùn)算結(jié)果如下圖所示。第3行顯示的是1~9的階乘,第2行顯示的是1!+2!+3!+4!+5!+6!+7!+8!+9!之總和。4/3/202449ARM匯編子程序的嵌套調(diào)用舉例-1這里給出的ARM匯編程序嵌ARM匯編子程序的嵌套調(diào)用舉例-2/*Thisprogramissemihostingoutputmode*//*Firstthemainfunctioncallassemblysummingsubprogram*//*Thenthesummingsubprogramcallassemblyfactorialsubprogram*/#include<stdio.h>externintasmFac(intn);structfactorial_sum{intcal_fn;intsum_fn;intfn[9];};externstructfactorial_sum*summing(structfactorial_sum*arg1);4/3/202450ARM匯編子程序的嵌套調(diào)用舉例-2/*ThisprogrARM匯編子程序的嵌套調(diào)用舉例-3intmain(void){ intj; structfactorial_sumfac={9,0,{1,1,1,1,1,1,1,1,1} };//設(shè)置參數(shù) structfactorial_sum*result; //申請(qǐng)變量作為返回值 printf("ExampleofamultiAssemblyprogramcalling!\n"); result=summing(&fac); //調(diào)用求和函數(shù)R0存放的是FAC變量的首地址 printf("Thetotalsumis%d\n",result->sum_fn); //輸出結(jié)果 for(j=0;j<9;j++){ printf("%d\t",(result->fn)[j]); } }4/3/202451ARM匯編子程序的嵌套調(diào)用舉例-3intmain(voidARM匯編子程序的嵌套調(diào)用舉例-4;thedetailsofparameterstransfercomesfromATPCS;iftherearemorethan4args,stackwillbeusedEXPORTsummingIMPORTasmFac ;說明用到了其他文件中的子匯編程序AREASUMMING,CODE,READONLYsumming STMFD SP!,{R4-R5} ldr r1,[r0] ;r1=cal_fn mov r2,#1 ;將r2設(shè)置為當(dāng)前需要計(jì)算的階乘數(shù), ;它從1變化到cal_fn add r3,r0,#8 ;將r3指向fn數(shù)組 mov r5,#0 ;r5為總和,初始值置為0loop cmp r1,r2 ;將cal_fn與當(dāng)前所需計(jì)算的階乘值比較 blt back ;如果小于,則返回4/3/202452ARM匯編子程序的嵌套調(diào)用舉例-4;thedetailsARM匯編子程序的嵌套調(diào)用舉例-5 STMFD SP!,{R0-R3,lr} ;保存ro~r3,lr ;因?yàn)檎{(diào)用了外部文件的匯編子程序 mov r0,r2 ;將r0設(shè)置為當(dāng)前所需計(jì)算的階乘值 bl asmFac ;調(diào)用階乘函數(shù) mov r4,r0 ;將返回值(階乘)存在r4中 ldmfd SP!,{R0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)渠施工方案
- 2025版綠色環(huán)保干洗店連鎖經(jīng)營(yíng)合作協(xié)議3篇
- 2025年度企業(yè)行紀(jì)合同買賣辦公樓及附屬設(shè)施協(xié)議3篇
- 深大基坑開挖施工方案
- 2025年度二零二五年度“師帶徒”教育創(chuàng)新與實(shí)踐應(yīng)用合同3篇
- 2024版全新新婚姻法協(xié)議離婚下載
- 2025版高品質(zhì)物業(yè)合同小區(qū)服務(wù)規(guī)范
- 2024年試用期內(nèi)員工合同范本
- 2025年小型路面保潔設(shè)備合作協(xié)議書
- 2024年生物質(zhì)能源項(xiàng)目投資借款協(xié)議書范本6篇
- 前列腺癌根治術(shù)護(hù)理查房課件
- AQ 1017-2005 煤礦井下安全標(biāo)志(正式版)
- 甘肅2024年甘肅省公安廳招聘輔警109人筆試歷年典型考題及考點(diǎn)附答案解析
- 小升初數(shù)學(xué)《選擇題》100道有答案解析
- 2024年中考英語真題-帶答案
- 剪映專業(yè)版:PC端短視頻制作(全彩慕課版) 課件 第3章 短視頻剪輯快速入門
- (高清版)JTG 6310-2022 收費(fèi)公路聯(lián)網(wǎng)收費(fèi)技術(shù)標(biāo)準(zhǔn)
- 儲(chǔ)能一體柜技術(shù)協(xié)議
- 設(shè)備間火災(zāi)應(yīng)急預(yù)案
- 2024年高考語文閱讀之孫犁小說專練(原卷版)
- 帶狀皰疹與帶狀皰疹后遺神經(jīng)痛(HZ與PHN)
評(píng)論
0/150
提交評(píng)論