arm嵌入式原理技術(shù)及應(yīng)用ch-4_第1頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch-4_第2頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch-4_第3頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch-4_第4頁(yè)
arm嵌入式原理技術(shù)及應(yīng)用ch-4_第5頁(yè)
已閱讀5頁(yè),還剩71頁(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、arm嵌入式原理技術(shù)及應(yīng)用ch-4arm嵌入式原理技術(shù)及應(yīng)用ch-4第四章 ARM匯編程序設(shè)計(jì)9/21/2022第四章 ARM匯編程序設(shè)計(jì)9/21/2022 了解與熟悉ADS下的偽操作和宏指令以及它的應(yīng)用 了解與熟悉GNU下的偽操作和宏指令以及它的應(yīng)用 熟悉ARM ATPCS 能夠利用匯編語(yǔ)言進(jìn)行簡(jiǎn)單的程序設(shè)計(jì) 9/21/2022 了解與熟悉ADS下的偽操作和宏指令以及它的應(yīng)用91. 偽指令、偽操作和宏指令概念 偽指令是匯編語(yǔ)言程序里的特殊指令助記符,在匯編時(shí)被合適的機(jī)器指令替代。 偽操作為匯編程序所用,在源程序進(jìn)行匯編時(shí)由匯編程序處理,只在匯編過(guò)程起作用,不參與程序運(yùn)行。4.1. 匯編偽指令

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

3、指令。ADRL:中等范圍的地址讀取偽指令。LDR:大范圍的地址讀取偽指令。NOP:空操作偽指令。9/21/20222 . ARM匯編偽指令 ARM偽指令不(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á)式

4、。取值范圍是參考P2129/21/2022(1) ADR小范圍的地址讀取9/21/2022例1: (0 x20) ADR R1,Delay Delay(0 x64) MOV 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 x649/21/2022例1:編譯后的反匯編代碼: PC+0 x3C9/21/20例2:查表 ADR R0,D_TAB ;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2 ;使用R2作為參數(shù),進(jìn)行查表 D_TAB DCB 0 xC

5、0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x929/21/2022例2:查表9/21/2022(2)ADRL中等范圍的地址讀取ADRL偽指令功能:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。ADRL偽指令功能實(shí)現(xiàn)方法:在匯編編譯器編譯源程序時(shí),ADRL被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。語(yǔ)法格式: ADRLcond register,expr其中:register:加載的目標(biāo)寄存器。expr:地址表達(dá)式。取值范圍參考P2129/21/2022(2)ADRL中等范圍的地址

6、讀取9/21/2022例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 ADRL偽指令被匯編成兩條指令,盡管第2條指令并沒(méi)有意義。9/21/2022例3:編譯后的反匯編代碼: ADRL偽指令被匯編成兩條(3)LDR 大范圍的地址讀取LDR偽指令功能:用于加載32位立即數(shù)或一個(gè)地址值到指定的寄存器。LDR偽指令功能實(shí)現(xiàn)方法:在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成一條合適的指令。若加載的

7、常數(shù)未超過(guò)MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令;否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的LDR指令從文字池讀出常量。 9/21/2022(3)LDR 大范圍的地址讀取9/21/2022 語(yǔ)法格式: LDRcond register,=expr其中:Register:加載的目標(biāo)寄存器。expr:32位常量或地址表達(dá)式。9/21/2022 9/21/2022例4: (0 x060) LDR R1,=Delay Delay(0 x102) MOV R0,R14 使用LDR將程序標(biāo)號(hào)Delay所表示的地址存入R1。編譯后的反匯編代碼: LDR R1,stack

8、Delay MOV R0,R14 LTORGstack DCD 0 x102 LDR偽指令被匯編成一條LDR指令,并在文字池中定義一個(gè)常量,該常量為標(biāo)號(hào)Delay的地址。9/21/2022例4: 使用LDR將程序標(biāo)號(hào)Delay所表示的地址存入注意: 從指令位置到文字池的偏移量必須小于4KB。 與ARM指令的LDR的區(qū)別:偽指令LDR的參數(shù)有“=”號(hào)。9/21/2022注意:9/21/2022(4)NOP空操作偽指令NOP偽指令功能實(shí)現(xiàn)方法:在匯編時(shí)將被替代成ARM中的空操作,比如可能是“MOV R0,R0”指令等。用途:NOP可用于延時(shí)操作。語(yǔ)法格式: NOP例:延時(shí)子程序 Delay NOP

9、 ;空操作 NOP NOP SUBS R1,R1,#1 ;循環(huán)次數(shù)減1 BNE Delay MOV PC,LR9/21/2022(4)NOP空操作偽指令9/21/20223. ARM匯編偽操作ADS編譯環(huán)境下的偽操作可分為以下幾類:符號(hào)定義(Symbol Definition)偽操作 數(shù)據(jù)定義(Data Definition)偽操作 匯編控制(Assembly Control)偽操作 其它(Miscellaneous)偽操作 9/21/20223. ARM匯編偽操作ADS編譯環(huán)境下的偽操作可分為以下(1) 符號(hào)定義偽操作 GBLA,GBLL,GBLS:聲明全局變量。LCLA,LCLL,LCLS

10、:聲明局部變量。SETA,SETL,SETS:給變量賦值。RLIST:為通用寄存器列表定義名稱。 9/21/2022(1) 符號(hào)定義偽操作 GBLA,GBLL,GBLS:聲明全(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ù)域 9/21/2022(2) 數(shù)據(jù)定義偽操作LTORG:聲明一個(gè)數(shù)據(jù)緩沖池的開(kāi)始9 MAP、 FIELD、 SPACEMAP 0 x100, R0 ;定義結(jié)構(gòu)

11、化內(nèi)存表首地址的值為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。9/21/20229/21/2022LTORG用于聲明一個(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) 存單元,并初始化

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

13、當(dāng)DCB后面緊跟一個(gè)指令時(shí),可能需要使用ALIGN確保指令是字對(duì)齊的。9/21/2022 DCB也可以用符號(hào)”=”表示9/21/2022例:short DCB 1 ;為short分配了一個(gè)字節(jié),并初始化為1。 string DCB “string”,0 ;構(gòu)造一個(gè)以0 結(jié)尾的字符串 9/21/2022例:9/21/2022DCD、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)。

