ARM匯編程序設計_第1頁
ARM匯編程序設計_第2頁
ARM匯編程序設計_第3頁
ARM匯編程序設計_第4頁
ARM匯編程序設計_第5頁
已閱讀5頁,還剩69頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、2022-4-14第四章 ARM匯編程序設計2022-4-14 了解與熟悉了解與熟悉ADSADS下的偽操作和宏指令以及下的偽操作和宏指令以及它的應用它的應用 了解與熟悉了解與熟悉GNUGNU下的偽操作和宏指令以及下的偽操作和宏指令以及它的應用它的應用 熟悉熟悉ARM ATPCSARM ATPCS 能夠利用匯編語言進行簡單的程序設計能夠利用匯編語言進行簡單的程序設計 2022-4-141. 1. 偽指令、偽操作和宏指令概念偽指令、偽操作和宏指令概念 偽指令偽指令是匯編語言程序里的特殊指令助記符,是匯編語言程序里的特殊指令助記符,在匯編時被合適的機器指令替代。在匯編時被合適的機器指令替代。 偽操作

2、偽操作為匯編程序所用,在源程序進行匯編為匯編程序所用,在源程序進行匯編時由匯編程序處理,只在匯編過程起作用,不參與時由匯編程序處理,只在匯編過程起作用,不參與程序運行。程序運行。4.1. 4.1. 匯編偽指令和宏指令匯編偽指令和宏指令2022-4-14 宏指令宏指令通過偽操作定義的一段獨立的代碼。在調用它通過偽操作定義的一段獨立的代碼。在調用它時將宏體插入到源程序中。時將宏體插入到源程序中。也就是常說的宏也就是常說的宏。說明:說明:所有的偽指令、偽操作和宏指令,均與具體的所有的偽指令、偽操作和宏指令,均與具體的開發工具中的編譯器有關,當前主要采用開發工具中的編譯器有關,當前主要采用ARM公司的

3、公司的“ADS/SDT IDE”開發工具,所以后面的討論,均是基于開發工具,所以后面的討論,均是基于ARM公司的開發工具。公司的開發工具。2022-4-142 . ARM2 . ARM匯編偽指令匯編偽指令 ARM偽指令不屬于偽指令不屬于ARM指令集中的指令,是為了指令集中的指令,是為了編程方便而定義的。偽指令可以像其它編程方便而定義的。偽指令可以像其它ARM指令一樣使指令一樣使用,但在編譯時這些指令將被等效的用,但在編譯時這些指令將被等效的ARM指令代替。指令代替。ARM偽指令有四條,分別是:偽指令有四條,分別是: ADR:小范圍的地址讀取偽指令。:小范圍的地址讀取偽指令。 ADRL:中等范圍

4、的地址讀取偽指令。:中等范圍的地址讀取偽指令。 LDR:大范圍的地址讀取偽指令。:大范圍的地址讀取偽指令。 NOP:空操作偽指令。:空操作偽指令。2022-4-14(1) ADR小范圍的地址讀取小范圍的地址讀取 ADR偽指令功能:偽指令功能:將基于將基于PC相對偏移的地址值或基于寄相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。存器相對偏移的地址值讀取到寄存器中。 ADR偽指令功能的實現方法:偽指令功能的實現方法:在匯編編譯器編譯源程序在匯編編譯器編譯源程序時,時,ADR偽指令被編譯器替換成一條合適的指令。通常,編偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條譯器用一條AD

5、D指令或指令或SUB指令來實現此指令來實現此ADR偽指令的功能,偽指令的功能,若不能用一條指令實現,則產生錯誤,編譯失敗。若不能用一條指令實現,則產生錯誤,編譯失敗。語法格式:語法格式: ADRcond register,expr其中:其中: register:加載的目標寄存器。:加載的目標寄存器。 expr:地址表達式。取值范圍是參考:地址表達式。取值范圍是參考P2122022-4-14 例例1: (0 x20) ADR R1,Delay Delay(0 x64) MOV R0,R14 使用使用ADR將程序標號將程序標號Delay所表示的地址存入所表示的地址存入R1。編譯后的反匯編代碼:編譯

6、后的反匯編代碼: ADD R1,PC,#0 x3C MOV R0,R14 PC+0 x3C=0 x20+0 x08+0 x3C=0 x642022-4-14例例2:查表:查表 ADR R0,D_TAB ;加載轉換表地址加載轉換表地址 LDRB R1,R0,R2 ;使用使用R2作為參數,進行查表作為參數,進行查表 D_TAB DCB 0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x922022-4-14(2)ADRL中等范圍的地址讀取中等范圍的地址讀取ADRL偽指令功能:偽指令功能:將基于將基于PC相對偏移的地址值或基于寄相對偏移的地址值或基于寄存器相對偏移的地址值讀

