第10講第5章ARM匯編語言程序指示符與語句格式課件_第1頁
第10講第5章ARM匯編語言程序指示符與語句格式課件_第2頁
第10講第5章ARM匯編語言程序指示符與語句格式課件_第3頁
第10講第5章ARM匯編語言程序指示符與語句格式課件_第4頁
第10講第5章ARM匯編語言程序指示符與語句格式課件_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《嵌入式系統(tǒng)原理與開發(fā)》

第10講南京大學(xué)計算機系俞建新主講2008年春季2008年10月23日1南京大學(xué)計算機系第5章ARM指令集和匯編語言程序本章主要介紹以下內(nèi)容:ARM指令集的基本特點與Thumb指令集的區(qū)別與x86處理器的區(qū)別ARM指令格式ARM尋址方式ARM指令集分類詳解ARM匯編語句格式和程序格式ARM匯編語言的指示符ARM匯編程序標(biāo)準(zhǔn)與規(guī)范典型ARM匯編語言程序舉例2008年10月23日2南京大學(xué)計算機系本講主要參考文獻ARM公司英文資料:ADS_AssemblerGuide_B.pdfDDI0100E_ARM_ARM.pdf中文圖書《ARM體系結(jié)構(gòu)與編程》,清華大學(xué)出版社《嵌入式系統(tǒng)基礎(chǔ)教程》,機械工業(yè)出版社2008年10月23日3南京大學(xué)計算機系嵌入式系統(tǒng)開發(fā)中

匯編語言設(shè)計的意義匯編語言程序設(shè)計更能充分發(fā)揮處理器的硬件特性兩個優(yōu)勢操作系統(tǒng)移植需要編寫幾百行底層硬件的匯編語言程序,這是C語言不可取代的。優(yōu)化算法的時空效率,C語言的目標(biāo)代碼優(yōu)化是編譯器完成的,而匯編語言的目標(biāo)代碼優(yōu)化是人工完成的。人是算法的創(chuàng)造者,也是編譯器的設(shè)計者,人工優(yōu)化比編譯器質(zhì)量高。弱點編程效率低,開發(fā)周期長,經(jīng)濟代價大。

2008年10月23日4南京大學(xué)計算機系5.4ARM匯編語句格式和程序格式兩種ARM匯編語言格式ARM匯編語言程序格式主要有兩種:基于ADS1.2集成開發(fā)環(huán)境的匯編器格式包括SDT在內(nèi),統(tǒng)稱為ADS基于Linux的GNU匯編器格式本講前面部分介紹基于ARM公司ADS集成開發(fā)環(huán)境匯編器格式的匯編語言程序設(shè)計。本講后面將介紹基于GNU匯編器的ARM匯編語言程序編寫方法。2008年10月23日5南京大學(xué)計算機系預(yù)定義寄存器名及內(nèi)部變量名ARM匯編器中將幾十個寄存器名稱作為保留字預(yù)先給與了定義,這些預(yù)定義寄存器名都是大小寫敏感的,它們都與具體的寄存器一一對應(yīng)。參看下面的表格。2008年10月23日6南京大學(xué)計算機系A(chǔ)RM公司ADS預(yù)定義的寄存器名一覽表預(yù)定義寄存器名描述r0-r15andR0-R15ARM處理器的通用寄存器a1-a4入口參數(shù),處理結(jié)果,暫存寄存器;r0-r3的同義詞v1-v8變量寄存器,r4-r11sbandSB靜態(tài)基址寄存器,r9slandSL棧界限寄存器,r10fpandFP幀指針寄存器,r11ipandIP內(nèi)部過程調(diào)用暫存寄存器,r12spandSP棧指針寄存器,r132008年10月23日7南京大學(xué)計算機系A(chǔ)RM公司ADS預(yù)定義的寄存器名一覽表(續(xù))預(yù)定義寄存器名描述lrandLR連接寄存器,r14pcandPC程序寄存器,r15cpsrandCPSR當(dāng)前程序狀態(tài)寄存器spsrandSPSR保存的程序狀態(tài)寄存器f0-f7andF0-F7浮點數(shù)運算加速寄存器s0-s31andS0-S31單精度向量浮點數(shù)運算寄存器d0-d15andD0-D15雙精度向量浮點數(shù)運算寄存器p0-p15協(xié)處理器0-15c0-c15協(xié)處理器寄存器0-152008年10月23日8南京大學(xué)計算機系A(chǔ)RM匯編語言程序的部分內(nèi)部變量名清單內(nèi)部變量描述{PC}or.當(dāng)前指令地址{VAR}or@內(nèi)存區(qū)位置計數(shù)器的當(dāng)前值{TRUE}邏輯值真{FALSE}邏輯值假{CONFIG}匯編器如果在匯編ARM指令,取值為32,如果匯編Thumb指令,取值16{ENDIAN}如果匯編器是大端序,則取值big;如果是小端序,則取值little。{CPU}被選擇的CPU名稱。缺省值是ARM7TDMI。{ARCHITECTURE}該變量內(nèi)容是被選擇的ARM體系結(jié)構(gòu)的名稱。如:3,3M,4T{CODESIZE}{CONFIG}的同義詞2008年10月23日9南京大學(xué)計算機系44BINIT.S中使用的