14、注意:DCD偽操作可能在分配的第一個(gè)內(nèi)存單元前插入填補(bǔ)字節(jié)以保證分配的內(nèi)存是字對(duì)齊的。9/21/2022DCD、DCDU分配一段字內(nèi)存單元9/21/2022例: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ì)齊。9/21/2022例:9/21/2022(3)匯編控制偽操作IF,ELSE及ENDIF:有條件選擇匯編WHILE及WEND:有條件循環(huán)(重復(fù))匯編MACRO,ME

15、ND及MEXIT:宏定義匯編9/21/2022(3)匯編控制偽操作IF,ELSE及ENDIF:有條件選擇匯(4)其它偽操作AREA:定義一個(gè)代碼段或數(shù)據(jù)段 CODE16、CODE32:告訴編譯器后面的指令序列位數(shù) ENTRY:指定程序的入口點(diǎn) ALIGN:將當(dāng)前的位置以某種形式對(duì)齊 END:源程序結(jié)尾 EQU:為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)定義一個(gè)字符名稱。9/21/2022(4)其它偽操作AREA:定義一個(gè)代碼段或數(shù)據(jù)段9/21/ EXPORT、GLOBAL:聲明源文件中的符號(hào)可以被其他源文件引用 IMPORT、EXTERN:聲明某符號(hào)是在其他源文件中定義的 GET、INCLUDE

16、:將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。 INCBIN:將一個(gè)文件包含到當(dāng)前源文件中,而被包含的文件不進(jìn)行匯編處理9/21/2022 EXPORT、GLOBAL:聲明源文件中的符號(hào)可以被其他1)AREA用于定義一個(gè)代碼段或是數(shù)據(jù)段。語(yǔ)法格式: AREA sectionname,attr ,attr 其中:sectionname:為所定義的段的名稱。attr:該段的屬性。具有的屬性為:CODE:定義代碼段。DATA:定義數(shù)據(jù)段。READONLY:指定本段為只讀,代碼段的默認(rèn)屬性。READWRITE:指定本段為可讀可寫(xiě),數(shù)據(jù)段的默認(rèn)屬性。9/21/20221)A

17、REA9/21/2022ALIGN:指定段的對(duì)齊方式為2expression。expression的取值為031。COMMON:指定一個(gè)通用段。該段不包含任何用戶代碼和數(shù)據(jù)。NOINIT:指定此數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒(méi)有將各初始值寫(xiě)入內(nèi)存單元,或者將各個(gè)內(nèi)存單元值初始化為0。注意:一個(gè)大的程序可包含多個(gè)代碼段和數(shù)據(jù)段。一個(gè)匯編程序至少包含一個(gè)代碼段。9/21/2022ALIGN:指定段的對(duì)齊方式為2expression。exp2)CODE16和CODE32CODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令。CODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。語(yǔ)法格

18、式: CODE16 CODE32 注意:CODE16和CODE32只是告訴編譯器后面指令的類型,該偽操作本身不進(jìn)行程序狀態(tài)的切換。9/21/20222)CODE16和CODE329/21/2022例:AREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面為32位ARM指令 LDR R0,=start+1 BX R0 CODE16 ;下面為16位Thumb指令start MOV R1,#10 . END;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行9/21/2022例:;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行9/3)ENTRY指定程序的入口點(diǎn)