7、取到寄存器中,比存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以偽指令可以讀取更大范圍的地址。讀取更大范圍的地址。ADRL偽指令功能實現方法:偽指令功能實現方法:在匯編編譯器編譯源程序時,在匯編編譯器編譯源程序時,ADRL被編譯器替換成兩條合適的指令。若不能用兩條指令實被編譯器替換成兩條合適的指令。若不能用兩條指令實現,則產生錯誤,編譯失敗?,F,則產生錯誤,編譯失敗。語法格式:語法格式: ADRLcond register,expr其中:其中: register:加載的目標寄存器。:加載的目標寄存器。 expr:地址表達式。取值范圍參考:地址表達式。取值范圍參考P2122022-4-14

8、例例3: (0 x20) ADRL R1,Delay Delay(0 x64) MOV R0,R14 使用使用ADRL將程序標號將程序標號Delay所表示的地址存入所表示的地址存入R1。編譯后的反匯編代碼:編譯后的反匯編代碼: ADD R1,PC,#0 x3CADD R1,R1,#0 MOV R0,R14 ADRL ADRL偽指令被匯編成兩偽指令被匯編成兩條指令,盡管第條指令,盡管第2 2條指令并條指令并沒有意義。沒有意義。2022-4-14(3)LDR 大范圍的地址讀取大范圍的地址讀取LDR偽指令功能:偽指令功能:用于加載用于加載32位立即數或一個位立即數或一個地址值到指定的寄存器。地址值到

9、指定的寄存器。LDR偽指令功能實現方法:偽指令功能實現方法:在匯編編譯源程序在匯編編譯源程序時,時,LDR偽指令被編譯器替換成一條合適的指令。偽指令被編譯器替換成一條合適的指令。 若若加載的常數未超過加載的常數未超過MOV或或MVN的范圍,則使的范圍,則使用用MOV或或MVN指令代替該指令代替該LDR偽指令;偽指令; 否則否則匯編器將常量放入文字池,并使用一條程匯編器將常量放入文字池,并使用一條程序相對偏移的序相對偏移的LDR指令從文字池讀出常量。指令從文字池讀出常量。 2022-4-14 語法格式:語法格式: LDRcond register,=expr其中:其中:Register:加載的目

10、標寄存器。:加載的目標寄存器。expr:32位常量或地址表達式。位常量或地址表達式。2022-4-14 例例4: (0 x060) LDR R1,=Delay Delay(0 x102) MOV R0,R14 使用使用LDR將程序標號將程序標號Delay所表示的地址存入所表示的地址存入R1。編譯后的反匯編代碼:編譯后的反匯編代碼: LDR R1,stack Delay MOV R0,R14 LTORGstack DCD 0 x102 LDR偽指令被匯編成一條偽指令被匯編成一條LDR指令指令,并在文字池中定義一個常量并在文字池中定義一個常量,該常量為標號該常量為標號Delay的地址。的地址。20

11、22-4-14注意:注意: 從指令位置到文字池的偏移量必須小于從指令位置到文字池的偏移量必須小于4KB。 與與ARM指令的指令的LDR的區別:偽指令的區別:偽指令LDR的參數有的參數有“=”號。號。2022-4-14(4)NOP空操作偽指令空操作偽指令NOP偽指令功能實現方法:偽指令功能實現方法:在匯編時將被替代成在匯編時將被替代成ARM中的空操作,比如可能是中的空操作,比如可能是“MOV R0,R0”指令等。指令等。用途:用途:NOP可用于延時操作。可用于延時操作。語法格式:語法格式: NOP例:延時子程序例:延時子程序 Delay NOP ;空操作空操作 NOP NOP SUBS R1,R

12、1,#1 ;循環次數減循環次數減1 BNE Delay MOV PC,LR2022-4-143. ARM3. ARM匯編偽操作匯編偽操作ADS編譯環境下的偽操作可分為以下幾類:編譯環境下的偽操作可分為以下幾類:符號定義符號定義(Symbol Definition)偽操作)偽操作 數據定義數據定義(Data Definition)偽操作)偽操作 匯編控制匯編控制(Assembly Control)偽操作)偽操作 其它其它(Miscellaneous)偽操作)偽操作 2022-4-14(1) 符號定義偽操作符號定義偽操作 vGBLA,GBLL,GBLS:聲明全局變量。:聲明全局變量。vLCLA,L

