arm嵌入式原理技術(shù)及應(yīng)用ch_第1頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch_第2頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch_第3頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch_第4頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 2010.12 陳 賾ARM嵌入式技術(shù)原理與應(yīng)用 131356998038/5/20221整理課件第四章 ARM匯編程序設(shè)計(jì)8/5/20222整理課件 了解與熟悉ADS下的偽操作和宏指令以及它的應(yīng)用 了解與熟悉GNU下的偽操作和宏指令以及它的應(yīng)用 熟悉ARM ATPCS 能夠利用匯編語(yǔ)言進(jìn)行簡(jiǎn)單的程序設(shè)計(jì) 8/5/20223整理課件1. 偽指令、偽操作和宏指令概念 偽指令是匯編語(yǔ)言程序里的特殊指令助記符,在匯編時(shí)被合適的機(jī)器指令替代。 偽操作為匯編程序所用,在源程序進(jìn)行匯編時(shí)由匯編程序處理,只在匯編過(guò)程起作用,不參與程序運(yùn)行。4.1. 匯編偽指令和宏指令8/5/20224整理課件 宏指令通過(guò)

2、偽操作定義的一段獨(dú)立的代碼。在調(diào)用它時(shí)將宏體插入到源程序中。也就是常說(shuō)的宏。說(shuō)明:所有的偽指令、偽操作和宏指令,均與具體的開(kāi)發(fā)工具中的編譯器有關(guān),當(dāng)前主要采用ARM公司的“ADS/SDT IDE”開(kāi)發(fā)工具,所以后面的討論,均是基于ARM公司的開(kāi)發(fā)工具。8/5/20225整理課件2 . ARM匯編偽指令 ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時(shí)這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別是:ADR:小范圍的地址讀取偽指令。ADRL:中等范圍的地址讀取偽指令。LDR:大范圍的地址讀取偽指令。NOP:空操作偽指令。8

3、/5/20226整理課件(1) ADR小范圍的地址讀取 ADR偽指令功能:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。 ADR偽指令功能的實(shí)現(xiàn)方法:在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)此ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。語(yǔ)法格式: ADRcond register,expr其中:register:加載的目標(biāo)寄存器。expr:地址表達(dá)式。取值范圍是參考P2128/5/20227整理課件例1: (0 x20) ADR R1,Delay Delay(0 x64) MO

4、V R0,R14 使用ADR將程序標(biāo)號(hào)Delay所表示的地址存入R1。編譯后的反匯編代碼: ADD R1,PC,#0 x3C MOV R0,R14 PC+0 x3C=0 x20+0 x08+0 x3C=0 x648/5/20228整理課件例2:查表 ADR R0,D_TAB ;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2 ;使用R2作為參數(shù),進(jìn)行查表 D_TAB DCB 0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x928/5/20229整理課件(2)ADRL中等范圍的地址讀取ADRL偽指令功能:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,

5、比ADR偽指令可以讀取更大范圍的地址。ADRL偽指令功能實(shí)現(xiàn)方法:在匯編編譯器編譯源程序時(shí),ADRL被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。語(yǔ)法格式: ADRLcond register,expr其中:register:加載的目標(biāo)寄存器。expr:地址表達(dá)式。取值范圍參考P2128/5/202210整理課件例3: (0 x20) ADRL R1,Delay Delay(0 x64) MOV R0,R14 使用ADRL將程序標(biāo)號(hào)Delay所表示的地址存入R1。編譯后的反匯編代碼: ADD R1,PC,#0 x3CADD R1,R1,#0 MOV R0,R14 A

6、DRL偽指令被匯編成兩條指令,盡管第2條指令并沒(méi)有意義。8/5/202211整理課件(3)LDR 大范圍的地址讀取LDR偽指令功能:用于加載32位立即數(shù)或一個(gè)地址值到指定的寄存器。LDR偽指令功能實(shí)現(xiàn)方法:在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超過(guò)MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令;否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的LDR指令從文字池讀出常量。 8/5/202212整理課件 語(yǔ)法格式: LDRcond register,=expr其中:Register:加載的目標(biāo)寄存器。expr:32位常量或地址表達(dá)式。8/