匯編語言部分內(nèi)部變量名使用范例GBLLTHUMBCODE ;設(shè)置一個全局邏輯變量[{CONFIG}=16 ;ifconfig==16這里表示處于16位編譯方式THUMBCODESETL{TRUE} ;設(shè)置THUMBCODE為trueCODE32 ;轉(zhuǎn)入32位編譯模式| ;elseTHUMBCODESETL{FALSE} ;設(shè)置THUMBCODE為false][THUMBCODE ;ifTHUMBCODE==TRUECODE32 ;forstart-upcodeforThumbmode ;轉(zhuǎn)入32位編譯方式]2008年10月23日10南京大學(xué)計算機系5.4.1ARM匯編語言程序的語句格式ARM匯編語言程序的語句格式格式如下:{symbol}{instruction|directive|pseudo-instruction}{;comment}對應(yīng)的中文語句格式描述是:{符號}{指令|指示符|偽指令}{;注釋}語句格式中,花括號括起來的部分表示可以省略;豎線分隔的字段表示可以替換。2008年10月23日11南京大學(xué)計算機系A(chǔ)RM匯編語言程序中的符號ARM匯編語句中的符號可以是指令地址或標(biāo)號、變量、常量和局部標(biāo)號,符號屬性可以是程序相關(guān)的、寄存器相關(guān)的或者是絕對地址。在符號中,有程序相關(guān)的指示符,例如:DCB、DCD等;有寄存器相關(guān)的指示符,例如:MAP、SPACE、DCDO等;還有絕對地址。絕對地址是范圍在232-1的整數(shù)常數(shù),直接用來表示地址。2008年10月23日12南京大學(xué)計算機系符號命名和書寫規(guī)則ARM符號的命名和書寫有以下規(guī)則:①可以使用大小寫字母,數(shù)字和下劃線對符號實行命名。除本地行號外,名稱不能以數(shù)字開頭。符號是大小寫字母敏感的。②如果符號使用了范圍更大的字符集,則需要用單豎線將符號名括起來,以便編譯器處理。

例如:|.text|和|Image$$ZI$$Limit|③單豎線不屬于符號。在兩個單豎線之間不能使用單豎線,分號和新的文字行。④一個程序段中符號不能重名。⑤符號不能夠與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號同名。例如:a1orR0、sp、cpsr、{PC}or.、{VAR}or@、{CONFIG}、{CPU}等等。2008年10月23日13南京大學(xué)計算機系符號命名和書寫規(guī)則(續(xù))⑥符號在其作用范圍內(nèi)必須唯一。⑦當(dāng)程序中的符號與指令助記符或者指示符同名時,用雙豎線將符號括起來。如||buffe_a||,這時雙豎線并不是符號的組成部分。⑧在ARM匯編語言程序中,所有符號必須在一行的最左邊位置開始書寫,即所謂的頂格書寫,不允許包含空格或者制表符。⑨符號的字符序列中不能大小寫字母相混雜。2008年10月23日14南京大學(xué)計算機系數(shù)字常量ARM匯編語言中使用到的常量可以是數(shù)字常量、字符常量、字符串常量和布爾常量。數(shù)字常量有以下3種表示方式:1)十進制數(shù),如:535,246。2)十六進制數(shù),如:0x645,0xff00。3)n進制數(shù),格式為n_XXX,其中n表示n進制,從2~9,XXX是具體的數(shù)字。 例如:8_3777,8_52377022008年10月23日15南京大學(xué)計算機系字符常量字符常量由一對單引號括起來,包括一個單字符或者標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符。例如:’A’,’\n’。字符串常量由一對雙引號以及由它括住的一組字符串組成,包括標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符。如果需要使用雙引號或字符$,則必須用””和$$代替。例如執(zhí)行語句:strtwoSETS“Thisischaracterof”””

其編譯結(jié)果是:字符串“Thisischaracterof””被賦值給strtwo變量。2008年10月23日16南京大學(xué)計算機系$$在匯編語句中的使用舉例

GBLSadd4ffadd4ff SETS"ADDr4,r4,#0xFF";setupadd4ff $add4ff.00 ;invokeadd4ff ;thisproduces ;ADDr4,r4,#0xFF00 ;elaboratesubstitution GBLSs1 GBLSs2 GBLSfixup GBLAcountcount SETA14s1 SETS"a$$b$count" ;s1nowhasvaluea$b0000000Es2 SETS"abc"Fixup SETS"|xy$s2.z|" ;fixupnowhasvalue|xyabcz||C$$code|MOVr4,#16 ;butthelabelhereisC$$code2008年10月23日17南京大學(xué)計算機系邏輯值常量布爾常量TRUE和FALSE在表達式中寫為:{TRUE},{FALSE}。2008年10月23日18南京大學(xué)計算機系表達式ARM匯編語言中的表達式由符號、數(shù)值、單目操作符、雙目操作符以及括號組成。運算的優(yōu)先級次序與標(biāo)準(zhǔn)C一樣。2008年10月23日19南京大學(xué)計算機系字符串表達式字符串由字符串常量、字符串變量、操作符以及括號組成。最大長度為512字節(jié),最短0個字節(jié)。字符串表達式的組成元素有:字符串常量、字符串變量、操作符等。字符串常量由包含在雙引號內(nèi)的一系列字符組成。當(dāng)在字符串中包含美元符號$或者引號”時,用$$表示一個$,用””表示一個”。字符串變量用指示符GBLS(全局字符串)或者LCLS(局部字符串)聲明,用SETS賦值。取值范圍與字符表達式相同。2008年10月23日20南京大學(xué)計算機系A(chǔ)RM匯編語言中的字符串操作符操作符功能操作符功能LEN返回字符串的長度CHR將0~255之間整數(shù)變?yōu)閱蝹€字符STR將一個數(shù)字量變換為串LEFT返回字符串的左子串RIGHT返回字符串的右子串CC連接兩個字符串2008年10月23日21南京大學(xué)計算機系數(shù)字表達式數(shù)字表達式由數(shù)字常量、數(shù)字變量、操作符和括號組成。數(shù)字表達式表示的是一個32位數(shù)的整數(shù),其取值范圍為0~232-1;當(dāng)作為有符號數(shù)時,其取值范圍為-231~231-1。匯編器對-n和232-n不做區(qū)別,匯編時對關(guān)系運算符采用無符號數(shù)方式處理,這就意味著0>-1是{FALSE}。2008年10月23日22南京大學(xué)計算機系邏輯表達式邏輯表達式由邏輯常量、邏輯操作符、關(guān)系操作符以及括號組成。取值范圍為{FALSE}和{TRUE}。2008年10月23日23南京大學(xué)計算機系地址標(biāo)號當(dāng)符號代表地址時稱為標(biāo)號(Label)。以數(shù)字開頭的標(biāo)號其作用范圍是當(dāng)前段(沒有使用ROUT指示符時),這種標(biāo)號又稱為局部標(biāo)號(LocalLabel)。2008年10月23日24南京大學(xué)計算機系三種類型標(biāo)號(1)PC相關(guān)標(biāo)號