13、CLL,LCLS:聲明局部變量。:聲明局部變量。vSETA,SETL,SETS:給變量賦值。:給變量賦值。vRLIST:為通用寄存器列表定義名稱。:為通用寄存器列表定義名稱。 2022-4-14(2) 數據定義偽操作數據定義偽操作 LTORG:聲明一個數據緩沖池的開始:聲明一個數據緩沖池的開始 SPACE:分配一塊字節內存單元,并用:分配一塊字節內存單元,并用0初始化初始化 DCB:分配一段字節內存單元,并初始化:分配一段字節內存單元,并初始化 DCD、DCDU:分配一段字內存單元,并初始化:分配一段字內存單元,并初始化 MAP:定義一個結構化的內存表的首地址:定義一個結構化的內存表的首地址

14、FIELD:定義結構化內存表中的一個數據域:定義結構化內存表中的一個數據域 2022-4-14 MAPMAP、 FIELDFIELD、 SPACEMAP 0 x100MAP 0 x100, R0 R0 ;定義結構化內存表首地址的值為;定義結構化內存表首地址的值為0 x1000 x100R0R0A FIELD 16 A FIELD 16 ;定義;定義A A的長度為的長度為1616字節,位置為字節,位置為0 x110+R0 0 x110+R0 LTORG ;定義數據緩沖池定義數據緩沖池&0 x8000Data SPACE 4200 ;從當前位置開始分配從當前位置開始分配4200字節的內存單字節的內

15、存單元,并初始化為元,并初始化為0。2022-4-14LTORG用于聲明一個數據緩沖池(文字池)的開始。用于聲明一個數據緩沖池(文字池)的開始。語法格式:語法格式:LTORG例:例:start BL func; func LDR R1,=0 x8000 ;子程序子程序 MOV PC,LR ;子程序返回子程序返回 LTORG ;定義數據緩沖池定義數據緩沖池&0 x8000Data SPACE 4200 ;從當前位置開始分配從當前位置開始分配4200字節的內字節的內 存單元,并初始化為存單元,并初始化為0。 END 默認數據緩沖池為空默認數據緩沖池為空2022-4-14注意:注意: LTORG偽操

16、作通常放在無條件跳轉指令之后,偽操作通常放在無條件跳轉指令之后,或者子程序返回指令之后,這樣處理器不會錯誤地或者子程序返回指令之后,這樣處理器不會錯誤地將數據緩沖池中的數據當作指令來執行。將數據緩沖池中的數據當作指令來執行。 通常通常ARM匯編編譯器把數據緩沖池放在代碼段匯編編譯器把數據緩沖池放在代碼段的最后面,即下一個代碼段開始之前,或者的最后面,即下一個代碼段開始之前,或者END偽偽操作之前。操作之前。2022-4-14 DCB也可以用符號也可以用符號”=”表示表示用于定義并且初始化一個或者多個字節的內存區域。用于定義并且初始化一個或者多個字節的內存區域。語法格式:語法格式: label

17、DCB expr,expr或或 label = expr,expr其中其中expr表示:表示:-128到到255之間的一個數值常量或者表達式。之間的一個數值常量或者表達式。 一個字符串。一個字符串。注意:注意:當當DCB后面緊跟一個指令時,可能需要使用后面緊跟一個指令時,可能需要使用ALIGN確保指令是字對齊的。確保指令是字對齊的。2022-4-14例:例:short DCB 1 ;為為short分配了一個字節分配了一個字節,并初始化為并初始化為1。 string DCB “string”,0 ;構造一個以構造一個以0 結尾的字符串結尾的字符串 2022-4-14DCD、DCDU分配一段字內存

18、單元分配一段字內存單元(1)DCD 分配一段字對齊的內存單元分配一段字對齊的內存單元用于分配一段字對齊的內存單元,并初始化。用于分配一段字對齊的內存單元,并初始化。 DCD也可以用符號也可以用符號”&”表示表示語法格式:語法格式: label DCD expr,expr或或 label & expr,expr 其中:其中:expr :數字表達式或程序中的標號。:數字表達式或程序中的標號。注意:注意:DCD偽操作可能在分配的第一個內存單元前插入填補字節以保偽操作可能在分配的第一個內存單元前插入填補字節以保證分配的內存是字對齊的。證分配的內存是字對齊的。2022-4-14例:例:data1 DCD