7、5/202213整理課件例4: (0 x060) LDR R1,=Delay Delay(0 x102) MOV R0,R14 使用LDR將程序標(biāo)號(hào)Delay所表示的地址存入R1。編譯后的反匯編代碼: LDR R1,stack Delay MOV R0,R14 LTORGstack DCD 0 x102 LDR偽指令被匯編成一條LDR指令,并在文字池中定義一個(gè)常量,該常量為標(biāo)號(hào)Delay的地址。8/5/202214整理課件注意: 從指令位置到文字池的偏移量必須小于4KB。 與ARM指令的LDR的區(qū)別:偽指令LDR的參數(shù)有“=”號(hào)。8/5/202215整理課件(4)NOP空操作偽指令NOP偽指令

8、功能實(shí)現(xiàn)方法:在匯編時(shí)將被替代成ARM中的空操作,比如可能是“MOV R0,R0”指令等。用途:NOP可用于延時(shí)操作。語(yǔ)法格式: NOP例:延時(shí)子程序 Delay NOP ;空操作 NOP NOP SUBS R1,R1,#1 ;循環(huán)次數(shù)減1 BNE Delay MOV PC,LR8/5/202216整理課件3. ARM匯編偽操作ADS編譯環(huán)境下的偽操作可分為以下幾類:符號(hào)定義(Symbol Definition)偽操作 數(shù)據(jù)定義(Data Definition)偽操作 匯編控制(Assembly Control)偽操作 其它(Miscellaneous)偽操作 8/5/202217整理課件(1

9、) 符號(hào)定義偽操作 GBLA,GBLL,GBLS:聲明全局變量。LCLA,LCLL,LCLS:聲明局部變量。SETA,SETL,SETS:給變量賦值。RLIST:為通用寄存器列表定義名稱。 8/5/202218整理課件(2) 數(shù)據(jù)定義偽操作LTORG:聲明一個(gè)數(shù)據(jù)緩沖池的開(kāi)始SPACE:分配一塊字節(jié)內(nèi)存單元,并用0初始化DCB:分配一段字節(jié)內(nèi)存單元,并初始化DCD、DCDU:分配一段字內(nèi)存單元,并初始化MAP:定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址FIELD:定義結(jié)構(gòu)化內(nèi)存表中的一個(gè)數(shù)據(jù)域 8/5/202219整理課件 MAP、 FIELD、 SPACEMAP 0 x100, R0 ;定義結(jié)構(gòu)化內(nèi)存表

10、首地址的值為0 x100R0A FIELD 16 ;定義A的長(zhǎng)度為16字節(jié),位置為0 x110+R0 LTORG ;定義數(shù)據(jù)緩沖池&0 x8000Data SPACE 4200 ;從當(dāng)前位置開(kāi)始分配4200字節(jié)的內(nèi)存單元,并初始化為0。8/5/202220整理課件LTORG用于聲明一個(gè)數(shù)據(jù)緩沖池(文字池)的開(kāi)始。語(yǔ)法格式:LTORG例:start BL func; func LDR R1,=0 x8000 ;子程序 MOV PC,LR ;子程序返回 LTORG ;定義數(shù)據(jù)緩沖池&0 x8000Data SPACE 4200 ;從當(dāng)前位置開(kāi)始分配4200字節(jié)的內(nèi) 存單元,并初始化為0。 END

11、默認(rèn)數(shù)據(jù)緩沖池為空8/5/202221整理課件注意: LTORG偽操作通常放在無(wú)條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器不會(huì)錯(cuò)誤地將數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來(lái)執(zhí)行。 通常ARM匯編編譯器把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼段開(kāi)始之前,或者END偽操作之前。8/5/202222整理課件 DCB也可以用符號(hào)”=”表示用于定義并且初始化一個(gè)或者多個(gè)字節(jié)的內(nèi)存區(qū)域。語(yǔ)法格式: label DCB expr,expr或 label = expr,expr其中expr表示:-128到255之間的一個(gè)數(shù)值常量或者表達(dá)式。一個(gè)字符串。注意:當(dāng)DCB后面緊跟一個(gè)指令時(shí),可能需要使用ALIG