(2)寄存器相關(guān)標(biāo)號(3)絕對地址2008年10月23日25南京大學(xué)計算機系PC相關(guān)標(biāo)號PC相關(guān)標(biāo)號表示程序計數(shù)器加減一個數(shù)值常數(shù)后得到的地址值。常用來指明一個分支指令的目標(biāo)地址,或者訪問嵌入在代碼段中的一個數(shù)據(jù)項。具體標(biāo)記方法是:在匯編語言程序指令的前面寫入標(biāo)號,或者在一個數(shù)據(jù)指示符前面寫入標(biāo)號。通常用DCB或者DCD等指示符定義。2008年10月23日26南京大學(xué)計算機系寄存器相關(guān)標(biāo)號寄存器標(biāo)號表示指定寄存器的值加減一個數(shù)值常數(shù)后得到的地址值。常常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù)。通常用MAP或者FIELD等指示符定義。2008年10月23日27南京大學(xué)計算機系絕對地址絕對地址是一個32位的無符號數(shù)字常量,可尋址范圍是0~231-1。使用它可以直接尋址整個地址空間。2008年10月23日28南京大學(xué)計算機系段內(nèi)標(biāo)號和段外標(biāo)號ARM處理器的地址標(biāo)號分為段內(nèi)標(biāo)號和段外標(biāo)號。段內(nèi)標(biāo)號的地址值在匯編時確定,段外標(biāo)號的地址值在連接時確定。2008年10月23日29南京大學(xué)計算機系程序相對尋址和寄存器相對尋址在程序段中標(biāo)號代表其所在位置與段首地址的偏移量,根據(jù)程序計數(shù)器和偏移量計算地址稱為程序相對尋址。在映像文件中定義的標(biāo)號代表標(biāo)號到映像首地址的偏移量。映像的首地址通常被賦予一個寄存器,根據(jù)該寄存器值與偏移量計算地址稱為寄存器相對尋址。2008年10月23日30南京大學(xué)計算機系局部標(biāo)號ARM匯編語言的宏常常使用局部標(biāo)號。局部標(biāo)號提供分支指令在匯編程序的局部范圍內(nèi)進行跳轉(zhuǎn),主要用途是匯編子程序中的循環(huán)和條件編碼。它是一個0~99之間的數(shù)字,后面可以有選擇地附帶一個符號名稱。局部標(biāo)號特別適用于宏。2008年10月23日31南京大學(xué)計算機系局部標(biāo)號(續(xù)1)使用ROUT指示符可以限制局部標(biāo)號的范圍。只能在該局部標(biāo)號的范圍引用局部標(biāo)號。如果在該范圍的上下兩個方向都沒有匹配的標(biāo)號,匯編器將給出一個錯誤信號并停止匯編。局部標(biāo)號語法格式如下:n{routname}被引用的局部標(biāo)號語法規(guī)則是:%{F|B}{A|T}n{routname}2008年10月23日32南京大學(xué)計算機系局部標(biāo)號(續(xù)2)n是局部標(biāo)號的數(shù)字號。routname是當(dāng)前局部范圍的名稱。%表示引用操作。F指示匯編器只向前搜索B指示匯編器只向后搜索A指示匯編器搜索宏的所有嵌套層次T指示匯編器搜索宏的當(dāng)前層次如果F和B都沒有指定,則匯編器首先向前搜索,再向后搜索。如果A和T都沒有指定,匯編器搜索從宏的當(dāng)前層次到宏的最高層次,比當(dāng)前層次低的宏不再搜索。2008年10月23日33南京大學(xué)計算機系5.5ARM匯編語言程序的指示符ARM匯編語言源程序中語句由指令、指示符和宏指令組成。在ARM中將directive稱做指示符ARM的指示符指令相當(dāng)于x86的偽指令在ARM中pseudo-instruction被稱為偽指令A(yù)RM指令集中只有4條偽指令而宏指令則是通過指示符定義的。使用MACRO和MEND指示符2008年10月23日34南京大學(xué)計算機系A(chǔ)RM匯編語言指示符的特點ARM指示符語句與ARM機器指令不存在一一對應(yīng)的關(guān)系,它指示匯編器在匯編目標(biāo)代碼時進行變量定義、存儲單元分配等操作。ARM指示符大致可以分成6種類型,分別是:符號定義、數(shù)據(jù)定義、匯編控制、框架控制、信息報告和雜項。2008年10月23日35南京大學(xué)計算機系5.5.1符號定義指示符符號定義(Symboldefinition)指示符用于定義ARM匯編程序中的變量,對變量進行賦值以及定義寄存器名稱。包括以下指示符:GBLA,GBLL及GBLS聲明全局變量;LCLA,LCLL及LCLS聲明局部變量;SETA,SETL及SETS給變量賦值;RLIST為通用寄存器列表定義名稱;CN為協(xié)處理器的寄存器定義名稱;CP為協(xié)處理器定義名稱;DN及SN為VFP的寄存器定義名稱;FN為FPA的浮點寄存器定義名稱。2008年10月23日36南京大學(xué)計算機系5.5.2數(shù)據(jù)定義指示符數(shù)據(jù)定義(Datadefinition)指示符包括以下的指示符:LTORG聲明一個數(shù)據(jù)緩沖池(literalpool)的開始;MAP定義一個結(jié)構(gòu)化的內(nèi)存表(storagemap)的首地址;FIELD定義結(jié)構(gòu)化的內(nèi)存表中的一個數(shù)據(jù)域(field);SPACE分配一塊內(nèi)存單元,并用0初始化;DCB分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化;DCD及DCDU分配一段字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化;DCDO分配一段字的內(nèi)存單元,并將單元的內(nèi)容初始化成該單元相對于靜態(tài)基值寄存器的偏移量。2008年10月23日37南京大學(xué)計算機系數(shù)據(jù)定義指示符(續(xù))DCFD及DCFDU分配一段雙字的內(nèi)存單元,并用雙精度的浮點數(shù)據(jù)初始化。DCFS及DCFSU分配一段字的內(nèi)存單元,并用單精度的浮點數(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)已不再使用,僅用于保持向前兼容。2008年10月23日38南京大學(xué)計算機系LTORG指示符LTORG指示符要求匯編器立即安排一個數(shù)據(jù)緩沖池(文字池)。語法:LTORG使用說明:通常ARM匯編器把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個代碼段開始之前,或者END指示符之前。當(dāng)程序中使用LDMFD之類的指令時,數(shù)據(jù)緩沖池可能越界。這時可以使用LTORG指示符定義數(shù)據(jù)緩沖池。以防止越界發(fā)生。通常,大的代碼段可以使用多個數(shù)據(jù)緩沖池。LTORG指示符通常放在無條件跳轉(zhuǎn)指令之后。或者子程序返回之后,這樣處理器就不會錯誤地把數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來執(zhí)行。2008年10月23日39南京大學(xué)計算機系LTORG指示符使用舉例