19、。語(yǔ)法格式: ENTRY注意: 一個(gè)程序(可包含多個(gè)源文件)中至少要有一個(gè)ENTRY(可以有多個(gè)ENTRY),但一個(gè)源文件中最多只能有一個(gè)ENTRY(可以沒(méi)有ENTRY)9/21/20223)ENTRY9/21/20224)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è)字邊界處。Offset:偏移量,可以為常數(shù)或數(shù)值表達(dá)式。不指定offset表示將當(dāng)前位置對(duì)齊到以expr為單位的起始位置。9/21/2

20、0224)ALIGN9/21/2022例1:short DCB 1 ;本操作使字對(duì)齊被破壞ALIGN ;重新使其為字對(duì)齊MOV R0,1例2:ALIGN 8 ;當(dāng)前位置以2個(gè)字的方式對(duì)齊9/21/2022例1:9/21/20225)ENDEND偽操作告訴編譯器已經(jīng)到了源程序結(jié)尾。語(yǔ)法格式: END注意:每一個(gè)匯編源程序都必須包含END偽操作,以表明本源程序的結(jié)束。9/21/20225)END9/21/20226)EQU EQU偽操作為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(hào)定義一個(gè)字符名稱。語(yǔ)法格式: name EQU expr,type其中:name:為expr定義的字符名稱。expr:基于寄

21、存器的地址值、程序中的標(biāo)號(hào)、32位的地址常量或者32位的常量。表達(dá)式,為常量。type:當(dāng)expr為32位常量時(shí),可以使用type指示expr的數(shù)據(jù)的類型。取值為:CODE32CODE16DATA9/21/20226)EQU 9/21/2022例: 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指令9/21/2022例:9/21/20227)EXPORT及GLOBAL 聲明一個(gè)源文件中的符號(hào),使此符號(hào)

22、可以被其他源文件引用。語(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,R19/21/20227)EXPORT及GLOBAL9/21/20228)IMPORT及EXTERN聲明一個(gè)符號(hào)是在其他源文件中定義的。語(yǔ)法格式:IMPORT symbolweakEXTERN symbolweak其中:symbol:聲明的符號(hào)的名稱。9/21/20228)IMPORT及EXTERN9

23、/21/2022weak:當(dāng)沒(méi)有指定此項(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。9/21/2022weak:9/21/20229)GET及INCLUDE將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。指令格式:GET filenameINCLUDE filename其中: filename:包含的源文件名,可以

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

25、字存放在0 x400000中。AREA SORT,CODE,READONLYENTRYSTARTMOV R1,#0 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 LPEXITEND9/21/2022例:編寫(xiě)一具有完整匯編格式的程序,實(shí)現(xiàn)冒泡法排序功能。設(shè)4.GNU下的偽操作和宏指令 GNU編譯環(huán)境下的偽操作可分為以下幾類:1) 常量編譯控制偽操作2) 匯編程序代碼控

26、制偽操作3) 宏及條件編譯控制偽操作4) 其他偽操作9/21/20224.GNU下的偽操作和宏指令 GNU編譯環(huán)境下的偽操作可分為1)常量編譯控制偽操作 9/21/20221)常量編譯控制偽操作 9/21/2022)匯編程序代碼控制偽操作 9/21/2022)匯編程序代碼控制偽操作 9/21/2022)宏及條件編譯控制偽操作9/21/2022)宏及條件編譯控制偽操作9/21/2022)其他偽操作 9/21/2022)其他偽操作 9/21/20225.ADS與GNU編譯環(huán)境下的比較 9/21/20225.ADS與GNU編譯環(huán)境下的比較 9/21/20229/21/20229/21/20224.

27、ARM ATPCS 1. 基本ATPCS ATPCS就是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則。ATPCS規(guī)定了一些子程序間調(diào)用的基本規(guī)則。 子程序調(diào)用過(guò)程中寄存器的使用規(guī)則 數(shù)據(jù)棧的使用規(guī)則 參數(shù)的傳遞規(guī)則。9/21/20224. ARM ATPCS 1. 基本ATPCS 相對(duì)于其他類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少。 它不能提供以下的支持: 1) ARM程序和Thumb程序相互調(diào)用; 2) 數(shù)據(jù)以及代碼的位置無(wú)關(guān)的支持; 3)子程序的可重入性; 4) 數(shù)據(jù)棧檢查的支持。9/21/2022相對(duì)于其他類型的ATPCS,滿足基本ATPCS的程序的