12、N確保指令是字對(duì)齊的。8/5/202223整理課件例:short DCB 1 ;為short分配了一個(gè)字節(jié),并初始化為1。 string DCB “string”,0 ;構(gòu)造一個(gè)以0 結(jié)尾的字符串 8/5/202224整理課件DCD、DCDU分配一段字內(nèi)存單元(1)DCD 分配一段字對(duì)齊的內(nèi)存單元用于分配一段字對(duì)齊的內(nèi)存單元,并初始化。 DCD也可以用符號(hào)”&”表示語(yǔ)法格式: label DCD expr,expr或 label & expr,expr 其中:expr :數(shù)字表達(dá)式或程序中的標(biāo)號(hào)。注意:DCD偽操作可能在分配的第一個(gè)內(nèi)存單元前插入填補(bǔ)字節(jié)以保證分配的內(nèi)存是字對(duì)齊的。8/5/20

13、2225整理課件例:data1 DCD 2,4,6 ;為data1分配三個(gè)字,內(nèi)容初始化為2,4,6 data2 DCD label+4 ;初始化data2為label+4對(duì)應(yīng)的地址 (2)DCDU 分配一段字非嚴(yán)格對(duì)齊的內(nèi)存單元DCDU與DCD的不同之處在于DCDU分配的內(nèi)存單元并不嚴(yán)格字對(duì)齊。8/5/202226整理課件(3)匯編控制偽操作IF,ELSE及ENDIF:有條件選擇匯編WHILE及WEND:有條件循環(huán)(重復(fù))匯編MACRO,MEND及MEXIT:宏定義匯編8/5/202227整理課件(4)其它偽操作AREA:定義一個(gè)代碼段或數(shù)據(jù)段 CODE16、CODE32:告訴編譯器后面的指

14、令序列位數(shù) ENTRY:指定程序的入口點(diǎn) ALIGN:將當(dāng)前的位置以某種形式對(duì)齊 END:源程序結(jié)尾 EQU:為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)定義一個(gè)字符名稱。8/5/202228整理課件 EXPORT、GLOBAL:聲明源文件中的符號(hào)可以被其他源文件引用 IMPORT、EXTERN:聲明某符號(hào)是在其他源文件中定義的 GET、INCLUDE:將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。 INCBIN:將一個(gè)文件包含到當(dāng)前源文件中,而被包含的文件不進(jìn)行匯編處理8/5/202229整理課件1)AREA用于定義一個(gè)代碼段或是數(shù)據(jù)段。語(yǔ)法格式: AREA sect

15、ionname,attr ,attr 其中:sectionname:為所定義的段的名稱。attr:該段的屬性。具有的屬性為:CODE:定義代碼段。DATA:定義數(shù)據(jù)段。READONLY:指定本段為只讀,代碼段的默認(rèn)屬性。READWRITE:指定本段為可讀可寫(xiě),數(shù)據(jù)段的默認(rèn)屬性。8/5/202230整理課件ALIGN:指定段的對(duì)齊方式為2expression。expression的取值為031。COMMON:指定一個(gè)通用段。該段不包含任何用戶代碼和數(shù)據(jù)。NOINIT:指定此數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒(méi)有將各初始值寫(xiě)入內(nèi)存單元,或者將各個(gè)內(nèi)存單元值初始化為0。注意:一個(gè)大的程序可包含多個(gè)代碼段和

16、數(shù)據(jù)段。一個(gè)匯編程序至少包含一個(gè)代碼段。8/5/202231整理課件2)CODE16和CODE32CODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令。CODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。語(yǔ)法格式: CODE16 CODE32 注意:CODE16和CODE32只是告訴編譯器后面指令的類型,該偽操作本身不進(jìn)行程序狀態(tài)的切換。8/5/202232整理課件例:AREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面為32位ARM指令 LDR R0,=start+1 BX R0 CODE16 ;下面為16位Thumb指令s

17、tart MOV R1,#10 . END;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行8/5/202233整理課件3)ENTRY指定程序的入口點(diǎn)。語(yǔ)法格式: ENTRY注意: 一個(gè)程序(可包含多個(gè)源文件)中至少要有一個(gè)ENTRY(可以有多個(gè)ENTRY),但一個(gè)源文件中最多只能有一個(gè)ENTRY(可以沒(méi)有ENTRY)8/5/202234整理課件4)ALIGNALIGN偽操作通過(guò)填充0將當(dāng)前的位置以某種形式對(duì)齊。語(yǔ)法格式:ALIGN expr,offset其中:expr:一個(gè)數(shù)字,表示對(duì)齊的單位。這個(gè)數(shù)字是2的整數(shù)次冪,范圍在20231之間。 如果沒(méi)有指定expr,則當(dāng)前位置對(duì)齊到下一個(gè)字邊界處