19、 2,4,6 ;為為data1分配三個字分配三個字,內容初始化為內容初始化為2,4,6 data2 DCD label+4 ;初始化初始化data2為為label+4對應的地址對應的地址 (2)DCDU 分配一段字非嚴格對齊的內存單元分配一段字非嚴格對齊的內存單元DCDU與與DCD的不同之處在于的不同之處在于DCDU分配的內存單元并分配的內存單元并不嚴格字對齊。不嚴格字對齊。2022-4-14(3)匯編控制偽操作)匯編控制偽操作 IF,ELSE及及ENDIF:有條件選擇匯編:有條件選擇匯編 WHILE及及WEND:有條件循環(重復)匯編:有條件循環(重復)匯編 MACRO,MEND及及MEXI

20、T:宏定義匯編:宏定義匯編2022-4-14(4)其它偽操作)其它偽操作AREA:定義一個代碼段或數據段定義一個代碼段或數據段 CODE16、CODE32:告訴編譯器后面的指令序列位數告訴編譯器后面的指令序列位數 ENTRY:指定程序的入口點指定程序的入口點 ALIGN:將當前的位置以某種形式對齊將當前的位置以某種形式對齊 END:源程序結尾源程序結尾 EQU:為數字常量、基于寄存器的值和程序中的標號定義一為數字常量、基于寄存器的值和程序中的標號定義一個字符名稱。個字符名稱。2022-4-14 EXPORT、GLOBAL:聲明源文件中的符號可以被其他源文聲明源文件中的符號可以被其他源文件引用件

21、引用 IMPORT、EXTERN:聲明某符號是在其他源文件中定義的聲明某符號是在其他源文件中定義的 GET、INCLUDE:將一個源文件包含到當前源文件中,并將將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理。被包含的文件在其當前位置進行匯編處理。 INCBIN:將一個文件包含到當前源文件中,而被包含的文件將一個文件包含到當前源文件中,而被包含的文件不進行匯編處理不進行匯編處理2022-4-141)AREA用于定義一個代碼段或是數據段。用于定義一個代碼段或是數據段。語法格式:語法格式: AREA sectionname,attr ,attr 其中:其中: section

22、name:為所定義的段的名稱。:為所定義的段的名稱。 attr:該段的屬性。具有的屬性為:該段的屬性。具有的屬性為: CODE:定義代碼段。定義代碼段。 DATA:定義數據段。定義數據段。 READONLY:指定本段為只讀指定本段為只讀,代碼段的默認屬性。代碼段的默認屬性。 READWRITE:指定本段為可讀可寫指定本段為可讀可寫,數據段的默認數據段的默認屬性。屬性。2022-4-14 ALIGN:指定段的對齊方式為指定段的對齊方式為2expression。expression的取值為的取值為031。 COMMON:指定一個通用段。該段不包含任指定一個通用段。該段不包含任何用戶代碼和數據。何用

23、戶代碼和數據。 NOINIT:指定此數據段僅僅保留了內存單元,指定此數據段僅僅保留了內存單元,而沒有將各初始值寫入內存單元,或者將各個而沒有將各初始值寫入內存單元,或者將各個內存單元值初始化為內存單元值初始化為0。注意:注意:一個大的程序可包含多個代碼段和數據一個大的程序可包含多個代碼段和數據段。一個匯編程序至少包含一個代碼段。段。一個匯編程序至少包含一個代碼段。2022-4-142)CODE16和和CODE32CODE16告訴匯編編譯器后面的指令序列為告訴匯編編譯器后面的指令序列為16位的位的Thumb指令。指令。CODE32告訴匯編編譯器后面的指令序列為告訴匯編編譯器后面的指令序列為32位

24、的位的ARM指令。指令。語法格式:語法格式: CODE16 CODE32 注意:注意:CODE16和和CODE32只是告訴編譯器后面指令只是告訴編譯器后面指令的類型,該偽操作本身不進行程序狀態的切換。的類型,該偽操作本身不進行程序狀態的切換。2022-4-14例:例:AREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面為下面為32位位ARM指令指令 LDR R0,=start+1 BX R0 CODE16 ;下面為下面為16位位Thumb指令指令start MOV R1,#10 . END;切換到切換到Thumb狀態,并跳轉到狀態,并跳轉到star

25、t處執行處執行2022-4-143)ENTRY指定程序的入口點。指定程序的入口點。語法格式:語法格式: ENTRY注意:注意: 一個程序(可包含多個源文件)中至少要有一個一個程序(可包含多個源文件)中至少要有一個ENTRY(可以有多個(可以有多個ENTRY),但一個源文件中最多只能有一個),但一個源文件中最多只能有一個ENTRY(可以沒有(可以沒有ENTRY)2022-4-144)ALIGNALIGN偽操作通過填充偽操作通過填充0將當前的位置以某種形式對齊。將當前的位置以某種形式對齊。語法格式:語法格式:ALIGN expr,offset其中:其中: expr:一個數字,表示對齊的單位。這個數