28、執(zhí)1)寄存器的使用規(guī)則 寄存器的使用必須滿足下面的規(guī)則:子程序間通過(guò)寄存器 R0一R3來(lái)傳遞參數(shù)在子程序中,使用寄存器R4R11來(lái)保存局部變量 寄存器R12用作子程序間scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出棧),記作ip。在子程序間的連接代碼段中常有這種使用規(guī)則。9/21/20221)寄存器的使用規(guī)則9/21/2022寄存器R13用作數(shù)據(jù)棧指針,記作sp。 寄存器R14稱為連接寄存器,記作lr。 寄存器R15是程序計(jì)數(shù)器,記作pc。它不能用作其他用途。9/21/2022寄存器R13用作數(shù)據(jù)棧指針,記作sp。 9/21/2022 ATPCS中各寄存器的使用規(guī)則及其名稱9/

29、21/2022 ATPCS中各寄存器的使用規(guī)則及其名稱9/21/202)數(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棧。9/21/20222)數(shù)據(jù)棧使用規(guī)則9/21/2022 綜合這兩種特點(diǎn)可以有以下4種數(shù)據(jù)棧。FD Full DescendingED Empty Descendin

30、gFA Full AscendingEA Empty Ascending ATPCS規(guī)定數(shù)據(jù)棧為FD類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。9/21/2022 綜合這兩種特點(diǎn)可以有以下4種數(shù)據(jù)棧。9/21/23) 數(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ù)順序相反,即最后一

31、個(gè)字?jǐn)?shù)據(jù)先入棧。9/21/20223) 數(shù)傳遞規(guī)則9/21/2022(2)參數(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ù)棧傳遞。9/21/2022(2)參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則9/21/2022(3)子程序結(jié)果返回規(guī)則 結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過(guò)寄存器R0返回。 結(jié)果為一個(gè)

32、64位整數(shù)時(shí),可以通過(guò)寄存器R0和R1返回,依次類推。 結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過(guò)浮點(diǎn)運(yùn)算部件的寄存器f0、d0或者s0來(lái)返回。 結(jié)果為復(fù)合型的浮點(diǎn)數(shù)(如復(fù)數(shù))時(shí),可以通過(guò)寄存鉛f0fn或者d0dn來(lái)返回。 對(duì)于位數(shù)更多的結(jié)果,需要通過(guò)內(nèi)存來(lái)傳遞。9/21/2022(3)子程序結(jié)果返回規(guī)則9/21/20222.ARM和Thumb程序混合使用 在編譯和匯編時(shí),使用/interwork告訴編譯器生成的目標(biāo)代碼遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下場(chǎng)合: 1) 程序中存在ARM程序調(diào)用Thumb程序的情況。 2) 程序中存在Thumb程序調(diào)用ARM程序的情況。 3) 需

33、要連接器來(lái)進(jìn)行ARM狀態(tài)和Thumb狀態(tài)切換的情況。9/21/20222.ARM和Thumb程序混合使用9/21/2022例如:進(jìn)行狀態(tài)切換的匯編程序 ARMADR r0,ThumbProg+1 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, #49/21/2022例如:進(jìn)行狀態(tài)切換的匯編程序 9/21/20224. ARM程序設(shè)計(jì). ARM匯

34、編語(yǔ)言程序設(shè)計(jì) ARM匯編語(yǔ)言以段(section)為單位組織源文件。 段是相對(duì)獨(dú)立的、具有特定名稱的、不可分割的指令或數(shù)據(jù)序列。 段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)ARM源程序至少需要一個(gè)代碼段,大的程序可以包含多個(gè)代碼段和數(shù)據(jù)段。9/21/20224. ARM程序設(shè)計(jì). ARM匯編語(yǔ)言程序設(shè)計(jì)9/21/) ARM匯編中的文件格式 ARM源程序文件(可簡(jiǎn)稱為源文件)可以由任意一種文本編輯器來(lái)編寫(xiě)程序代碼,它一般為文本格式。在ARM程序設(shè)計(jì)中,常用的源文件可簡(jiǎn)單分為以下幾種. 9/21/2022) ARM匯編中的文件格式 9/21/2022

35、2) ARM匯編語(yǔ)言語(yǔ)句格式 ARM匯編語(yǔ)言語(yǔ)句格式如下所示:symbol instruction | directive | pseudo-instruction;comment 其中: instruction為指令。 directive為偽操作。 pseudo-instrkeuction為偽指令。 symbol為符號(hào)。 comment為語(yǔ)句的注釋。 9/21/20222) ARM匯編語(yǔ)言語(yǔ)句格式 9/21/2022 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ù),

36、用n_XXX表示,如2_01100101、8_5642。 標(biāo)號(hào):表示程序中的指令或數(shù)據(jù)地址的符號(hào),代表地址。局部標(biāo)號(hào):主要用于局部范圍代碼。9/21/2022 ARM匯編語(yǔ)言中,符號(hào)可代表地址、變)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)算。 9/21/2022)ARM匯編語(yǔ)言程序格式 9/21/2022GNU環(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_to

溫馨提示

  • 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)論