18、。Offset:偏移量,可以為常數(shù)或數(shù)值表達(dá)式。不指定offset表示將當(dāng)前位置對(duì)齊到以expr為單位的起始位置。8/5/202235整理課件例1:short DCB 1 ;本操作使字對(duì)齊被破壞ALIGN ;重新使其為字對(duì)齊MOV R0,1例2:ALIGN 8 ;當(dāng)前位置以2個(gè)字的方式對(duì)齊8/5/202236整理課件5)ENDEND偽操作告訴編譯器已經(jīng)到了源程序結(jié)尾。語(yǔ)法格式: END注意:每一個(gè)匯編源程序都必須包含END偽操作,以表明本源程序的結(jié)束。8/5/202237整理課件6)EQU EQU偽操作為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)定義一個(gè)字符名稱。語(yǔ)法格式: name EQU ex

19、pr,type其中:name:為expr定義的字符名稱。expr:基于寄存器的地址值、程序中的標(biāo)號(hào)、32位的地址常量或者32位的常量。表達(dá)式,為常量。type:當(dāng)expr為32位常量時(shí),可以使用type指示expr的數(shù)據(jù)的類型。取值為:CODE32CODE16DATA8/5/202238整理課件例: abcd EQU 2 ;定義abcd符號(hào)的值為2 abcd EQU label+16 ;定義abcd符號(hào)的值為(label+16) abcd EQU 0 x1c,CODE32 ;定義abcd符號(hào)的值為絕對(duì)地址 ;值0 x1c,而且此處為ARM指令8/5/202239整理課件7)EXPORT及GLO

20、BAL 聲明一個(gè)源文件中的符號(hào),使此符號(hào)可以被其他源文件引用。語(yǔ)法格式:EXPORT/GLOBAL symbol weak其中:symbol:聲明的符號(hào)的名稱。(區(qū)分大小寫(xiě))weak:聲明其他同名符號(hào)優(yōu)先于本符號(hào)被引用。例: AREA example,CODE,READONLY EXPORT DoAdd DoAdd ADD R0,R0,R18/5/202240整理課件8)IMPORT及EXTERN聲明一個(gè)符號(hào)是在其他源文件中定義的。語(yǔ)法格式:IMPORT symbolweakEXTERN symbolweak其中:symbol:聲明的符號(hào)的名稱。8/5/202241整理課件weak:當(dāng)沒(méi)有指定

21、此項(xiàng)時(shí),如果symbol在所有的源文件中都沒(méi)有被定義,則連接器會(huì)報(bào)告錯(cuò)誤。當(dāng)指定此項(xiàng)時(shí),如果symbol在所有的源文件中都沒(méi)有被定義,則連接器不會(huì)報(bào)告錯(cuò)誤,而是進(jìn)行下面的操作。如果該符號(hào)被B或者BL指令引用,則該符號(hào)被設(shè)置成下一條指令的地址,該B或BL指令相當(dāng)于一條NOP指令。其他情況下此符號(hào)被設(shè)置成0。8/5/202242整理課件9)GET及INCLUDE將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。指令格式:GET filenameINCLUDE filename其中: filename:包含的源文件名,可以使用路徑信息(可包含空格)。例:GET d:armfi

22、le.s8/5/202243整理課件10)INCBIN將一個(gè)文件包含到當(dāng)前源文件中,而被包含的文件不進(jìn)行匯編處理指令格式:INCBIN filename其中:filename:被包含的文件名稱,可使用路徑信息(不能有空格)。適用情況:通常使用此偽操作將一個(gè)可執(zhí)行文件或者任意數(shù)據(jù)包含到當(dāng)前文件中。例:INCBIN d:armfile.txt8/5/202244整理課件例:編寫(xiě)一具有完整匯編格式的程序,實(shí)現(xiàn)冒泡法排序功能。設(shè)無(wú)符號(hào)字?jǐn)?shù)據(jù)存放在從0 x400004開(kāi)始的區(qū)域,字?jǐn)?shù)據(jù)的數(shù)目字存放在0 x400000中。AREA SORT,CODE,READONLYENTRYSTARTMOV R1,#0