26、字是:一個數字,表示對齊的單位。這個數字是2的整數的整數次冪,范圍在次冪,范圍在20231之間。之間。 如果沒有指定如果沒有指定expr,則當前位置對齊到下一個字邊,則當前位置對齊到下一個字邊界處界處。 Offset:偏移量,可以為常數或數值表達式。:偏移量,可以為常數或數值表達式。不指定不指定offset表示將當前位置對齊到以表示將當前位置對齊到以expr為單位的起始位置。為單位的起始位置。2022-4-14例例1:short DCB 1 ;本操作使字對齊被破壞本操作使字對齊被破壞ALIGN ;重新使其為字對齊重新使其為字對齊MOV R0,1例例2:ALIGN 8 ;當前位置以當前位置以2個

27、字的方式對齊個字的方式對齊2022-4-145)ENDEND偽操作告訴編譯器已經到了源程序結尾。偽操作告訴編譯器已經到了源程序結尾。語法格式:語法格式: END注意:注意: 每一個匯編源程序都必須包含每一個匯編源程序都必須包含END偽操作,以偽操作,以表明本源程序的結束。表明本源程序的結束。2022-4-146)EQU EQU偽操作偽操作為數字常量、基于寄存器的值和程序中的標為數字常量、基于寄存器的值和程序中的標號定義一個字符名稱號定義一個字符名稱。語法格式:語法格式: name EQU expr,type其中:其中: name:為:為expr定義的字符名稱。定義的字符名稱。 expr:基于寄

28、存器的地址值、程序中的標號、:基于寄存器的地址值、程序中的標號、32位的地址常量或者位的地址常量或者32位的常量。位的常量。表達式,為常量。表達式,為常量。 type:當:當expr為為32位常量時,可以使用位常量時,可以使用type指示指示expr的數據的類型。的數據的類型。取值為:取值為: CODE32 CODE16 DATA2022-4-14例:例: abcd EQU 2 ;定義定義abcd符號的值為符號的值為2 abcd EQU label+16 ;定義定義abcd符號的值為符號的值為(label+16) abcd EQU 0 x1c,CODE32 ;定義定義abcd符號的值為絕對地址

29、符號的值為絕對地址 ;值值0 x1c,而且此處為,而且此處為ARM指令指令2022-4-147)EXPORT及及GLOBAL 聲明一個源文件中的符號,使此符號可以被其他源文件引聲明一個源文件中的符號,使此符號可以被其他源文件引用。用。語法格式:語法格式:EXPORT/GLOBAL symbol weak其中:其中: symbol:聲明的符號的名稱。(區分大小寫):聲明的符號的名稱。(區分大小寫) weak:聲明其他同名符號優先于本符號被引用。:聲明其他同名符號優先于本符號被引用。例:例: AREA example,CODE,READONLY EXPORT DoAdd DoAdd ADD R0,

30、R0,R12022-4-148)IMPORT及及EXTERN聲明一個符號是在其他源文件中定義的。聲明一個符號是在其他源文件中定義的。語法格式:語法格式:IMPORT symbolweakEXTERN symbolweak其中:其中: symbol:聲明的符號的名稱。:聲明的符號的名稱。2022-4-14 weak: 當沒有指定此項時,如果當沒有指定此項時,如果symbol在所有的源文件在所有的源文件中都沒有被定義,則連接器會報告錯誤。中都沒有被定義,則連接器會報告錯誤。 當指定此項時,如果當指定此項時,如果symbol在所有的源文件中都在所有的源文件中都沒有被定義,則連接器不會報告錯誤,而是進

31、行下沒有被定義,則連接器不會報告錯誤,而是進行下面的操作。面的操作。 如果該符號被如果該符號被B或者或者BL指令引用,則該符號被設置指令引用,則該符號被設置成下一條指令的地址,該成下一條指令的地址,該B或或BL指令相當于一條指令相當于一條NOP指令。指令。 其他情況下此符號被設置成其他情況下此符號被設置成0。2022-4-149)GET及及INCLUDE將一個源文件包含到當前源文件中,并將被包將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理。含的文件在其當前位置進行匯編處理。指令格式:指令格式:GET filenameINCLUDE filename其中其中: file