AREAEXP_1,CODE,READONLYSTART BL FUNC1FUNC1;CODE LDRR1,=55555555;產(chǎn)生形如LDRR1,[PC,#offsettoLiteralPool]的指令;CODE MOVPC,LR ;子程序結(jié)束

LTORG ;定義數(shù)據(jù)緩沖池&55555555DATA SPACE46 ;從當(dāng)前位置開始分配46字節(jié)

END ;默認(rèn)的數(shù)據(jù)緩沖池為空2008年10月23日40南京大學(xué)計算機系使用MAP和FIELD描述數(shù)據(jù)結(jié)構(gòu)ADS編譯器使用MAP和FIELD兩個指示符描述數(shù)據(jù)結(jié)構(gòu)。MAP定義了數(shù)據(jù)結(jié)構(gòu)的起始地址。FIELD用來定義數(shù)據(jù)結(jié)構(gòu)中的字段2008年10月23日41南京大學(xué)計算機系MAP指示符^是MAP的同義詞MAP語法MAPexpr{,base-register}其中:expr為數(shù)字表達式或者是程序中的標(biāo)號。當(dāng)指令中沒有base-register時,expr即為結(jié)構(gòu)化內(nèi)存表的首地址。此時內(nèi)存表的位置計數(shù)器{VAR}設(shè)置成該地址值。當(dāng)expr

為程序中的標(biāo)號,該標(biāo)號必須是已經(jīng)定義過的。base-register為一個寄存器。當(dāng)指令中包含這一項時,結(jié)構(gòu)化內(nèi)存表(數(shù)據(jù)結(jié)構(gòu))的首地址為expr和base-register寄存器的和。2008年10月23日42南京大學(xué)計算機系MAP指示符使用舉例下面是MAP指示符匯編語句舉例MAP0xA0FF,R8 ;數(shù)據(jù)結(jié)構(gòu)首地址為R8+0xA0FF;也就是VAR的值成為R8+0xA0FFMAP0xC12305 ;數(shù)據(jù)結(jié)構(gòu)起始位置是0xC12305MAPreaddata+86 ;數(shù)據(jù)結(jié)構(gòu)起始位置是readdata+86;readdata標(biāo)號已經(jīng)定義過了MAP0,R7 ;數(shù)據(jù)結(jié)構(gòu)起始位置是R7中的數(shù)據(jù)MAP0x1FF,R6 ;數(shù)據(jù)結(jié)構(gòu)起始位置是R7中的數(shù)據(jù);加上0x1FF2008年10月23日43南京大學(xué)計算機系FIELD指示符#是FIELD的同義詞FIELD語法{label}FIELDexpr其中:{label}為可選項。當(dāng)指令中包含{label}時,標(biāo)號label的值為當(dāng)前內(nèi)存表位置計數(shù)器{VAR}的值。匯編編譯器執(zhí)行完此條FIELD指示指令后,內(nèi)存表位置計數(shù)器的值將加上expr。expr表示本字段(數(shù)據(jù)項)在內(nèi)存表中所占的字節(jié)數(shù)。2008年10月23日44南京大學(xué)計算機系MAP和FIELD指示符使用說明FIELD指示符說明一個數(shù)據(jù)項所需要的內(nèi)存空間,并且為這個數(shù)據(jù)項提供一個標(biāo)號。MAP指示符中的base-register寄存器對于其后所有的FIELD指示符定義的數(shù)據(jù)項是默認(rèn)使用的,直至遇到新的包含base-register寄存器的MAP指示符。2008年10月23日45南京大學(xué)計算機系MAP和FIELD聯(lián)合使用舉例startofdata EQU 0x0100; MAP startofdataint_a field4int_b field4str_one field64k_array field128bit_mask field4

本例中數(shù)據(jù)結(jié)構(gòu)的起始位置映射到固定(絕對)地址0x0100,然后為各個字段分配空間。也可以用LDR和STR之類的指令對結(jié)構(gòu)體中的字段進行操作。例如使用下面的語句:

LDR R4,int_a2008年10月23日46南京大學(xué)計算機系MAP和FIELD聯(lián)合使用舉例(續(xù)1);本代碼清單是上一個幻燈片的等效代碼startofdata EQU 0x0100 ^ startofdataint_a #4int_b #4str_one #64k_array #128bit_mask #42008年10月23日47南京大學(xué)計算機系MAP和FIELD聯(lián)合使用舉例(續(xù)2)對上述MAP和FIELD聯(lián)合使用舉例代碼中的int_a賦值的代碼清單如下:

MOVR0,#20 LDRR1,=int_a

;也可以使用語句LDRR1,int_a

STRR0,[R1]2008年10月23日48南京大學(xué)計算機系用EQU指示符完成MAP和FIELD聯(lián)合使用舉例代碼的等效操作實際上,使用MAP和FIELD描述的數(shù)據(jù)結(jié)構(gòu)也可以使用EQU描述。參見下面的代碼清單。startofdata EQU 0x0100int_a EQU startofdataint_b EQU int_a+4str_one EQU int_b+4k_array EQU str_one+64bit_mask EQU k_array+128;這種EQU指示符的代碼結(jié)構(gòu)修改繁瑣,不推薦使用2008年10月23日49南京大學(xué)計算機系SPACE指示符SPACE用于分配一塊內(nèi)存單元,并且用0初始化。%是SPACE的同義詞語法:{label}MAPexpr其中:label是可選項;expr是本指示符分配的內(nèi)存字節(jié)數(shù)。示例Pro_data SPACE 1290 ;分配1290個字節(jié)內(nèi)存單元

;并且將該存儲區(qū)初始化為02008年10月23日50南京大學(xué)計算機系相對地址相對地址有兩種:一種是以寄存器作為基地址的相對偏移可以分為兩類基于相對地址的內(nèi)存表基于寄存器的內(nèi)存表另外一種是基于程序的相對偏移2008年10月23日51南京大學(xué)計算機系基于寄存器的相對偏移;基于相對地址的內(nèi)存表示代碼如下

MAP0int_a FIELD4 ;為int_a分配4個字節(jié)int_b FIELD4 ;為int_b分配4個字節(jié)str_one FIELD64 ;為str_one分配64個字節(jié)k_array FIELD128;為k_array分配128個字節(jié)bit_mask FIELD4;為bit_mask分配4個字節(jié);這種情況下的基址寄存器是不固定的2008年10月23日52南京大學(xué)計算機系程序相對偏移以程序偏移地址作為基地址相對以寄存器為基地址要簡單得多。首先要為數(shù)據(jù)結(jié)構(gòu)申請存儲空間,然后將申請的空間首部地址作為基地址。代碼如下面的幻燈片所示:2008年10月23日53南京大學(xué)計算機系程序相對偏移(續(xù));使用程序相對偏移為基地址s_label SPACE280 ;申請空間用來存放數(shù)據(jù)結(jié)構(gòu)

MAP s_label

;將分配空間的起始地址作為基地址int_a FIELD4int_b FIELD4strone FIELD64k_array FIELD128bit_mask FIELD4;這種情況下基地址由編譯器安排2008年10月23日54南京大學(xué)計算機系5.5.3匯編控制指示符匯編控制(Assemblycontrol)指示符包括下面的指示符:IF,ELSE及ENDIF匯編或者不匯編一段源代碼WHILE及WEND條件重復(fù)匯編相同的一段源代碼MACRO及MEND標(biāo)識宏定義開始與結(jié)束MEXIT用于從宏跳轉(zhuǎn)出去2008年10月23日55南京大學(xué)計算機系5.5.4信息報告指示符信息報告(Reporting)指示符包括下列指示符:ASSERT在匯編編譯器對匯編程序的第二趟掃描中,如果其中的ASSERTION中條件不成立,ASSERT偽操作將報告該錯誤信息。INFO支持第一二趟匯編掃描時報告診斷信息。OPTTTL及SUBT2008年10月23日56南京大學(xué)計算機系5.5.5其他指示符這些雜類的指示符包括:ALIGNAREACODE16及CODE32ENDENTRYEQUEXPORT或GLOBAL2008年10月23日57南京大學(xué)計算機系其他的指示符(續(xù))EXTERNGET或INCLUDEIMPORTINCBINKEEPNOFPREQUIREREQUIRE8及PRESERVE8RNROUT2008年10月23日58南京大學(xué)計算機系5.5.5.1AREAAREA指示符用于定義一個代碼段或者數(shù)據(jù)段。語法格式AREAsectionname{,attr}{,attr}....其中:sectionname為所定義的代碼段或者數(shù)據(jù)段的名稱。如果該名稱是以數(shù)字開頭的,則該名稱必須用“|”括起來,如|1_datasec|。還有一些代碼段具有約定的名稱,如|.text|表示C語言編譯器產(chǎn)生的代碼段或者是與C語言庫相關(guān)的代碼段。Attr是該代碼段(或者程序段)的屬性。在AREA指示符中,各屬性間用逗號隔開。2008年10月23日59南京大學(xué)計算機系A(chǔ)REA的屬性下面列舉主要的屬性:ALIGN=expression。默認(rèn)的情況下,ELF的代碼段和數(shù)據(jù)段是4字節(jié)對齊的。Expression可以取0~31的數(shù)值,相應(yīng)的對齊方式為(2expression)字節(jié)對齊。如expression=3時為8字節(jié)對齊。ASSOC=section。指定與本段相關(guān)的ELF段。任何時候連接section段也必須包括sectionname段。CODE定義代碼段。默認(rèn)屬性為READONLY。COMDEF定義一個通用的段。該段可以包含代碼或者數(shù)據(jù)。在個源文件中,同名的COMDEF段必須相同。2008年10月23日60南京大學(xué)計算機系A(chǔ)REA的屬性(續(xù))COMMON定義一個通用的段。該段不包含任何用戶代碼和數(shù)據(jù),連接器將其初始化為0。各源文件中同名的COMMON段公用同樣的內(nèi)存單元,連接器為起分配合適的尺寸。DATA

定義數(shù)據(jù)段。默認(rèn)屬性為READWRITE。NOINIT指定本數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒有將各初始值寫入內(nèi)存單元,或者將個內(nèi)存單元值初始化為0。READONLY指定本段為只讀,代碼段的默認(rèn)屬性為READONLY。READWRITE指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE。2008年10月23日61南京大學(xué)計算機系A(chǔ)REA指示符舉例舉例下面的指示符定義了一個代碼段,代碼段的名稱為Mainpro

,屬性為READONLY。AREAMainpro,CODE,READONLY;codesegment2008年10月23日62南京大學(xué)計算機系5.5.5.2EQUEQU指示符為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(基于PC的值)定義一個字符名稱。*是EQU的同義詞。語法格式nameEQUexpr{,type}其中:expr為基于寄存器的地址值、程序中的標(biāo)號、32位的地址常量或者32位的常量。name為EQU指示符為expr定義的字符名稱。type當(dāng)expr為32位常量時,可以使用type指示expr表示的數(shù)據(jù)的類型。2008年10月23日63南京大學(xué)計算機系EQU(續(xù))type有下面3種取值:CODE16CODE32DATA使用說明EQU指示符的作用類似于C語言中的#define,用于為一個常量定義字符名稱。示例abcdEQU2 ;定義abcd符號的值為2abcdEQUlabel+16 ;定義abcd符號的值(label+16)addr1EQU0xlC,CODE32 ;定義addr1符號值為

;絕對地址值0xlC,而且該處為ARM指令。2008年10月23日64南京大學(xué)計算機系5.5.5.3ENTRYENTRY指示符指定程序的入口點語法格式ENTRY使用說明一個程序(可以包含多個源文件)中至少要有一個ENTRY(可以有多個ENTRY),但一個源文件中最多只能有一個ENTRY(可以沒有ENTRY)。示例AREAexample,CODE,READONLYENTRY;應(yīng)用程序的入口點2008年10月23日65南京大學(xué)計算機系5.5.5.4CODE16和CODE32CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令。CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。語法格式CODE16CODE32使用說明當(dāng)匯編源程序中同時包含ARM指令和Thumb指令時,使用CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令;使用CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告訴編譯器后面指令的類型,該指示符本身并不進行程序狀態(tài)的切換。2008年10月23日66南京大學(xué)計算機系CODE16/CODE32舉例 在下面的例子中,程序先在ARM狀態(tài)下執(zhí)行,然后通過BX指令切換到Thumb狀態(tài),并跳轉(zhuǎn)到相應(yīng)的Thumb指令處執(zhí)行。在Thumb程序入口處用CODE16指示符標(biāo)識下面的指令為Thumb指令。參看下面的指令段:

………………. AREAChangeState,CODE,READONLY CODE32 ;指示下面的指令為ARM指令

LDRr0,=start+1 BXr0 ;切換到Thumb,并跳轉(zhuǎn)到start處執(zhí)行

CODE16 ;指示下面的指令為Thumb指令start MOVr1,#102008年10月23日67南京大學(xué)計算機系5.5.5.5ENDEND指示符告訴編譯器已經(jīng)到了源程序結(jié)尾。語法格式:END使用說明:每一個匯編源程序都包含END指示符,以告訴本源程序的結(jié)束。示例:

AREAexampleCODE,READONLY………………END………2008年10月23日68南京大學(xué)計算機系5.5.5.6ALIGNALIGN指示符通過添加補丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。語法格式ALIGN{expr{,offset}}其中,expr為數(shù)字表達式,用于指定對齊方式。可能的取值為2的次冪,如1、2、4、8等。如果指示符中沒有指定expr,則當(dāng)前位置對齊到下一個字邊界處。offset為數(shù)字表達式。當(dāng)前位置對齊到下面形式的地址處:offset+n*expr。2008年10月23日69南京大學(xué)計算機系A(chǔ)LIGN(續(xù)1)使用說明下面的情況中,需要特定的地址對齊方式:Thumb的宏指令A(yù)DR要求地址是字對齊的,而Thumb代碼中地址標(biāo)號可能不是字對齊的。這時就要使用指示符ALIGN4使Thumb代碼中的地址標(biāo)號字對齊。由于有些ARM處理器的CACHE采用了其他對齊方式,如16字節(jié)的對齊方式,這時使用ALIGN指示符指定合適的對齊方式可以充分發(fā)揮該CACHE的性能優(yōu)勢。LDRD及STRD指令要求內(nèi)存單元是8字節(jié)對齊的。這樣在為這兩個指令分配的內(nèi)存單元前要使用ALIGN8實現(xiàn)8字節(jié)對齊方式。地址標(biāo)號通常自身沒有對齊要求。而在ARM代碼中要求地址標(biāo)號是字對齊的,在Thumb代碼中要求字節(jié)對齊。這樣需要使用合適的ALIGN指示符來調(diào)整對齊方式。2008年10月23日70南京大學(xué)計算機系5.5.5.7EXPORT及GLOBALEXPRORT聲明一個符號可以被其他文件引用。相當(dāng)于聲明了一個全局變量。GLOBAL是EXPORT的同義詞。語法格式EXPORTsymbol{[WEAK]}其中,symbol為聲明的符號名稱,大小寫敏感。[WEAK]選項聲明其他的同名符號優(yōu)先于本符號被引用。使用說明使用EXPORT指示符聲明一個源文件中的符號,使得該符號可以被其他源文件引用。示例AREAExample,CODE,READONLYEXPORTDo_Add;函數(shù)名稱DoAdd可以被引用2008年10月23日71南京大學(xué)計算機系5.5.5.8IMPORTIMPORT指示符告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號,而且不論本源文件是否實際引用該符號,該符號都將被加入到本源文件的符號表中。語法格式IMPORTsymbol{[WEAK]}其中:symbol為聲明的符號的名稱。它是區(qū)分大小寫的。[WEAK]指定這個選項后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會產(chǎn)生任何錯誤信息,同時編譯器也不會到當(dāng)前沒有被INCLUDE進來的庫中去查找該符號。2008年10月23日72南京大學(xué)計算機系IMPORT(續(xù))使用說明使用IMPORT指示符聲明一個符號是在其他源文件中定義的。如果連接器在連接處理時不能解析該符號,而IMPORT指示符中沒有指定[WEAK]選項,則連接器將會報告錯誤。如果連接器在連接處理時不能解析該符號,而IMPORT指示符中指定了[WEAK]選項,則連接器將不會報告錯誤,而是進行下面的操作:<1>如果該符號被B或者BL指令引用,則該符號被設(shè)置成下一條指令的地址,該B或者BL指令相當(dāng)于一條NOP指令。<2>其他情況下該符號被設(shè)置為0。2008年10月23日73南京大學(xué)計算機系5.5.5.9EXTERNEXTERN指示符告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。如果本源文件沒有實際引用該符號,該符號都將不會被加入到本源文件的符號表中。語法格式EXTERNsymbol{[WEAK]}其中,symbol為聲明的符號的名稱。它是區(qū)分大小寫的。[WEAK]指定該選項后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會產(chǎn)生任何錯誤信息,同時編譯器也不會到當(dāng)前沒有被INCLUDE進來的庫中去查找該符號。2008年10月23日74南京大學(xué)計算機系EXTERN(續(xù)1)使用說明使用EXTERN指示符聲明一個符號是在其他源文件中定義的。如果連接器在連接處理時不能解析該符號,而EXTERN指示符中沒有指定[WEAK]選項,則連接器將會報告錯誤。如果連接器在連接處理時不能解析該符號,而EXTERN指示符中指定了[WEAK]選項,則連接器將不會報告錯誤,而是進行下面的操作:<1>如果該符號被B或者BL指令引用,則該符號被設(shè)置成下一條指令的地址,該B或者BL指令相當(dāng)于一條NOP指令。<2>其他情況下該符號被設(shè)置為0。2008年10月23日75南京大學(xué)計算機系EXTERN(續(xù)2)示例下面的代碼測試是否連接了C++庫,并根據(jù)結(jié)果執(zhí)行不同的代碼AREAExample,CODE,READONLYEXTERN_CPP_INITIALIZE[WEAK] ;如果連接了c++庫則讀取;函數(shù)_CPP_INITIALIZE地址LDRr0,_CPP_INITIALIZECMPr0,#0 ;Testifzero.BEQnocplusplus

;如果沒有連接C++庫,則跳轉(zhuǎn)到nocplusplus2008年10月23日76南京大學(xué)計算機系5.5.5.10GET及INCLUDEGET指示符將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進行匯編處理。INCLUDE是GET的同義詞。語法格式GETfilename其中,filename為被包含的源文件的名稱。這里可以使用路徑信息。使用說明(1)通??梢栽谝粋€源文件中定義宏,用EQU定義常量的符號名稱,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,這樣的源文件類似于C語言中的.H文件。然后用GET指示符將這個源文件包含到它們的源文件中,類似于在C源程序的“include*.h”。2008年10月23日77南京大學(xué)計算機系GET及INCLUDE(續(xù)1)使用說明(2)編譯器通常在當(dāng)前目錄中查找被包含的源文件??梢允褂镁幾g選項-I添加其他的查找目錄。同時,被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。編譯器在查找C源文件時將把源文件B所在的目錄作為當(dāng)前目錄。GET指示符不能用來包含目標(biāo)文件(二進制執(zhí)行文件)。包含目標(biāo)文件需要使用INCBIN指示符。2008年10月23日78南京大學(xué)計算機系GET及INCLUDE(續(xù)2)示例AREAExample,CODE,READONLYGETfile1.s ;包含源文件file1.sGETc:\project\file2.s;包含源文件file2.s,可以包含路徑信息GETc:\programfiles\file3.s;包含源文件file3.s,路徑信息中可以包含空格2008年10月23日79南京大學(xué)計算機系5.5.5.11INCBININCBIN指示符將一個文件包含到(INCLUDE)當(dāng)前源文件中,被包含的文件不進行匯編處理。語法格式INCBINfilename其中,filename為被包含的文件的名稱。這里可以使用路徑信息。使用說明通??梢允褂肐NCBIN將一個執(zhí)行文件或者任意的數(shù)據(jù)包含到當(dāng)前文件中。被包含的執(zhí)行文件或數(shù)據(jù)將被原封不動地放到當(dāng)前文件中。編譯器從INCBIN指示符后面開始繼續(xù)處理。2008年10月23日80南京大學(xué)計算機系INCBIN(續(xù))使用說明編譯器通常在當(dāng)前目錄中查找被包含的源文件??梢允褂镁幾g選項-I添加其他的查找目錄。同時,被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。編譯器在查找C源文件時將把源文件B所在的目錄作為當(dāng)前目錄。這里所包含的文件名及路徑信息中都不能有空格。示例AREAExample,CODE,READONLYINCBINfile1.dat ;包含文件file1.datINCBINc:\project\file2.txt ;包含文件file2.txt2008年10月23日81南京大學(xué)計算機系5.5.5.12NOFP使用NOFP指示符禁止源程序中包含浮點運算指令。語法格式NOFP使用說明當(dāng)系統(tǒng)中沒有硬件或軟件仿真代碼支持浮點運算指令時,使用NOFP指示符禁止在源程序中使用浮點運算指令。這時如果源程序中包含浮點運算指令,編譯器將會報告錯誤。同樣如果在浮點運算指令的后面使用NOFP指示符,編譯器同樣將會報告錯誤。2008年10月23日82南京大學(xué)計算機系5.5.5.13REQUIREREQUIRE指示符指定段之間的相互依賴關(guān)系。語法格式REQUIRElabel

其中,label為所需要的標(biāo)號的名稱。使用說明當(dāng)進行連接處理時包含了有REQUIRElabel指示符的源文件,則定義label的源文件也將被包含。2008年10月23日83南京大學(xué)計算機系5.5.5.14RNRN指示符為一個特定的寄存器定義名稱。語法格式nameRNexpr其中:expr為某個寄存器的編碼。name為本指示符給寄存器expr定義的名稱。使用說明RN指示符用于給一個寄存器定義名稱。方便程序員記憶該寄存器的功能。舉例:databaseRNR11;將寄存器R11重命名為database;增加可讀性2008年10月23日84南京大學(xué)計算機系5.6ARM匯編語句格式和程序格式ARM匯編語言語句格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}其中:instruction為指令。在ARM匯編語言中,指令不能從一行的行頭開始。在一行語句中,指令的前面必須有空格或者符號。directive是指示符。pseudo-instruction是偽指令。2008年10月23日85南京大學(xué)計算機系A(chǔ)RM匯編語言語句格式(續(xù)1)symbol為符號。在ARM匯編語言中,符號必須從一行的行頭開始,并且符號中不能包含空格。在指令和偽指令中符號用作地址標(biāo)號(label);在有些指示符中,符號用作變量或者常量。comment為語句的注釋。在ARM匯編語言中注釋以分號“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨占用一行。2008年10月23日86南京大學(xué)計算機系A(chǔ)RM匯編語言語句格式(續(xù)2)每行的長度限制一般在128~255個字符串之間。當(dāng)一行寫不下時,可以用反斜線‘\’作為這一行最后的符號,然后另起一行接下去寫,這樣匯編器會將這兩行代碼看作一行代碼。需要注意的是,如果在被引號括住的字符串中使用反斜線‘\’,則反斜線‘\’不能起到續(xù)行的作用。“\”后不能有任何字符,包括空格和制表符等。分號‘;’除非在字符串常量中出現(xiàn),否則它的出現(xiàn)就表示著注釋的開始,此注釋直至行尾結(jié)束??梢詫⒆⑨寙为毩袨橐恍?。所有注釋被匯編器忽略。2008年10月23日87南京大學(xué)計算機系A(chǔ)RM匯編程序編寫規(guī)范匯編語句格式ARM匯編中,所有標(biāo)號必須在一行的頂格書寫,其后面不要添加符號“:”。而所有指令均不能頂格書寫。ARM匯編器對標(biāo)識符大小寫敏感(即區(qū)分大小寫字母),書寫標(biāo)號及指令時字母大小寫要一致。在ARM匯編程序中,ARM指令、偽指令、寄存器名可以全部為大寫字母,也可以全部為小寫字母,但不要大小寫混合使用。源程序中,語句之間可以插入空行,以使得源代碼的可讀性更好。

2008年10月23日88南京大學(xué)計算機系A(chǔ)RM匯編程序編寫規(guī)范(續(xù))格式如下:[標(biāo)號]<指令|條件|S><操作數(shù)>[;注釋]源程序中允許有空行。適當(dāng)?shù)夭迦肟招?,可以提高源程序的可讀性。如果單行代碼太長,可以使用字符“\”將其分行。對于變量的設(shè)置、常量的定義,其標(biāo)識符必須在一行的頂格書寫。下面給出了匯編指令正確和錯誤的例子2008年10月23日89南京大學(xué)計算機系匯編指令正確的例子

…Str1

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論