23、 x400000LPSUBS R1,R1,#1BEQ EXITMOV R7,R1LDR R0,=0 x400004LP1LDR R2,R0,#4LDR R3,R0CMP R2,R3STRLO R3,R0, # -4STRLO R2,R0SUBS R7,R7,#1BNE LP1B LPEXITEND8/5/202245整理課件4.GNU下的偽操作和宏指令 GNU編譯環(huán)境下的偽操作可分為以下幾類:1) 常量編譯控制偽操作2) 匯編程序代碼控制偽操作3) 宏及條件編譯控制偽操作4) 其他偽操作8/5/202246整理課件1)常量編譯控制偽操作 8/5/202247整理課件)匯編程序代碼控制偽操作 8

24、/5/202248整理課件)宏及條件編譯控制偽操作8/5/202249整理課件)其他偽操作 8/5/202250整理課件5.ADS與GNU編譯環(huán)境下的比較 8/5/202251整理課件8/5/202252整理課件4. ARM ATPCS 1. 基本ATPCS ATPCS就是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則。ATPCS規(guī)定了一些子程序間調(diào)用的基本規(guī)則。 子程序調(diào)用過(guò)程中寄存器的使用規(guī)則 數(shù)據(jù)棧的使用規(guī)則 參數(shù)的傳遞規(guī)則。8/5/202253整理課件相對(duì)于其他類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少。 它不能提供以下的支持: 1) ARM程序和Th

25、umb程序相互調(diào)用; 2) 數(shù)據(jù)以及代碼的位置無(wú)關(guān)的支持; 3)子程序的可重入性; 4) 數(shù)據(jù)棧檢查的支持。8/5/202254整理課件1)寄存器的使用規(guī)則 寄存器的使用必須滿足下面的規(guī)則:子程序間通過(guò)寄存器 R0一R3來(lái)傳遞參數(shù)在子程序中,使用寄存器R4R11來(lái)保存局部變量 寄存器R12用作子程序間scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出棧),記作ip。在子程序間的連接代碼段中常有這種使用規(guī)則。8/5/202255整理課件寄存器R13用作數(shù)據(jù)棧指針,記作sp。 寄存器R14稱為連接寄存器,記作lr。 寄存器R15是程序計(jì)數(shù)器,記作pc。它不能用作其他用途。8/5/202

26、256整理課件 ATPCS中各寄存器的使用規(guī)則及其名稱8/5/202257整理課件2)數(shù)據(jù)棧使用規(guī)則 棧指針通??梢灾赶虿煌奈恢?。當(dāng)棧指針指向棧頂元素(即最后一個(gè)入棧的數(shù)據(jù)元素)時(shí),稱為FULL棧;當(dāng)棧指針指向與棧頂元素(即最后一個(gè)入棧的數(shù)據(jù)元素)相鄰的一個(gè)可用數(shù)據(jù)單元時(shí),稱為EMPTY棧。 數(shù)據(jù)棧的增長(zhǎng)方向也可以不同。當(dāng)數(shù)據(jù)棧向內(nèi)存地址減小的方向增長(zhǎng)時(shí),稱為DESCENDING棧,當(dāng)數(shù)據(jù)棧向內(nèi)存地址增加的方向增長(zhǎng)時(shí),稱為ASCENDING棧。8/5/202258整理課件 綜合這兩種特點(diǎn)可以有以下4種數(shù)據(jù)棧。FD Full DescendingED Empty DescendingFA Fu