32、name:包含的源文件名,可以使用路徑信息包含的源文件名,可以使用路徑信息(可包含空格)。(可包含空格)。例:例:GET d:armfile.s2022-4-1410)INCBIN將一個文件包含到當前源文件中,而被包含的文件不進將一個文件包含到當前源文件中,而被包含的文件不進行匯編處理行匯編處理指令格式:指令格式:INCBIN filename其中:其中: filename:被包含的文件名稱,可使用路徑信息(不能:被包含的文件名稱,可使用路徑信息(不能有空格)。有空格)。適用情況:適用情況:通常使用此偽操作將一個可執行文件或者任通常使用此偽操作將一個可執行文件或者任意數據包含到當前文件中。意數

33、據包含到當前文件中。例:例:INCBIN d:armfile.txt2022-4-14例:編寫一具有完整匯編格式的程序,實現冒泡法排序功例:編寫一具有完整匯編格式的程序,實現冒泡法排序功能。設無符號字數據存放在從能。設無符號字數據存放在從0 x400004開始的區域,字數據開始的區域,字數據的數目為的數目為0 x8。AREA SORT,CODE,READONLYENTRYSTARTMOV R1,#0 x8 LDR R0,=0 x400004LPSUBS R1,R1,#1BEQ EXITMOV R7, R1 RSB R4 , R1, #0 x8ADD R0, R0,R4 LSL #2 LP1 L

34、DR R2,R0,#4 LDR R3,R0 CMP R2,R3 STRLO R3,R0, # -4STRLO R2,R0SUBS R7,R7,#1BNE LP1B LPEXITEND2022-4-144.GNU4.GNU下的偽操作和宏指令下的偽操作和宏指令 GNUGNU編譯環境下的偽操作可分為以下幾類:編譯環境下的偽操作可分為以下幾類:1 1) 常量編譯控制偽操作常量編譯控制偽操作2 2) 匯編程序代碼控制偽操作匯編程序代碼控制偽操作3 3) 宏及條件編譯控制偽操作宏及條件編譯控制偽操作4 4) 其他偽操作其他偽操作2022-4-141 1)常量編譯控制偽操作)常量編譯控制偽操作 2022-4

35、-14)匯編程序代碼控制偽操作)匯編程序代碼控制偽操作 2022-4-14)宏及條件編譯控制偽操作)宏及條件編譯控制偽操作2022-4-14)其他偽操作)其他偽操作 2022-4-145.ADS5.ADS與與GNUGNU編譯環境下的比較編譯環境下的比較 2022-4-142022-4-144.4. ARM ATPCS ARM ATPCS 1. 1. 基本基本ATPCS ATPCS ATPCS就是就是ARM程序和程序和Thumb程序中子程程序中子程序調用的基本規則。序調用的基本規則。ATPCS規定了一些子程序規定了一些子程序間調用的基本規則。間調用的基本規則。 子程序調用過程中寄存器的使用規則子

36、程序調用過程中寄存器的使用規則 數據棧的使用規則數據棧的使用規則 參數的傳遞規則。參數的傳遞規則。2022-4-14相對于其他類型的相對于其他類型的ATPCSATPCS,滿足基本,滿足基本ATPCSATPCS的程序的執行速度更快,所占用的內存更少。的程序的執行速度更快,所占用的內存更少。 它不能提供以下的支持:它不能提供以下的支持: 1 1) ARMARM程序和程序和ThumbThumb程序相互調用;程序相互調用; 2 2) 數據以及代碼的位置無關的支持;數據以及代碼的位置無關的支持; 3 3)子程序的可重入性;)子程序的可重入性; 4 4) 數據棧檢查的支持。數據棧檢查的支持。2022-4-

37、141 1)寄存器的使用規則)寄存器的使用規則 寄存器的使用必須滿足下面的規則:寄存器的使用必須滿足下面的規則:子程序間通過寄存器子程序間通過寄存器 R0R0一一R3R3來傳遞參數來傳遞參數在子程序中,使用寄存器在子程序中,使用寄存器R4R4R11R11來保存局部變來保存局部變量量 寄存器寄存器R12R12用作子程序間用作子程序間scratchscratch寄存器(用于保寄存器(用于保存存SPSP,在函數返回時使用該寄存器出棧),記作,在函數返回時使用該寄存器出棧),記作ipip。在子程序間的連接代碼段中常有這種使用規。在子程序間的連接代碼段中常有這種使用規則。則。2022-4-14寄存器寄存

