版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《嵌入式系統(tǒng)原理與開發(fā)》
第10講南京大學(xué)計(jì)算機(jī)系俞建新主講2008年春季2008年10月23日1南京大學(xué)計(jì)算機(jī)系第5章ARM指令集和匯編語(yǔ)言程序本章主要介紹以下內(nèi)容:ARM指令集的基本特點(diǎn)與Thumb指令集的區(qū)別與x86處理器的區(qū)別ARM指令格式ARM尋址方式ARM指令集分類詳解ARM匯編語(yǔ)句格式和程序格式ARM匯編語(yǔ)言的指示符ARM匯編程序標(biāo)準(zhǔn)與規(guī)范典型ARM匯編語(yǔ)言程序舉例2008年10月23日2南京大學(xué)計(jì)算機(jī)系本講主要參考文獻(xiàn)ARM公司英文資料:ADS_AssemblerGuide_B.pdfDDI0100E_ARM_ARM.pdf中文圖書《ARM體系結(jié)構(gòu)與編程》,清華大學(xué)出版社《嵌入式系統(tǒng)基礎(chǔ)教程》,機(jī)械工業(yè)出版社2008年10月23日3南京大學(xué)計(jì)算機(jī)系嵌入式系統(tǒng)開發(fā)中
匯編語(yǔ)言設(shè)計(jì)的意義匯編語(yǔ)言程序設(shè)計(jì)更能充分發(fā)揮處理器的硬件特性兩個(gè)優(yōu)勢(shì)操作系統(tǒng)移植需要編寫幾百行底層硬件的匯編語(yǔ)言程序,這是C語(yǔ)言不可取代的。優(yōu)化算法的時(shí)空效率,C語(yǔ)言的目標(biāo)代碼優(yōu)化是編譯器完成的,而匯編語(yǔ)言的目標(biāo)代碼優(yōu)化是人工完成的。人是算法的創(chuàng)造者,也是編譯器的設(shè)計(jì)者,人工優(yōu)化比編譯器質(zhì)量高。弱點(diǎn)編程效率低,開發(fā)周期長(zhǎng),經(jīng)濟(jì)代價(jià)大。
2008年10月23日4南京大學(xué)計(jì)算機(jī)系5.4ARM匯編語(yǔ)句格式和程序格式兩種ARM匯編語(yǔ)言格式ARM匯編語(yǔ)言程序格式主要有兩種:基于ADS1.2集成開發(fā)環(huán)境的匯編器格式包括SDT在內(nèi),統(tǒng)稱為ADS基于Linux的GNU匯編器格式本講前面部分介紹基于ARM公司ADS集成開發(fā)環(huán)境匯編器格式的匯編語(yǔ)言程序設(shè)計(jì)。本講后面將介紹基于GNU匯編器的ARM匯編語(yǔ)言程序編寫方法。2008年10月23日5南京大學(xué)計(jì)算機(jī)系預(yù)定義寄存器名及內(nèi)部變量名ARM匯編器中將幾十個(gè)寄存器名稱作為保留字預(yù)先給與了定義,這些預(yù)定義寄存器名都是大小寫敏感的,它們都與具體的寄存器一一對(duì)應(yīng)。參看下面的表格。2008年10月23日6南京大學(xué)計(jì)算機(jī)系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é)計(jì)算機(jī)系A(chǔ)RM公司ADS預(yù)定義的寄存器名一覽表(續(xù))預(yù)定義寄存器名描述lrandLR連接寄存器,r14pcandPC程序寄存器,r15cpsrandCPSR當(dāng)前程序狀態(tài)寄存器spsrandSPSR保存的程序狀態(tài)寄存器f0-f7andF0-F7浮點(diǎn)數(shù)運(yùn)算加速寄存器s0-s31andS0-S31單精度向量浮點(diǎn)數(shù)運(yùn)算寄存器d0-d15andD0-D15雙精度向量浮點(diǎn)數(shù)運(yùn)算寄存器p0-p15協(xié)處理器0-15c0-c15協(xié)處理器寄存器0-152008年10月23日8南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言程序的部分內(nèi)部變量名清單內(nèi)部變量描述{PC}or.當(dāng)前指令地址{VAR}or@內(nèi)存區(qū)位置計(jì)數(shù)器的當(dāng)前值{TRUE}邏輯值真{FALSE}邏輯值假{CONFIG}匯編器如果在匯編ARM指令,取值為32,如果匯編Thumb指令,取值16{ENDIAN}如果匯編器是大端序,則取值big;如果是小端序,則取值little。{CPU}被選擇的CPU名稱。缺省值是ARM7TDMI。{ARCHITECTURE}該變量?jī)?nèi)容是被選擇的ARM體系結(jié)構(gòu)的名稱。如:3,3M,4T{CODESIZE}{CONFIG}的同義詞2008年10月23日9南京大學(xué)計(jì)算機(jī)系44BINIT.S中使用的
匯編語(yǔ)言部分內(nèi)部變量名使用范例GBLLTHUMBCODE ;設(shè)置一個(gè)全局邏輯變量[{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é)計(jì)算機(jī)系5.4.1ARM匯編語(yǔ)言程序的語(yǔ)句格式ARM匯編語(yǔ)言程序的語(yǔ)句格式格式如下:{symbol}{instruction|directive|pseudo-instruction}{;comment}對(duì)應(yīng)的中文語(yǔ)句格式描述是:{符號(hào)}{指令|指示符|偽指令}{;注釋}語(yǔ)句格式中,花括號(hào)括起來(lái)的部分表示可以省略;豎線分隔的字段表示可以替換。2008年10月23日11南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言程序中的符號(hào)ARM匯編語(yǔ)句中的符號(hào)可以是指令地址或標(biāo)號(hào)、變量、常量和局部標(biāo)號(hào),符號(hào)屬性可以是程序相關(guān)的、寄存器相關(guān)的或者是絕對(duì)地址。在符號(hào)中,有程序相關(guān)的指示符,例如:DCB、DCD等;有寄存器相關(guān)的指示符,例如:MAP、SPACE、DCDO等;還有絕對(duì)地址。絕對(duì)地址是范圍在232-1的整數(shù)常數(shù),直接用來(lái)表示地址。2008年10月23日12南京大學(xué)計(jì)算機(jī)系符號(hào)命名和書寫規(guī)則ARM符號(hào)的命名和書寫有以下規(guī)則:①可以使用大小寫字母,數(shù)字和下劃線對(duì)符號(hào)實(shí)行命名。除本地行號(hào)外,名稱不能以數(shù)字開頭。符號(hào)是大小寫字母敏感的。②如果符號(hào)使用了范圍更大的字符集,則需要用單豎線將符號(hào)名括起來(lái),以便編譯器處理。
例如:|.text|和|Image$$ZI$$Limit|③單豎線不屬于符號(hào)。在兩個(gè)單豎線之間不能使用單豎線,分號(hào)和新的文字行。④一個(gè)程序段中符號(hào)不能重名。⑤符號(hào)不能夠與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號(hào)同名。例如:a1orR0、sp、cpsr、{PC}or.、{VAR}or@、{CONFIG}、{CPU}等等。2008年10月23日13南京大學(xué)計(jì)算機(jī)系符號(hào)命名和書寫規(guī)則(續(xù))⑥符號(hào)在其作用范圍內(nèi)必須唯一。⑦當(dāng)程序中的符號(hào)與指令助記符或者指示符同名時(shí),用雙豎線將符號(hào)括起來(lái)。如||buffe_a||,這時(shí)雙豎線并不是符號(hào)的組成部分。⑧在ARM匯編語(yǔ)言程序中,所有符號(hào)必須在一行的最左邊位置開始書寫,即所謂的頂格書寫,不允許包含空格或者制表符。⑨符號(hào)的字符序列中不能大小寫字母相混雜。2008年10月23日14南京大學(xué)計(jì)算機(jī)系數(shù)字常量ARM匯編語(yǔ)言中使用到的常量可以是數(shù)字常量、字符常量、字符串常量和布爾常量。數(shù)字常量有以下3種表示方式:1)十進(jìn)制數(shù),如:535,246。2)十六進(jìn)制數(shù),如:0x645,0xff00。3)n進(jìn)制數(shù),格式為n_XXX,其中n表示n進(jìn)制,從2~9,XXX是具體的數(shù)字。 例如:8_3777,8_52377022008年10月23日15南京大學(xué)計(jì)算機(jī)系字符常量字符常量由一對(duì)單引號(hào)括起來(lái),包括一個(gè)單字符或者標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符。例如:’A’,’\n’。字符串常量由一對(duì)雙引號(hào)以及由它括住的一組字符串組成,包括標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符。如果需要使用雙引號(hào)或字符$,則必須用””和$$代替。例如執(zhí)行語(yǔ)句:strtwoSETS“Thisischaracterof”””
其編譯結(jié)果是:字符串“Thisischaracterof””被賦值給strtwo變量。2008年10月23日16南京大學(xué)計(jì)算機(jī)系$$在匯編語(yǔ)句中的使用舉例
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é)計(jì)算機(jī)系邏輯值常量布爾常量TRUE和FALSE在表達(dá)式中寫為:{TRUE},{FALSE}。2008年10月23日18南京大學(xué)計(jì)算機(jī)系表達(dá)式ARM匯編語(yǔ)言中的表達(dá)式由符號(hào)、數(shù)值、單目操作符、雙目操作符以及括號(hào)組成。運(yùn)算的優(yōu)先級(jí)次序與標(biāo)準(zhǔn)C一樣。2008年10月23日19南京大學(xué)計(jì)算機(jī)系字符串表達(dá)式字符串由字符串常量、字符串變量、操作符以及括號(hào)組成。最大長(zhǎng)度為512字節(jié),最短0個(gè)字節(jié)。字符串表達(dá)式的組成元素有:字符串常量、字符串變量、操作符等。字符串常量由包含在雙引號(hào)內(nèi)的一系列字符組成。當(dāng)在字符串中包含美元符號(hào)$或者引號(hào)”時(shí),用$$表示一個(gè)$,用””表示一個(gè)”。字符串變量用指示符GBLS(全局字符串)或者LCLS(局部字符串)聲明,用SETS賦值。取值范圍與字符表達(dá)式相同。2008年10月23日20南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言中的字符串操作符操作符功能操作符功能LEN返回字符串的長(zhǎng)度CHR將0~255之間整數(shù)變?yōu)閱蝹€(gè)字符STR將一個(gè)數(shù)字量變換為串LEFT返回字符串的左子串RIGHT返回字符串的右子串CC連接兩個(gè)字符串2008年10月23日21南京大學(xué)計(jì)算機(jī)系數(shù)字表達(dá)式數(shù)字表達(dá)式由數(shù)字常量、數(shù)字變量、操作符和括號(hào)組成。數(shù)字表達(dá)式表示的是一個(gè)32位數(shù)的整數(shù),其取值范圍為0~232-1;當(dāng)作為有符號(hào)數(shù)時(shí),其取值范圍為-231~231-1。匯編器對(duì)-n和232-n不做區(qū)別,匯編時(shí)對(duì)關(guān)系運(yùn)算符采用無(wú)符號(hào)數(shù)方式處理,這就意味著0>-1是{FALSE}。2008年10月23日22南京大學(xué)計(jì)算機(jī)系邏輯表達(dá)式邏輯表達(dá)式由邏輯常量、邏輯操作符、關(guān)系操作符以及括號(hào)組成。取值范圍為{FALSE}和{TRUE}。2008年10月23日23南京大學(xué)計(jì)算機(jī)系地址標(biāo)號(hào)當(dāng)符號(hào)代表地址時(shí)稱為標(biāo)號(hào)(Label)。以數(shù)字開頭的標(biāo)號(hào)其作用范圍是當(dāng)前段(沒有使用ROUT指示符時(shí)),這種標(biāo)號(hào)又稱為局部標(biāo)號(hào)(LocalLabel)。2008年10月23日24南京大學(xué)計(jì)算機(jī)系三種類型標(biāo)號(hào)(1)PC相關(guān)標(biāo)號(hào)
(2)寄存器相關(guān)標(biāo)號(hào)(3)絕對(duì)地址2008年10月23日25南京大學(xué)計(jì)算機(jī)系PC相關(guān)標(biāo)號(hào)PC相關(guān)標(biāo)號(hào)表示程序計(jì)數(shù)器加減一個(gè)數(shù)值常數(shù)后得到的地址值。常用來(lái)指明一個(gè)分支指令的目標(biāo)地址,或者訪問嵌入在代碼段中的一個(gè)數(shù)據(jù)項(xiàng)。具體標(biāo)記方法是:在匯編語(yǔ)言程序指令的前面寫入標(biāo)號(hào),或者在一個(gè)數(shù)據(jù)指示符前面寫入標(biāo)號(hào)。通常用DCB或者DCD等指示符定義。2008年10月23日26南京大學(xué)計(jì)算機(jī)系寄存器相關(guān)標(biāo)號(hào)寄存器標(biāo)號(hào)表示指定寄存器的值加減一個(gè)數(shù)值常數(shù)后得到的地址值。常常用于訪問位于數(shù)據(jù)段中的數(shù)據(jù)。通常用MAP或者FIELD等指示符定義。2008年10月23日27南京大學(xué)計(jì)算機(jī)系絕對(duì)地址絕對(duì)地址是一個(gè)32位的無(wú)符號(hào)數(shù)字常量,可尋址范圍是0~231-1。使用它可以直接尋址整個(gè)地址空間。2008年10月23日28南京大學(xué)計(jì)算機(jī)系段內(nèi)標(biāo)號(hào)和段外標(biāo)號(hào)ARM處理器的地址標(biāo)號(hào)分為段內(nèi)標(biāo)號(hào)和段外標(biāo)號(hào)。段內(nèi)標(biāo)號(hào)的地址值在匯編時(shí)確定,段外標(biāo)號(hào)的地址值在連接時(shí)確定。2008年10月23日29南京大學(xué)計(jì)算機(jī)系程序相對(duì)尋址和寄存器相對(duì)尋址在程序段中標(biāo)號(hào)代表其所在位置與段首地址的偏移量,根據(jù)程序計(jì)數(shù)器和偏移量計(jì)算地址稱為程序相對(duì)尋址。在映像文件中定義的標(biāo)號(hào)代表標(biāo)號(hào)到映像首地址的偏移量。映像的首地址通常被賦予一個(gè)寄存器,根據(jù)該寄存器值與偏移量計(jì)算地址稱為寄存器相對(duì)尋址。2008年10月23日30南京大學(xué)計(jì)算機(jī)系局部標(biāo)號(hào)ARM匯編語(yǔ)言的宏常常使用局部標(biāo)號(hào)。局部標(biāo)號(hào)提供分支指令在匯編程序的局部范圍內(nèi)進(jìn)行跳轉(zhuǎn),主要用途是匯編子程序中的循環(huán)和條件編碼。它是一個(gè)0~99之間的數(shù)字,后面可以有選擇地附帶一個(gè)符號(hào)名稱。局部標(biāo)號(hào)特別適用于宏。2008年10月23日31南京大學(xué)計(jì)算機(jī)系局部標(biāo)號(hào)(續(xù)1)使用ROUT指示符可以限制局部標(biāo)號(hào)的范圍。只能在該局部標(biāo)號(hào)的范圍引用局部標(biāo)號(hào)。如果在該范圍的上下兩個(gè)方向都沒有匹配的標(biāo)號(hào),匯編器將給出一個(gè)錯(cuò)誤信號(hào)并停止匯編。局部標(biāo)號(hào)語(yǔ)法格式如下:n{routname}被引用的局部標(biāo)號(hào)語(yǔ)法規(guī)則是:%{F|B}{A|T}n{routname}2008年10月23日32南京大學(xué)計(jì)算機(jī)系局部標(biāo)號(hào)(續(xù)2)n是局部標(biāo)號(hào)的數(shù)字號(hào)。routname是當(dāng)前局部范圍的名稱。%表示引用操作。F指示匯編器只向前搜索B指示匯編器只向后搜索A指示匯編器搜索宏的所有嵌套層次T指示匯編器搜索宏的當(dāng)前層次如果F和B都沒有指定,則匯編器首先向前搜索,再向后搜索。如果A和T都沒有指定,匯編器搜索從宏的當(dāng)前層次到宏的最高層次,比當(dāng)前層次低的宏不再搜索。2008年10月23日33南京大學(xué)計(jì)算機(jī)系5.5ARM匯編語(yǔ)言程序的指示符ARM匯編語(yǔ)言源程序中語(yǔ)句由指令、指示符和宏指令組成。在ARM中將directive稱做指示符ARM的指示符指令相當(dāng)于x86的偽指令在ARM中pseudo-instruction被稱為偽指令A(yù)RM指令集中只有4條偽指令而宏指令則是通過指示符定義的。使用MACRO和MEND指示符2008年10月23日34南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言指示符的特點(diǎn)ARM指示符語(yǔ)句與ARM機(jī)器指令不存在一一對(duì)應(yīng)的關(guān)系,它指示匯編器在匯編目標(biāo)代碼時(shí)進(jìn)行變量定義、存儲(chǔ)單元分配等操作。ARM指示符大致可以分成6種類型,分別是:符號(hào)定義、數(shù)據(jù)定義、匯編控制、框架控制、信息報(bào)告和雜項(xiàng)。2008年10月23日35南京大學(xué)計(jì)算機(jī)系5.5.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)寄存器定義名稱。2008年10月23日36南京大學(xué)計(jì)算機(jī)系5.5.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)基值寄存器的偏移量。2008年10月23日37南京大學(xué)計(jì)算機(jī)系數(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)已不再使用,僅用于保持向前兼容。2008年10月23日38南京大學(xué)計(jì)算機(jī)系LTORG指示符LTORG指示符要求匯編器立即安排一個(gè)數(shù)據(jù)緩沖池(文字池)。語(yǔ)法:LTORG使用說(shuō)明:通常ARM匯編器把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼段開始之前,或者END指示符之前。當(dāng)程序中使用LDMFD之類的指令時(shí),數(shù)據(jù)緩沖池可能越界。這時(shí)可以使用LTORG指示符定義數(shù)據(jù)緩沖池。以防止越界發(fā)生。通常,大的代碼段可以使用多個(gè)數(shù)據(jù)緩沖池。LTORG指示符通常放在無(wú)條件跳轉(zhuǎn)指令之后。或者子程序返回之后,這樣處理器就不會(huì)錯(cuò)誤地把數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來(lái)執(zhí)行。2008年10月23日39南京大學(xué)計(jì)算機(jī)系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é)計(jì)算機(jī)系使用MAP和FIELD描述數(shù)據(jù)結(jié)構(gòu)ADS編譯器使用MAP和FIELD兩個(gè)指示符描述數(shù)據(jù)結(jié)構(gòu)。MAP定義了數(shù)據(jù)結(jié)構(gòu)的起始地址。FIELD用來(lái)定義數(shù)據(jù)結(jié)構(gòu)中的字段2008年10月23日41南京大學(xué)計(jì)算機(jī)系MAP指示符^是MAP的同義詞MAP語(yǔ)法MAPexpr{,base-register}其中:expr為數(shù)字表達(dá)式或者是程序中的標(biāo)號(hào)。當(dāng)指令中沒有base-register時(shí),expr即為結(jié)構(gòu)化內(nèi)存表的首地址。此時(shí)內(nèi)存表的位置計(jì)數(shù)器{VAR}設(shè)置成該地址值。當(dāng)expr
為程序中的標(biāo)號(hào),該標(biāo)號(hào)必須是已經(jīng)定義過的。base-register為一個(gè)寄存器。當(dāng)指令中包含這一項(xiàng)時(shí),結(jié)構(gòu)化內(nèi)存表(數(shù)據(jù)結(jié)構(gòu))的首地址為expr和base-register寄存器的和。2008年10月23日42南京大學(xué)計(jì)算機(jī)系MAP指示符使用舉例下面是MAP指示符匯編語(yǔ)句舉例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)號(hà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é)計(jì)算機(jī)系FIELD指示符#是FIELD的同義詞FIELD語(yǔ)法{label}FIELDexpr其中:{label}為可選項(xiàng)。當(dāng)指令中包含{label}時(shí),標(biāo)號(hào)label的值為當(dāng)前內(nèi)存表位置計(jì)數(shù)器{VAR}的值。匯編編譯器執(zhí)行完此條FIELD指示指令后,內(nèi)存表位置計(jì)數(shù)器的值將加上expr。expr表示本字段(數(shù)據(jù)項(xiàng))在內(nèi)存表中所占的字節(jié)數(shù)。2008年10月23日44南京大學(xué)計(jì)算機(jī)系MAP和FIELD指示符使用說(shuō)明FIELD指示符說(shuō)明一個(gè)數(shù)據(jù)項(xiàng)所需要的內(nèi)存空間,并且為這個(gè)數(shù)據(jù)項(xiàng)提供一個(gè)標(biāo)號(hào)。MAP指示符中的base-register寄存器對(duì)于其后所有的FIELD指示符定義的數(shù)據(jù)項(xiàng)是默認(rèn)使用的,直至遇到新的包含base-register寄存器的MAP指示符。2008年10月23日45南京大學(xué)計(jì)算機(jī)系MAP和FIELD聯(lián)合使用舉例startofdata EQU 0x0100; MAP startofdataint_a field4int_b field4str_one field64k_array field128bit_mask field4
本例中數(shù)據(jù)結(jié)構(gòu)的起始位置映射到固定(絕對(duì))地址0x0100,然后為各個(gè)字段分配空間。也可以用LDR和STR之類的指令對(duì)結(jié)構(gòu)體中的字段進(jìn)行操作。例如使用下面的語(yǔ)句:
LDR R4,int_a2008年10月23日46南京大學(xué)計(jì)算機(jī)系MAP和FIELD聯(lián)合使用舉例(續(xù)1);本代碼清單是上一個(gè)幻燈片的等效代碼startofdata EQU 0x0100 ^ startofdataint_a #4int_b #4str_one #64k_array #128bit_mask #42008年10月23日47南京大學(xué)計(jì)算機(jī)系MAP和FIELD聯(lián)合使用舉例(續(xù)2)對(duì)上述MAP和FIELD聯(lián)合使用舉例代碼中的int_a賦值的代碼清單如下:
MOVR0,#20 LDRR1,=int_a
;也可以使用語(yǔ)句LDRR1,int_a
STRR0,[R1]2008年10月23日48南京大學(xué)計(jì)算機(jī)系用EQU指示符完成MAP和FIELD聯(lián)合使用舉例代碼的等效操作實(shí)際上,使用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é)計(jì)算機(jī)系SPACE指示符SPACE用于分配一塊內(nèi)存單元,并且用0初始化。%是SPACE的同義詞語(yǔ)法:{label}MAPexpr其中:label是可選項(xiàng);expr是本指示符分配的內(nèi)存字節(jié)數(shù)。示例Pro_data SPACE 1290 ;分配1290個(gè)字節(jié)內(nèi)存單元
;并且將該存儲(chǔ)區(qū)初始化為02008年10月23日50南京大學(xué)計(jì)算機(jī)系相對(duì)地址相對(duì)地址有兩種:一種是以寄存器作為基地址的相對(duì)偏移可以分為兩類基于相對(duì)地址的內(nèi)存表基于寄存器的內(nèi)存表另外一種是基于程序的相對(duì)偏移2008年10月23日51南京大學(xué)計(jì)算機(jī)系基于寄存器的相對(duì)偏移;基于相對(duì)地址的內(nèi)存表示代碼如下
MAP0int_a FIELD4 ;為int_a分配4個(gè)字節(jié)int_b FIELD4 ;為int_b分配4個(gè)字節(jié)str_one FIELD64 ;為str_one分配64個(gè)字節(jié)k_array FIELD128;為k_array分配128個(gè)字節(jié)bit_mask FIELD4;為bit_mask分配4個(gè)字節(jié);這種情況下的基址寄存器是不固定的2008年10月23日52南京大學(xué)計(jì)算機(jī)系程序相對(duì)偏移以程序偏移地址作為基地址相對(duì)以寄存器為基地址要簡(jiǎn)單得多。首先要為數(shù)據(jù)結(jié)構(gòu)申請(qǐng)存儲(chǔ)空間,然后將申請(qǐng)的空間首部地址作為基地址。代碼如下面的幻燈片所示:2008年10月23日53南京大學(xué)計(jì)算機(jī)系程序相對(duì)偏移(續(xù));使用程序相對(duì)偏移為基地址s_label SPACE280 ;申請(qǐng)空間用來(lái)存放數(shù)據(jù)結(jié)構(gòu)
MAP s_label
;將分配空間的起始地址作為基地址int_a FIELD4int_b FIELD4strone FIELD64k_array FIELD128bit_mask FIELD4;這種情況下基地址由編譯器安排2008年10月23日54南京大學(xué)計(jì)算機(jī)系5.5.3匯編控制指示符匯編控制(Assemblycontrol)指示符包括下面的指示符:IF,ELSE及ENDIF匯編或者不匯編一段源代碼WHILE及WEND條件重復(fù)匯編相同的一段源代碼MACRO及MEND標(biāo)識(shí)宏定義開始與結(jié)束MEXIT用于從宏跳轉(zhuǎn)出去2008年10月23日55南京大學(xué)計(jì)算機(jī)系5.5.4信息報(bào)告指示符信息報(bào)告(Reporting)指示符包括下列指示符:ASSERT在匯編編譯器對(duì)匯編程序的第二趟掃描中,如果其中的ASSERTION中條件不成立,ASSERT偽操作將報(bào)告該錯(cuò)誤信息。INFO支持第一二趟匯編掃描時(shí)報(bào)告診斷信息。OPTTTL及SUBT2008年10月23日56南京大學(xué)計(jì)算機(jī)系5.5.5其他指示符這些雜類的指示符包括:ALIGNAREACODE16及CODE32ENDENTRYEQUEXPORT或GLOBAL2008年10月23日57南京大學(xué)計(jì)算機(jī)系其他的指示符(續(xù))EXTERNGET或INCLUDEIMPORTINCBINKEEPNOFPREQUIREREQUIRE8及PRESERVE8RNROUT2008年10月23日58南京大學(xué)計(jì)算機(jī)系5.5.5.1AREAAREA指示符用于定義一個(gè)代碼段或者數(shù)據(jù)段。語(yǔ)法格式AREAsectionname{,attr}{,attr}....其中:sectionname為所定義的代碼段或者數(shù)據(jù)段的名稱。如果該名稱是以數(shù)字開頭的,則該名稱必須用“|”括起來(lái),如|1_datasec|。還有一些代碼段具有約定的名稱,如|.text|表示C語(yǔ)言編譯器產(chǎn)生的代碼段或者是與C語(yǔ)言庫(kù)相關(guān)的代碼段。Attr是該代碼段(或者程序段)的屬性。在AREA指示符中,各屬性間用逗號(hào)隔開。2008年10月23日59南京大學(xué)計(jì)算機(jī)系A(chǔ)REA的屬性下面列舉主要的屬性: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段必須相同。2008年10月23日60南京大學(xué)計(jì)算機(jī)系A(chǔ)REA的屬性(續(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。2008年10月23日61南京大學(xué)計(jì)算機(jī)系A(chǔ)REA指示符舉例舉例下面的指示符定義了一個(gè)代碼段,代碼段的名稱為Mainpro
,屬性為READONLY。AREAMainpro,CODE,READONLY;codesegment2008年10月23日62南京大學(xué)計(jì)算機(jī)系5.5.5.2EQUEQU指示符為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)(基于PC的值)定義一個(gè)字符名稱。*是EQU的同義詞。語(yǔ)法格式nameEQUexpr{,type}其中:expr為基于寄存器的地址值、程序中的標(biāo)號(hào)、32位的地址常量或者32位的常量。name為EQU指示符為expr定義的字符名稱。type當(dāng)expr為32位常量時(shí),可以使用type指示expr表示的數(shù)據(jù)的類型。2008年10月23日63南京大學(xué)計(jì)算機(jī)系EQU(續(xù))type有下面3種取值:CODE16CODE32DATA使用說(shuō)明EQU指示符的作用類似于C語(yǔ)言中的#define,用于為一個(gè)常量定義字符名稱。示例abcdEQU2 ;定義abcd符號(hào)的值為2abcdEQUlabel+16 ;定義abcd符號(hào)的值(label+16)addr1EQU0xlC,CODE32 ;定義addr1符號(hào)值為
;絕對(duì)地址值0xlC,而且該處為ARM指令。2008年10月23日64南京大學(xué)計(jì)算機(jī)系5.5.5.3ENTRYENTRY指示符指定程序的入口點(diǎn)語(yǔ)法格式ENTRY使用說(shuō)明一個(gè)程序(可以包含多個(gè)源文件)中至少要有一個(gè)ENTRY(可以有多個(gè)ENTRY),但一個(gè)源文件中最多只能有一個(gè)ENTRY(可以沒有ENTRY)。示例AREAexample,CODE,READONLYENTRY;應(yīng)用程序的入口點(diǎn)2008年10月23日65南京大學(xué)計(jì)算機(jī)系5.5.5.4CODE16和CODE32CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令。CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。語(yǔ)法格式CODE16CODE32使用說(shuō)明當(dāng)匯編源程序中同時(shí)包含ARM指令和Thumb指令時(shí),使用CODE16指示符告訴匯編編譯器后面的指令序列為16位的Thumb指令;使用CODE32指示符告訴匯編編譯器后面的指令序列為32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告訴編譯器后面指令的類型,該指示符本身并不進(jìn)行程序狀態(tài)的切換。2008年10月23日66南京大學(xué)計(jì)算機(jī)系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,#102008年10月23日67南京大學(xué)計(jì)算機(jī)系5.5.5.5ENDEND指示符告訴編譯器已經(jīng)到了源程序結(jié)尾。語(yǔ)法格式:END使用說(shuō)明:每一個(gè)匯編源程序都包含END指示符,以告訴本源程序的結(jié)束。示例:
AREAexampleCODE,READONLY………………END………2008年10月23日68南京大學(xué)計(jì)算機(jī)系5.5.5.6ALIGNALIGN指示符通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式。語(yǔ)法格式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。2008年10月23日69南京大學(xué)計(jì)算機(jī)系A(chǔ)LIGN(續(xù)1)使用說(shuō)明下面的情況中,需要特定的地址對(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指示符來(lái)調(diào)整對(duì)齊方式。2008年10月23日70南京大學(xué)計(jì)算機(jī)系5.5.5.7EXPORT及GLOBALEXPRORT聲明一個(gè)符號(hào)可以被其他文件引用。相當(dāng)于聲明了一個(gè)全局變量。GLOBAL是EXPORT的同義詞。語(yǔ)法格式EXPORTsymbol{[WEAK]}其中,symbol為聲明的符號(hào)名稱,大小寫敏感。[WEAK]選項(xiàng)聲明其他的同名符號(hào)優(yōu)先于本符號(hào)被引用。使用說(shuō)明使用EXPORT指示符聲明一個(gè)源文件中的符號(hào),使得該符號(hào)可以被其他源文件引用。示例AREAExample,CODE,READONLYEXPORTDo_Add;函數(shù)名稱DoAdd可以被引用2008年10月23日71南京大學(xué)計(jì)算機(jī)系5.5.5.8IMPORTIMPORT指示符告訴編譯器當(dāng)前的符號(hào)不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號(hào),而且不論本源文件是否實(shí)際引用該符號(hào),該符號(hào)都將被加入到本源文件的符號(hào)表中。語(yǔ)法格式IMPORTsymbol{[WEAK]}其中:symbol為聲明的符號(hào)的名稱。它是區(qū)分大小寫的。[WEAK]指定這個(gè)選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來(lái)的庫(kù)中去查找該符號(hào)。2008年10月23日72南京大學(xué)計(jì)算機(jī)系IMPORT(續(xù))使用說(shuō)明使用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。2008年10月23日73南京大學(xué)計(jì)算機(jī)系5.5.5.9EXTERNEXTERN指示符告訴編譯器當(dāng)前的符號(hào)不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號(hào)。如果本源文件沒有實(shí)際引用該符號(hào),該符號(hào)都將不會(huì)被加入到本源文件的符號(hào)表中。語(yǔ)法格式EXTERNsymbol{[WEAK]}其中,symbol為聲明的符號(hào)的名稱。它是區(qū)分大小寫的。[WEAK]指定該選項(xiàng)后,如果symbol在所有的源文件中都沒有被定義,編譯器也不會(huì)產(chǎn)生任何錯(cuò)誤信息,同時(shí)編譯器也不會(huì)到當(dāng)前沒有被INCLUDE進(jìn)來(lái)的庫(kù)中去查找該符號(hào)。2008年10月23日74南京大學(xué)計(jì)算機(jī)系EXTERN(續(xù)1)使用說(shuō)明使用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。2008年10月23日75南京大學(xué)計(jì)算機(jī)系EXTERN(續(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)到nocplusplus2008年10月23日76南京大學(xué)計(jì)算機(jī)系5.5.5.10GET及INCLUDEGET指示符將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCLUDE是GET的同義詞。語(yǔ)法格式GETfilename其中,filename為被包含的源文件的名稱。這里可以使用路徑信息。使用說(shuō)明(1)通??梢栽谝粋€(gè)源文件中定義宏,用EQU定義常量的符號(hào)名稱,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,這樣的源文件類似于C語(yǔ)言中的.H文件。然后用GET指示符將這個(gè)源文件包含到它們的源文件中,類似于在C源程序的“include*.h”。2008年10月23日77南京大學(xué)計(jì)算機(jī)系GET及INCLUDE(續(xù)1)使用說(shuō)明(2)編譯器通常在當(dāng)前目錄中查找被包含的源文件??梢允褂镁幾g選項(xiàng)-I添加其他的查找目錄。同時(shí),被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。編譯器在查找C源文件時(shí)將把源文件B所在的目錄作為當(dāng)前目錄。GET指示符不能用來(lái)包含目標(biāo)文件(二進(jìn)制執(zhí)行文件)。包含目標(biāo)文件需要使用INCBIN指示符。2008年10月23日78南京大學(xué)計(jì)算機(jī)系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é)計(jì)算機(jī)系5.5.5.11INCBININCBIN指示符將一個(gè)文件包含到(INCLUDE)當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。語(yǔ)法格式INCBINfilename其中,filename為被包含的文件的名稱。這里可以使用路徑信息。使用說(shuō)明通常可以使用INCBIN將一個(gè)執(zhí)行文件或者任意的數(shù)據(jù)包含到當(dāng)前文件中。被包含的執(zhí)行文件或數(shù)據(jù)將被原封不動(dòng)地放到當(dāng)前文件中。編譯器從INCBIN指示符后面開始繼續(xù)處理。2008年10月23日80南京大學(xué)計(jì)算機(jī)系INCBIN(續(xù))使用說(shuō)明編譯器通常在當(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.txt2008年10月23日81南京大學(xué)計(jì)算機(jī)系5.5.5.12NOFP使用NOFP指示符禁止源程序中包含浮點(diǎn)運(yùn)算指令。語(yǔ)法格式NOFP使用說(shuō)明當(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ò)誤。2008年10月23日82南京大學(xué)計(jì)算機(jī)系5.5.5.13REQUIREREQUIRE指示符指定段之間的相互依賴關(guān)系。語(yǔ)法格式REQUIRElabel
其中,label為所需要的標(biāo)號(hào)的名稱。使用說(shuō)明當(dāng)進(jìn)行連接處理時(shí)包含了有REQUIRElabel指示符的源文件,則定義label的源文件也將被包含。2008年10月23日83南京大學(xué)計(jì)算機(jī)系5.5.5.14RNRN指示符為一個(gè)特定的寄存器定義名稱。語(yǔ)法格式nameRNexpr其中:expr為某個(gè)寄存器的編碼。name為本指示符給寄存器expr定義的名稱。使用說(shuō)明RN指示符用于給一個(gè)寄存器定義名稱。方便程序員記憶該寄存器的功能。舉例:databaseRNR11;將寄存器R11重命名為database;增加可讀性2008年10月23日84南京大學(xué)計(jì)算機(jī)系5.6ARM匯編語(yǔ)句格式和程序格式ARM匯編語(yǔ)言語(yǔ)句格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}其中:instruction為指令。在ARM匯編語(yǔ)言中,指令不能從一行的行頭開始。在一行語(yǔ)句中,指令的前面必須有空格或者符號(hào)。directive是指示符。pseudo-instruction是偽指令。2008年10月23日85南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言語(yǔ)句格式(續(xù)1)symbol為符號(hào)。在ARM匯編語(yǔ)言中,符號(hào)必須從一行的行頭開始,并且符號(hào)中不能包含空格。在指令和偽指令中符號(hào)用作地址標(biāo)號(hào)(label);在有些指示符中,符號(hào)用作變量或者常量。comment為語(yǔ)句的注釋。在ARM匯編語(yǔ)言中注釋以分號(hào)“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨(dú)占用一行。2008年10月23日86南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編語(yǔ)言語(yǔ)句格式(續(xù)2)每行的長(zhǎng)度限制一般在128~255個(gè)字符串之間。當(dāng)一行寫不下時(shí),可以用反斜線‘\’作為這一行最后的符號(hào),然后另起一行接下去寫,這樣匯編器會(huì)將這兩行代碼看作一行代碼。需要注意的是,如果在被引號(hào)括住的字符串中使用反斜線‘\’,則反斜線‘\’不能起到續(xù)行的作用?!癨”后不能有任何字符,包括空格和制表符等。分號(hào)‘;’除非在字符串常量中出現(xiàn),否則它的出現(xiàn)就表示著注釋的開始,此注釋直至行尾結(jié)束??梢詫⒆⑨寙为?dú)列為一行。所有注釋被匯編器忽略。2008年10月23日87南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編程序編寫規(guī)范匯編語(yǔ)句格式ARM匯編中,所有標(biāo)號(hào)必須在一行的頂格書寫,其后面不要添加符號(hào)“:”。而所有指令均不能頂格書寫。ARM匯編器對(duì)標(biāo)識(shí)符大小寫敏感(即區(qū)分大小寫字母),書寫標(biāo)號(hào)及指令時(shí)字母大小寫要一致。在ARM匯編程序中,ARM指令、偽指令、寄存器名可以全部為大寫字母,也可以全部為小寫字母,但不要大小寫混合使用。源程序中,語(yǔ)句之間可以插入空行,以使得源代碼的可讀性更好。
2008年10月23日88南京大學(xué)計(jì)算機(jī)系A(chǔ)RM匯編程序編寫規(guī)范(續(xù))格式如下:[標(biāo)號(hào)]<指令|條件|S><操作數(shù)>[;注釋]源程序中允許有空行。適當(dāng)?shù)夭迦肟招校梢蕴岣咴闯绦虻目勺x性。如果單行代碼太長(zhǎng),可以使用字符“\”將其分行。對(duì)于變量的設(shè)置、常量的定義,其標(biāo)識(shí)符必須在一行的頂格書寫。下面給出了匯編指令正確和錯(cuò)誤的例子2008年10月23日89南京大學(xué)計(jì)算機(jī)系匯編指令正確的例子
…Str1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版南京綠色建筑項(xiàng)目能源合同管理協(xié)議4篇
- 2025年度特色苗木種植與市場(chǎng)推廣服務(wù)合同4篇
- 2025年度鋁合金門窗企業(yè)戰(zhàn)略合作伙伴合同范本
- 2025年度時(shí)尚服飾區(qū)域分銷代理合同
- 2025年度高校教授職務(wù)評(píng)審及聘任合同4篇
- 二零二五年度土石方工程地質(zhì)災(zāi)害預(yù)警與應(yīng)急處理合同
- 二零二五年度冷鏈倉(cāng)儲(chǔ)與運(yùn)輸一體化服務(wù)合同4篇
- 二零二五年度棉花產(chǎn)業(yè)安全生產(chǎn)管理合同4篇
- 2025版美發(fā)師創(chuàng)業(yè)孵化項(xiàng)目聘用合同2篇
- 二零二五年度奢侈品銷售團(tuán)隊(duì)聘用合同范本
- 第1課 隋朝統(tǒng)一與滅亡 課件(26張)2024-2025學(xué)年部編版七年級(jí)歷史下冊(cè)
- 2025-2030年中國(guó)糖醇市場(chǎng)運(yùn)行狀況及投資前景趨勢(shì)分析報(bào)告
- 冬日暖陽(yáng)健康守護(hù)
- 水處理藥劑采購(gòu)項(xiàng)目技術(shù)方案(技術(shù)方案)
- 2024級(jí)高一上期期中測(cè)試數(shù)學(xué)試題含答案
- 盾構(gòu)標(biāo)準(zhǔn)化施工手冊(cè)
- 天然氣脫硫完整版本
- 山東省2024-2025學(xué)年高三上學(xué)期新高考聯(lián)合質(zhì)量測(cè)評(píng)10月聯(lián)考英語(yǔ)試題
- 不間斷電源UPS知識(shí)培訓(xùn)
- 三年級(jí)除法豎式300道題及答案
- 人教版八級(jí)物理下冊(cè)知識(shí)點(diǎn)結(jié)
評(píng)論
0/150
提交評(píng)論