27、ll AscendingEA Empty Ascending ATPCS規(guī)定數(shù)據(jù)棧為FD類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。8/5/202259整理課件3) 數(shù)傳遞規(guī)則 (1)參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則: 對(duì)于參數(shù)個(gè)數(shù)可變的子程序,當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0R3來(lái)傳遞參數(shù);當(dāng)參數(shù)超過(guò)4個(gè)時(shí),還可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù)。 在參數(shù)傳遞時(shí),將所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元中的宇數(shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳送到寄存器R0、Rl、R2、R3中,如果參數(shù)多于4個(gè),將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。8/5/202260整理課件(2)參

28、數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則 對(duì)于參數(shù)個(gè)數(shù)固定的子程序,參數(shù)傳遞與參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則不同。如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面的規(guī)則傳遞: 各個(gè)浮點(diǎn)參數(shù)按順序處理。 為每個(gè)浮點(diǎn)參數(shù)分配FP寄存器。 分配的方法是,滿足該浮點(diǎn)參數(shù)需要的且編號(hào)最小的一組連續(xù)的FP寄存器。第一個(gè)整數(shù)參數(shù),通過(guò)寄存器R0R3來(lái)傳遞。其他參數(shù)通過(guò)數(shù)據(jù)棧傳遞。8/5/202261整理課件(3)子程序結(jié)果返回規(guī)則 結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過(guò)寄存器R0返回。 結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過(guò)寄存器R0和R1返回,依次類推。 結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過(guò)浮點(diǎn)運(yùn)算部件的寄存器f0、d0或者s0

29、來(lái)返回。 結(jié)果為復(fù)合型的浮點(diǎn)數(shù)(如復(fù)數(shù))時(shí),可以通過(guò)寄存鉛f0fn或者d0dn來(lái)返回。 對(duì)于位數(shù)更多的結(jié)果,需要通過(guò)內(nèi)存來(lái)傳遞。8/5/202262整理課件2.ARM和Thumb程序混合使用 在編譯和匯編時(shí),使用/interwork告訴編譯器生成的目標(biāo)代碼遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下場(chǎng)合: 1) 程序中存在ARM程序調(diào)用Thumb程序的情況。 2) 程序中存在Thumb程序調(diào)用ARM程序的情況。 3) 需要連接器來(lái)進(jìn)行ARM狀態(tài)和Thumb狀態(tài)切換的情況。8/5/202263整理課件例如:進(jìn)行狀態(tài)切換的匯編程序 ARMADR r0,ThumbProg+1

30、BX r0 ;跳到ThumbProg,程序切換到Thumb狀志THUMB ;THUMB指示編譯器后面的為Thumb指令ThumbProg: .ADR r0,ARMProgBX r0 ;跳轉(zhuǎn)到ARMProg,程序切換到ARM狀態(tài)ARM ;ARM指示編譯器后面的為ARM指令A(yù)RMProg:MOV r4, #48/5/202264整理課件4. ARM程序設(shè)計(jì). ARM匯編語(yǔ)言程序設(shè)計(jì) ARM匯編語(yǔ)言以段(section)為單位組織源文件。 段是相對(duì)獨(dú)立的、具有特定名稱的、不可分割的指令或數(shù)據(jù)序列。 段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至

31、少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。8/5/202265整理課件) ARM匯編中的文件格式 ARM源程序文件(可簡(jiǎn)稱為源文件)可以由任意一種文本編輯器來(lái)編寫(xiě)程序代碼,它一般為文本格式。在ARM程序設(shè)計(jì)中,常用的源文件可簡(jiǎn)單分為以下幾種. 8/5/202266整理課件2) ARM匯編語(yǔ)言語(yǔ)句格式 ARM匯編語(yǔ)言語(yǔ)句格式如下所示:symbol instruction | directive | pseudo-instruction;comment 其中: instruction為指令。 directive為偽操作。 pseudo-instrkeuction為偽指令。 symbol

32、為符號(hào)。 comment為語(yǔ)句的注釋。 8/5/202267整理課件 ARM匯編語(yǔ)言中,符號(hào)可代表地址、變量和數(shù)字常量。數(shù)字常量一般有3種表達(dá)方式: 十進(jìn)制數(shù),如79、4等。 十六進(jìn)制數(shù),以0 x和&開(kāi)頭,如0 x345、0 xFB。 n進(jìn)制數(shù),用n_XXX表示,如2_01100101、8_5642。 標(biāo)號(hào):表示程序中的指令或數(shù)據(jù)地址的符號(hào),代表地址。局部標(biāo)號(hào):主要用于局部范圍代碼。8/5/202268整理課件)ARM匯編語(yǔ)言程序格式 ADS環(huán)境下ARM匯編語(yǔ)言源程序的基本結(jié)構(gòu): AREA EXAMPLE,CODE,READONLY ENTRY start MOV r0,#10 MOV r1,#3 ADD r0,r0,r1 END 上述程序的程序體部分實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的加法運(yùn)算。 8/5/202269整理課件GNU環(huán)境下ARM匯編語(yǔ)言源程序的基本結(jié)構(gòu):.equx, 45 /* 定義變量x,并賦值為45*/.equy, 64 /* 定義變量y,并賦值為64*/.equstack_top, 0 x1000/* 定義棧頂0 x1000*/.global _start.text_start: /*程序代碼開(kāi)始標(biāo)志*/ MOV sp, #stack_top MOV r0, #x /* x的值放入R0 */ MOV

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論