38、器R13R13用作數據棧指針,記作用作數據棧指針,記作spsp。 寄存器寄存器R14R14稱為連接寄存器,記作稱為連接寄存器,記作lr lr。 寄存器寄存器R15R15是程序計數器,記作是程序計數器,記作pcpc。它不能用作其。它不能用作其他用途。他用途。2022-4-14 ATPCS中各寄存器的使用規則及其名稱中各寄存器的使用規則及其名稱2022-4-142)數據棧使用規則)數據棧使用規則 棧指針通常可以指向不同的位置。當棧指針指向棧頂元棧指針通??梢灾赶虿煌奈恢谩.敆V羔樦赶驐m斣厮?即最后一個入棧的數據元素即最后一個入棧的數據元素)時,稱為時,稱為FULL棧;當棧指棧;當棧指針指向與

39、棧頂元素針指向與棧頂元素(即最后一個入棧的數據元素即最后一個入棧的數據元素)相鄰的一個相鄰的一個可用數據單元時,稱為可用數據單元時,稱為EMPTY棧。棧。 數據棧的增長方向也可以不同。當數據棧向內存地址減數據棧的增長方向也可以不同。當數據棧向內存地址減小的方向增長時,稱為小的方向增長時,稱為DESCENDING棧,當數據棧向內存棧,當數據棧向內存地址增加的方向增長時,稱為地址增加的方向增長時,稱為ASCENDING棧。棧。2022-4-14 綜合這兩種特點可以有以下綜合這兩種特點可以有以下4種數據棧。種數據棧。 FD Full Descending ED Empty Descending FA

40、 Full Ascending EA Empty Ascending ATPCS規定數據棧為規定數據棧為FD類型,并且對類型,并且對數據棧的操作是數據棧的操作是8字節對齊的。字節對齊的。2022-4-143 3) 數傳遞規則數傳遞規則 (1 1)參數個數可變的子程序參數傳遞規則:)參數個數可變的子程序參數傳遞規則: 對于參數個數可變的子程序,當參數不超過對于參數個數可變的子程序,當參數不超過4 4個時,可個時,可以使用寄存器以使用寄存器R0R3R0R3來傳遞參數;當參數超過來傳遞參數;當參數超過4 4個時,還可個時,還可以使用數據棧來傳遞參數。以使用數據棧來傳遞參數。 在參數傳遞時,將所有參數

41、看作是存放在連續的內存字在參數傳遞時,將所有參數看作是存放在連續的內存字單元中的宇數據。然后,依次將各字數據傳送到寄存器單元中的宇數據。然后,依次將各字數據傳送到寄存器R0R0、RlRl、R2R2、R3R3中,如果參數多于中,如果參數多于4 4個,將剩余的字數據傳送個,將剩余的字數據傳送到數據棧中,入棧的順序與參數順序相反,即最后一個字數到數據棧中,入棧的順序與參數順序相反,即最后一個字數據先入棧。據先入棧。2022-4-14(2 2)參數個數固定的子程序參數傳遞規則)參數個數固定的子程序參數傳遞規則 對于參數個數固定的子程序,參數傳遞與參數個數對于參數個數固定的子程序,參數傳遞與參數個數可變

42、的子程序參數傳遞規則不同。如果系統包含浮點運算可變的子程序參數傳遞規則不同。如果系統包含浮點運算的硬件部件,浮點參數將按照下面的規則傳遞:的硬件部件,浮點參數將按照下面的規則傳遞: 各個浮點參數按順序處理。各個浮點參數按順序處理。 為每個浮點參數分配為每個浮點參數分配FPFP寄存器。寄存器。 分配的方法是,滿足該浮點參數需要的且編號最分配的方法是,滿足該浮點參數需要的且編號最小的一組連續的小的一組連續的FPFP寄存器。第一個整數參數,通過寄存寄存器。第一個整數參數,通過寄存器器R0R0R3R3來傳遞。其他參數通過數據棧傳遞。來傳遞。其他參數通過數據棧傳遞。2022-4-14(3 3)子程序結果

43、返回規則)子程序結果返回規則 結果為一個結果為一個3232位的整數時,可以通過寄存器位的整數時,可以通過寄存器R0R0返回。返回。 結果為一個結果為一個6464位整數時,可以通過寄存器位整數時,可以通過寄存器R0R0和和R1R1返回,依次類推。返回,依次類推。 結果為一個浮點數時,可以通過浮點運算部件的結果為一個浮點數時,可以通過浮點運算部件的寄存器寄存器f0f0、d0d0或者或者s0s0來返回。來返回。 結果為復合型的浮點數結果為復合型的浮點數( (如復數如復數) )時,可以通過寄時,可以通過寄存器存器f0fnf0fn或者或者d0dnd0dn來返回。來返回。 對于位數更多的結果,需要通過內存

44、來傳遞。對于位數更多的結果,需要通過內存來傳遞。2022-4-142.ARM2.ARM和和ThumbThumb程序混合使用程序混合使用 在編譯和匯編時,使用在編譯和匯編時,使用/interwork/interwork告訴編譯器生成的告訴編譯器生成的目標代碼遵守支持目標代碼遵守支持ARMARM程序和程序和ThumbThumb程序混合使用的程序混合使用的ATPCSATPCS。它用在以下場合:。它用在以下場合: 1) 1) 程序中存在程序中存在ARMARM程序調用程序調用ThumbThumb程序的情況。程序的情況。 2) 2) 程序中存在程序中存在ThumbThumb程序調用程序調用ARMARM程序

45、的情況。程序的情況。 3) 3) 需要連接器來進行需要連接器來進行ARMARM狀態和狀態和ThumbThumb狀態切換的情狀態切換的情況。況。2022-4-14例如:進行狀態切換的匯編程序例如:進行狀態切換的匯編程序 ARMADR r0,ThumbProg+1 BX r0 ;跳到;跳到ThumbProg,程序切換到,程序切換到Thumb狀志狀志THUMB ;THUMB指示編譯器后面的為指示編譯器后面的為Thumb指令指令ThumbProg: .ADR r0,ARMProgBX r0 ;跳轉到;跳轉到ARMProg,程序切換到,程序切換到ARM狀態狀態ARM ;ARM指示編譯器后面的為指示編譯器

46、后面的為ARM指令指令ARMProg:MOV r4, #42022-4-144.4. ARMARM程序設計程序設計. ARM. ARM匯編語言程序設計匯編語言程序設計 ARM ARM匯編語言以段(匯編語言以段(sectionsection)為單位組織源文)為單位組織源文件。件。 段是相對獨立的、具有特定名稱的、不可分割的段是相對獨立的、具有特定名稱的、不可分割的指令或數據序列。指令或數據序列。 段又可以分為段又可以分為代碼段和數據段代碼段和數據段,代碼段存放執行,代碼段存放執行代碼,數據段存放代碼運行時需要用到的數據。一代碼,數據段存放代碼運行時需要用到的數據。一個個ARMARM源程序至少需要

47、一個代碼段,大的程序可以源程序至少需要一個代碼段,大的程序可以包含多個代碼段和數據段。包含多個代碼段和數據段。2022-4-14) ARM匯編中的文件格式匯編中的文件格式 ARM源程序文件(可簡稱為源文件)可以由任源程序文件(可簡稱為源文件)可以由任意一種文本編輯器來編寫程序代碼,它一般為文本意一種文本編輯器來編寫程序代碼,它一般為文本格式。在格式。在ARM程序設計中,常用的源文件可簡單分程序設計中,常用的源文件可簡單分為以下幾種為以下幾種. 2022-4-142) ARM匯編語言語句格式匯編語言語句格式 ARM匯編語言語句格式如下所示:匯編語言語句格式如下所示:symbol instruct

48、ion | directive | pseudo-instruction;comment 其中:其中: instruction為指令。為指令。 directive為偽操作。為偽操作。 pseudo-instrkeuction為偽指令。為偽指令。 symbol為符號。為符號。 comment為語句的注釋。為語句的注釋。 2022-4-14 ARM ARM匯編語言中,符號可代表地址、變量和數字常量。匯編語言中,符號可代表地址、變量和數字常量。數字常量一般有數字常量一般有3 3種表達方式:種表達方式: 十進制數十進制數,如,如7979、4 4等。等。 十六進制數十六進制數,以,以0 x0 x和和&開

49、頭,如開頭,如0 x3450 x345、0 xFB0 xFB。 n n進制數進制數,用,用n_XXXn_XXX表示,如表示,如2_011001012_01100101、8_56428_5642。 標號:表示程序中的指令或數據地址的符號,代表地址。標號:表示程序中的指令或數據地址的符號,代表地址。局部標號:主要用于局部范圍代碼。局部標號:主要用于局部范圍代碼。2022-4-14)ARM匯編語言程序格式匯編語言程序格式 ADS環境下環境下ARM匯編語言源程序的基本結構匯編語言源程序的基本結構: AREA EXAMPLE,CODE,READONLY ENTRY start MOV r0,#10 MOV r1,#3 ADD r0,r0,r1 END 上述程序的程序體部分實現了一個簡單的加法運算。上述程序的程序體部分實現了一個簡單的加法運算。 2022-4-14GNU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論