ARM匯編偽指令_第1頁
ARM匯編偽指令_第2頁
ARM匯編偽指令_第3頁
ARM匯編偽指令_第4頁
ARM匯編偽指令_第5頁
已閱讀5頁,還剩108頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、ARM匯編偽指令(轉(zhuǎn)載)2007-09-06 19:26其他常用的偽指令 還有一些其他的偽指令,在匯編程序中經(jīng)常會(huì)被使用,包括以下幾條: AREA ALIGN CODE16 、 CODE32 ENTRY END EQU EXPORT (或 GLOBAL ) IMPORT EXTERN GET (或 INCLUDE ) INCBIN RN ROUT 1、 AREA 語法格式: AREA 段名 屬性 1 ,屬性 2 , AREA 偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用 “ | ” 括起來,如 |1_test| 。 屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個(gè)屬性

2、用逗號(hào)分隔。常用的屬性如下: CODE 屬性:用于定義代碼段,默認(rèn)為 READONLY 。 DATA 屬性:用于定義數(shù)據(jù)段,默認(rèn)為 READWRITE 。 READONLY 屬性:指定本段為只讀,代碼段默認(rèn)為 READONLY 。 READWRITE 屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為 READWRITE 。 ALIGN 屬性:使用方式為 ALIGN 表達(dá)式。在默認(rèn)時(shí), ELF (可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段是按字對(duì)齊的,表達(dá)式的取值范圍為 0 31 ,相應(yīng)的對(duì)齊方式為 2 表達(dá)式次方。 COMMON 屬性:該屬性定義一個(gè)通用的段,不包含任何的用戶代碼和數(shù)據(jù)。各源文件中同名的 C

3、OMMON 段共享同一段存儲(chǔ)單元。 一個(gè)匯編語言程序至少要包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。 使用示例: AREA Init , CODE , READONLY 該偽指令定義了一個(gè)代碼段,段名為 Init ,屬性為只讀 2、 ALIGN 語法格式: ALIGN 表達(dá)式 ,偏移量 ALIGN 偽指令可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對(duì)其方式 | 。其中,表達(dá)式的值用于指定對(duì)齊方式,可能的取值為 2 的冪,如 1 、 2 、 4 、 8 、 16 等。若未指定表達(dá)式,則將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。偏移量也為一個(gè)數(shù)字表達(dá)式,若使用該字段,則當(dāng)前位置的對(duì)齊方

4、式為: 2 的表達(dá)式次冪偏移量。 使用示例: AREA Init , CODE , READONLY , ALIEN 3 ;指定后面的指令為 8 字節(jié)對(duì)齊。 指令序列 END 3、 CODE16、CODE32 語法格式: CODE16 (或 CODE32 ) CODE16 偽指令通知編譯器,其后的指令序列為 16 位的 Thumb 指令。 CODE32 偽指令通知編譯器,其后的指令序列為 32 位的 ARM 指令。 若在匯編源程序中同時(shí)包含 ARM 指令和 Thumb 指令時(shí),可用 CODE16 偽指令通知編譯器其后的指令序列為 16 位的 Thumb 指令, CODE32 偽指令通知編譯器其

5、后的指令序列為 32 位的 ARM 指令。因此,在使用 ARM 指令和 Thumb 指令混合編程的代碼里,可用這兩條偽指令進(jìn)行切換,但注意他們只通知編譯器其后指令的類型,并不能對(duì)處理器進(jìn)行狀態(tài)的切換。 使用示例: AREA Init , CODE , READONLY CODE32 ;通知編譯器其后的指令為 32 位的 ARM 指令 LDR R0 , NEXT 1 ;將跳轉(zhuǎn)地址放入寄存器 R0 BX R0 ;程序跳轉(zhuǎn)到新的位置執(zhí)行,并將處理器切換到 Thumb 工作狀態(tài) CODE16 ;通知編譯器其后的指令為 16 位的 Thumb 指令 NEXT LDR R3,0x3FF END ;程序結(jié)束

6、 4、 ENTRY 語法格式: ENTRY ENTRY 偽指令用于指定匯編程序的入口點(diǎn)。在一個(gè)完整的匯編程序中至少要有一個(gè) ENTRY (也可以有多個(gè),當(dāng)有多個(gè) ENTRY 時(shí),程序的真正入口點(diǎn)由鏈接器指定),但在一個(gè)源文件里最多只能有一個(gè) ENTRY (可以沒有)。 使用示例: AREA Init , CODE , READONLY ENTRY ;指定應(yīng)用程序的入口點(diǎn) 5、 END 語法格式: END END 偽指令用于通知編譯器已經(jīng)到了源程序的結(jié)尾。 使用示例: AREA Init , CODE , READONLY END ;指定應(yīng)用程序的結(jié)尾 6、 EQU 語法格式: 名稱 EQU 表

7、達(dá)式 ,類型 EQU 偽指令用于為程序中的常量、標(biāo)號(hào)等定義一個(gè)等效的字符名稱,類似于 C 語言中的 define 。 其中 EQU 可用 “ * ” 代替。 名稱為 EQU 偽指令定義的字符名稱,當(dāng)表達(dá)式為 32 位的常量時(shí),可以指定表達(dá)式的數(shù)據(jù)類型,可以有以下三種類型: CODE16 、 CODE32 和 DATA 使用示例: Test EQU 50 ;定義標(biāo)號(hào) Test 的值為 50 Addr EQU 0x55 , CODE32 ;定義 Addr 的值為 0x55 ,且該處為 32 位的 ARM 指令。 7、 EXPORT(或GLOBAL) 語法格式: EXPORT 標(biāo)號(hào) WEAK EXP

8、ORT 偽指令用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。標(biāo)號(hào)在程序中區(qū)分大小寫, WEAK 選項(xiàng)聲明其他的同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。 使用示例: AREA Init , CODE , READONLY EXPORT Stest ;聲明一個(gè)可全局引用的標(biāo)號(hào)Stest END 8、 IMPORT 語法格式: IMPORT 標(biāo)號(hào) WEAK IMPORT 偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,而且無論當(dāng)前源文件是否引用該標(biāo)號(hào),該標(biāo)號(hào)均會(huì)被加入到當(dāng)前源文件的符號(hào)表中。 標(biāo)號(hào)在程序中區(qū)分大小寫, WEAK

9、選項(xiàng)表示當(dāng)所有的源文件都沒有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不給出錯(cuò)誤信息,在多數(shù)情況下將該標(biāo)號(hào)置為 0 ,若該標(biāo)號(hào)為 B 或 BL 指令引用,則將 B 或 BL指令置為 NOP 操作。 使用示例: AREA Init , CODE , READONLY IMPORT Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main 在其他源文件中定義 END 9、 EXTERN 語法格式: EXTERN 標(biāo)號(hào) WEAK EXTERN 偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,如果當(dāng)前源文件實(shí)際并未引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前源文件的符號(hào)表中。標(biāo)號(hào)在程序中區(qū)

10、分大小寫, WEAK 選項(xiàng)表示當(dāng)所有的源文件都沒有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不給出錯(cuò)誤信息,在多數(shù)情況下將該標(biāo)號(hào)置為 0 ,若該標(biāo)號(hào)為 B 或 BL 指令引用,則將 B 或 BL指令置為 NOP 操作。 使用示例: AREA Init , CODE , READONLY EXTERN Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main 在其他源文件中定義 END10、 GET(或INCLUDE) 語法格式: GET 文件名 GET 偽指令用于將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯編處理??梢允褂?INCLUDE 代替 GET 。 匯編程序中常用的方法是

11、在某源文件中定義一些宏指令,用 EQU 定義常量的符號(hào)名稱,用 MAP和 FIELD 定義結(jié)構(gòu)化的數(shù)據(jù)類型,然后用 GET 偽指令將這個(gè)源文件包含到其他的源文件中。使用方法與 C 語言中的 “ include ” 相似。 GET 偽指令只能用于包含源文件,包含目標(biāo)文件需要使用 INCBIN 偽指令 使用示例: AREA Init , CODE , READONLY GET a1.s ;通知編譯器當(dāng)前源文件包含源文件a1.s GE T C:a2.s ;通知編譯器當(dāng)前源文件包含源文件C: a2.s END 11、 INCBIN 語法格式: INCBIN 文件名 INCBIN 偽指令用于將一個(gè)目標(biāo)文

12、件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動(dòng)的存放在當(dāng)前文件中,編譯器從其后開始繼續(xù)處理。 使用示例: AREA Init , CODE , READONLY INCBIN a1.dat ;通知編譯器當(dāng)前源文件包含文件a1.dat INCBIN C:a2.txt ;通知編譯器當(dāng)前源文件包含文件C:a2.txt END 12、 RN 語法格式: 名稱 RN 表達(dá)式 RN 偽指令用于給一個(gè)寄存器定義一個(gè)別名。采用這種方式可以方便程序員記憶該寄存器的功能。其中,名稱為給寄存器定義的別名,表達(dá)式為寄存器的編碼。 使用示例: Temp RN R0 ;將R0 定義一個(gè)別名Temp 13、 R

13、OUT 語法格式: 名稱 ROUT ROUT 偽指令用于給一個(gè)局部變量定義作用范圍。在程序中未使用該偽指令時(shí),局部變量的作用范圍為所在的 AREA ,而使用 ROUT 后,局部變量的作為范圍為當(dāng)前 ROUT 和下一個(gè) ROUT 之間。第3節(jié) ARM指令集 推薦給好友 打印 加入收藏 更新于2008-08-07 23:31:14 SPSR CPSR MRC ARM指令集 6種類型(53種主要助記符) : 數(shù)據(jù)處理指令(22種主要助記符) 跳轉(zhuǎn)指令(4種主要助記符) Load/Store指令(16種主要助記符) 程序狀態(tài)寄存器指令(2種主要助記符) 協(xié)處理器指令(5種主要助記符) 軟件中斷指令 (

14、2種主要助記符) 數(shù)據(jù)處理指令 數(shù)據(jù)處理指令大致可分為3類: 數(shù)據(jù)傳送指令; 算術(shù)邏輯運(yùn)算指令; 乘法指令 比較指令。 數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。 數(shù)據(jù)處理指令1 MOV 數(shù)據(jù)傳送指令 格式:MOV S , ; 功能:Rdop1 op1可以是寄存器、被移位的寄存器或立即數(shù)。 例如: MOV R0,5 ;R0=5 MOV R0,R1 ;R0=R1 MOV R0,R1,LSL5 ;R0=R1左移5位 數(shù)據(jù)處理指令2 2MVN 數(shù)據(jù)取反傳送指令 格式:MVN S , ; 功能:將op1表示的值傳送到

15、目的寄存器Rd中,但該值在傳送前被按位取反,即Rd=!op1; op1可以是寄存器、被移位的寄存器或立即數(shù)。 例如: MVN R0,0 ;R0=-1 數(shù)據(jù)處理指令3 3ADD 加法指令 格式:ADD S , , ; 功能:RdRn+op2 op2可以是寄存器,被移位的寄存器或立即數(shù)。 例如: ADD R0,R1,5 ;R0=R1+5 ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,R2,LSL5 ;R0=R1+R2左移5位 數(shù)據(jù)處理指令4 4ADC 帶進(jìn)位加法指令 格式:ADC S , , ; 功能:RdRn+op2+carry op2可以是寄存器、被移位的寄存器或立即數(shù);c

16、arry為進(jìn)位標(biāo)志值。該指令用于實(shí)現(xiàn)超過32位的數(shù)的加法。 例如: 第一個(gè)64位操作數(shù)存放在寄存器R2,R3中; 第二個(gè)64位操作數(shù)存放在寄存器R4,R5中; 64位結(jié)果存放在R0,R1中。 64位的加法可由以下語句實(shí)現(xiàn): ADDS R0,R2,R4 ;低32位相加,S表示結(jié)果影響條件標(biāo)志位的值 ADC R1,R3,R5 ;高32位相加 數(shù)據(jù)處理指令5 5SUB 減法指令 格式:SUB S , , ; 功能:RdRn-op2 op2可以是寄存器、被移位的寄存器或立即數(shù)。 例如: SUB R0,R1,5 ;R0=R1-5 SUB R0,R1,R2 ;R0=R1-R2 SUB R0,R1,R2,L

17、SL5 ;R0=R1-R2左移5位 數(shù)據(jù)處理指令6 6RSB 反向減法指令 格式:RSB S , , ; 功能:同SUB指令,但倒換了兩操作數(shù)的前后位置,即Rdop2-Rn。 例如: RSB R0,R1,5 ;R0=5-R1 RSB R0,R1,R2 ;R0=R2-R1 RSB R0,R1,R2,LSL5 ;R0=R2左移5位-R1 數(shù)據(jù)處理指令7 7SBC 帶借位減法指令 格式:SBC S , , ; 功能:RdRn-op2-!carry op2可以是寄存器、被移位的寄存器或立即數(shù)。 SUB和SBC生成進(jìn)位標(biāo)志的方式不同于常規(guī),如果需要借位則清除進(jìn)位標(biāo)志,所以指令要對(duì)進(jìn)位標(biāo)志進(jìn)行一個(gè)非操作。

18、 例如: 第一個(gè)64位操作數(shù)存放在寄存器R2,R3中; 第二個(gè)64位操作數(shù)存放在寄存器R4,R5中; 64位結(jié)果存放在R0,R1中。 64位的減法(第一個(gè)操作數(shù)減去第二個(gè)操作數(shù))可由以下語句實(shí)現(xiàn): SUBS R0,R2,R4; 低32位相減,S表示結(jié)果影響條件標(biāo)志位的值 SBC R1,R3,R5; 高32位相減 數(shù)據(jù)處理指令8 8RSC 帶借位的反向減法指令 格式:RSC S , , ; 功能:同SBC指令,但倒換了兩操作數(shù)的前后位置,即Rdop2-Rn-!carry。 例如: 前提條件與SBC例子相同,操作數(shù)1-操作數(shù)2的實(shí)現(xiàn)語句需改為: SUBS R0,R2,R4; 低32位相減,S表示結(jié)

19、果影響寄存器CPSR的值 RSC R1,R5,R3; 高32位相減 數(shù)據(jù)處理指令乘法指令 ARM7TDMI具有三種乘法指令,分別為: 3232位乘法指令; 32 32位乘加指令; 32 32位結(jié)果為64位的乘/乘加指令。 數(shù)據(jù)處理指令9 9MUL 32位乘法指令 格式:MUL S , , ; 功能:RdRnop2 該指令根據(jù)S標(biāo)志,決定操作是否影響CPSR的值;其中op2必須為寄存器。Rn和op2的值為32位的有符號(hào)數(shù)或無符號(hào)數(shù)。 例如: MULS R0,R1,R2 ;R0R1R2,結(jié)果影響寄存器CPSR的值 數(shù)據(jù)處理指令10 10MLA 32位乘加指令 格式:MLA S , , , ; 功能

20、:RdRnop2+op3 op2和op3必須為寄存器。Rn、op2和op3的值為32位的有符號(hào)數(shù)或無符號(hào)數(shù)。 例如: MLA R0,R1,R2,R3 ;R0R1R2+R3 數(shù)據(jù)處理指令11 11SMULL 64位有符號(hào)數(shù)乘法指令 格式: SMULL S , , , ; 功能:Rdh RdlRnop2 Rdh、Rdl和op2均為寄存器。Rn和op2的值為32位的有符號(hào)數(shù)。 例如: SMULL R0,R1,R2,R3 ;R0R2R3的低32位 ;R1R2R3的高32位 數(shù)據(jù)處理指令12 12SMLAL 64位有符號(hào)數(shù)乘加指令 格式: SMLAL S , , , ; 功能:Rdh RdlRnop2+

21、Rdh Rdl Rdh、Rdl和op2均為寄存器。Rn和op2的值為32位的有符號(hào)數(shù),Rdh Rdl的值為64位的加數(shù)。 例如: SMLAL R0,R1,R2,R3 ;R0R2R3的低32位+R0 ;R1R2R3的高32位+R1 數(shù)據(jù)處理指令13 13UMULL 64位無符號(hào)數(shù)乘法指令 格式: UMULL S , , , ; 功能:同SMULL指令,但指令中Rn和op2的值為32位的無符號(hào)數(shù)。 例如: UMULL R0,R1,R2,R3 ;R0R2R3的低32位 ;R1R2R3的高32位 其中R2,R3的值為無符號(hào)數(shù) 數(shù)據(jù)處理指令14 14UMLAL 64位無符號(hào)數(shù)乘加指令 格式: UMLAL

22、 S , , , ; 功能:同SMLAL指令,但指令中Rn,op2的值為32位的無符號(hào)數(shù),Rdh Rdl的值為64位無符號(hào)數(shù)。 例如: UMLAL R0,R1,R2,R3 ;R0R2R3的低32位+R0 ;R1R2R3的高32位+R1 其中R2,R3的值為32位無符號(hào)數(shù) R1,R0的值為64位無符號(hào)數(shù) 數(shù)據(jù)處理指令15 15AND 邏輯與指令 格式:AND S , , ; 功能:RdRn AND op2 op2可以是寄存器,被移位的寄存器或立即數(shù)。一般用于清除Rn的特定幾位。 例如: AND R0,R0,5 ;保持R0的第0位和第2位,其余位清0 數(shù)據(jù)處理指令16 16ORR 邏輯或指令 格式

23、:ORR S , , ; 功能:RdRn OR op2 op2可以是寄存器、被移位的寄存器或立即數(shù)。一般用于設(shè)置Rn的特定幾位。 例如: ORR R0,R0,5 ;R0的第0位和第2位設(shè)置為1,其余位不變 數(shù)據(jù)處理指令17 17EOR 邏輯異或指令 格式:EOR S , , ; 功能:RdRn EOR op2 op2可以是寄存器、被移位的寄存器或立即數(shù)。一般用于將Rn的特定幾位取反。 例如: EOR R0,R0,5 ;R0的第0位和第2位取反,其余位不變 數(shù)據(jù)處理指令18 18BIC 位清除指令 格式:BIC S , , ; 功能:RdRn AND (!op2 用于清除寄存器Rn中的某些位,并

24、把結(jié)果存放到目的寄存器Rd中. 操作數(shù)op2是一個(gè)32位掩碼(mask),如果在掩碼中設(shè)置了某一位,則清除Rn中的這一位;未設(shè)置的掩碼位指示Rn中此位保持不變。其中,op2可以是寄存器、被移位的寄存器或立即數(shù)。 例如: BIC R0,R0,5 ;R0中第0位和第2位清0,其余位不變 數(shù)據(jù)處理指令19 19CMP 比較指令 格式:CMP , ; 功能:Rn-op1 該指令進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,根據(jù)結(jié)果更新CPSR中條件標(biāo)志位的值。 該指令不需要顯式地指定S后綴來更改狀態(tài)標(biāo)志。其中,操作數(shù)op1為寄存器或立即數(shù)。 例如: CMP R0,5 ;計(jì)算R0-5,根據(jù)結(jié)果設(shè)置條件標(biāo)志位 ADDG

25、T R0,R0,5 ;如果R05,則執(zhí)行ADDGT指令 數(shù)據(jù)處理指令20 20CMN 反值比較指令 格式:CMN , ; 功能:同CMP指令,但寄存器Rn的值是和op1取負(fù)的值進(jìn)行比較。 例如: CMN R0,5 ;把R0與-5進(jìn)行比較 數(shù)據(jù)處理指令21 21TST 位測(cè)試指令 格式:TST , ; 功能: Rn AND op1 根據(jù)結(jié)果更新CPSR中條件標(biāo)志位的值,但不存儲(chǔ)結(jié)果。 用于檢查寄存器Rn是否設(shè)置了op1中相應(yīng)的位。 例如: TST R0,5 ;測(cè)試R0中第0位和第2位是否為1 數(shù)據(jù)處理指令22 22TEQ 相等測(cè)試指令 格式:TEQ , ; 功能: Rn EOR op1 將寄存器

26、Rn的值和操作數(shù)op1所表示的值按位作邏輯異或操作,根據(jù)結(jié)果更新CPSR中條件標(biāo)志位的值,但不存儲(chǔ)結(jié)果。 用于檢查寄存器Rn的值是否和op1所表示的值相等。 例如: TEQ R0,5 ;判斷R0的值是否和5相等 跳轉(zhuǎn)指令 跳轉(zhuǎn)指令用于實(shí)現(xiàn)程序的跳轉(zhuǎn)和程序狀態(tài)的切換。 ARM程序設(shè)計(jì)中,實(shí)現(xiàn)程序跳轉(zhuǎn)有兩種方式: (1)跳轉(zhuǎn)指令, (2)直接向程序寄存器PC(R15)中寫入目標(biāo)地址值。 通過向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn)。 使用跳轉(zhuǎn)指令,其跳轉(zhuǎn)空間受到限制。 跳轉(zhuǎn)指令1 1B 跳轉(zhuǎn)指令 格式:B ; 功能: PC= PC+ addr左移兩位 addr的值是相

27、對(duì)當(dāng)前PC(即寄存器R15)的值的一個(gè)偏移量,而不是一個(gè)絕對(duì)地址,它是24位有符號(hào)數(shù)。實(shí)際地址的值由匯編器來計(jì)算. addr的值有符號(hào)擴(kuò)展為32位后,左移兩位,然后與PC值相加,即得到跳轉(zhuǎn)的目的地址。 跳轉(zhuǎn)的范圍為-32MB+32MB。 例如: B exit; 程序跳轉(zhuǎn)到標(biāo)號(hào)exit處 exit 跳轉(zhuǎn)指令2 2BL 帶返回的跳轉(zhuǎn)指令 格式:BL ; 功能:同B指令,但BL指令執(zhí)行跳轉(zhuǎn)操作的同時(shí),還將PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。 該指令用于實(shí)現(xiàn)子程序調(diào)用,程序的返回可通過把LR寄存器的值復(fù)制到PC寄存器中來實(shí)現(xiàn)。 例如: BL func; 調(diào)用子程序func fu

28、nc MOV R15,R14; 子程序返回 跳轉(zhuǎn)指令2 由于返回地址保存在寄存器里,在保存R14之前不應(yīng)再調(diào)用下一級(jí)的嵌套子程序;否則,新的返回地址將覆蓋原來的返回地址,就無法返回到原來的調(diào)用位置。這時(shí)一般是把R14壓入存儲(chǔ)器中的堆棧。由于子程序經(jīng)常還需要一些工作寄存器,所以可使用多寄存器存儲(chǔ)指令同時(shí)把這些寄存器中原有的數(shù)據(jù)一起存儲(chǔ)。 例如: BL SUB1 SUB1 STMFD R13!,R0-R2,R14;保存工作和鏈接寄存器 BL SUB2 SUB2 對(duì)于不調(diào)用其他子程序的子程序(葉子程序),不需要保存R14,因?yàn)樗粫?huì)被覆蓋。 跳轉(zhuǎn)指令3 3BLX 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令 格式:B

29、LX ; 或BLX ; 功能:處理器跳轉(zhuǎn)到目標(biāo)地址處,并將PC(寄存器R15)的值保存到LR寄存器(R14)中。 若為第二種格式,寄存器Rn的值是轉(zhuǎn)移目標(biāo),Rn的第0位拷貝到CPSR中的T位(決定是繼續(xù)執(zhí)行還是切換到Thumb指令),31:0位移入PC; 如果Rn0是1,則處理器切換執(zhí)行Thumb指令,并在Rn中的地址開始執(zhí)行,但是需將最低為清零;如果Rn0是0,則處理器繼續(xù)執(zhí)行ARM指令,并在Rn中的地址處開始執(zhí)行,但需將Rn1清零。 該指令用于子程序調(diào)用和程序狀態(tài)的切換。 例如: BLX T16; 跳轉(zhuǎn)到標(biāo)號(hào)T16處執(zhí)行,T16后面的指令為Thumb指令 CODE16 T16 后面指令為T

30、humb指令 跳轉(zhuǎn)指令4 4BX 帶狀態(tài)切換的跳轉(zhuǎn)指令 格式:BX ; 功能:處理器跳轉(zhuǎn)到目標(biāo)地址處,從那里繼續(xù)執(zhí)行; 目標(biāo)地址為寄存器Rn的值和0xFFFFFFFE作與操作的結(jié)果。 目標(biāo)地址處的指令可以是ARM指令,也可以是Thumb 指令。 例如: ADR R0,exit ;標(biāo)號(hào)exit處的地址裝入R0中 BX R0 ;跳轉(zhuǎn)到exit處 Load/Store指令 Load/Store指令用于寄存器和內(nèi)存間數(shù)據(jù)的傳送。 Load用于把內(nèi)存中的數(shù)據(jù)裝載到寄存器中。 Store用于把寄存器中的數(shù)據(jù)存入內(nèi)存。 該集合的指令使用頻繁,在指令集中最為重要,因?yàn)槠渌噶钪荒懿僮骷拇嫫?,?dāng)數(shù)據(jù)存放在內(nèi)存中

31、時(shí),必須先把數(shù)據(jù)從內(nèi)存裝載到寄存器,執(zhí)行完后再把寄存器中的數(shù)據(jù)存儲(chǔ)到內(nèi)存中。 Load/Store指令分為3類: (1)單一數(shù)據(jù)傳送指令(LDR和STR等) (2)多數(shù)據(jù)傳送指令(LDM和STM) (3)數(shù)據(jù)交換指令(SWP和SWPB) 條件執(zhí)行的舉例 將流程圖對(duì)應(yīng)GCD算法轉(zhuǎn)換成 1 普通匯編代碼 2ARM 匯編代碼. 只使用 CMP, B 及 SUB指令 條件執(zhí)行的舉例 普通匯編代碼 gcd cmp r0, r1 ;reached the end? beq stop blt less ;if r0 r1 sub r0, r0, r1 ;subtract r1 from r0 bal gcd

32、 less sub r1, r1, r0 ;subtract r0 from r1 bal gcd stop ARM 代碼 gcd cmp r0, r1 ;if r0 r1 subgt r0, r0, r1 ;subtract r1 from r0 sublt r1, r1, r0 ;else subtract r0 from r1 bne gcd ; Load/Store指令1-1 1LDR 字?jǐn)?shù)據(jù)加載指令 格式:LDR , ; 功能:把a(bǔ)ddr所表示的內(nèi)存地址中的字?jǐn)?shù)據(jù)裝載到目標(biāo)寄存器Rd中,同時(shí)還可以把合成的有效地址寫回到基址寄存器。 地址addr可以是一個(gè)簡(jiǎn)單的值、一個(gè)偏移量,或者是一

33、個(gè)被移位的偏移量。 尋址方式: Rn:基址寄存器。 Rm:變址寄存器。 Index:偏移量,12位的無符號(hào)數(shù)。 LDR Rd,Rn ;把內(nèi)存中地址為Rn的字?jǐn)?shù)據(jù)裝入寄存器Rd中 LDR Rd,Rn,Rm ;將內(nèi)存中地址為Rn+Rm的字?jǐn)?shù)據(jù)裝入寄存器Rd中 Load/Store指令1-2 LDR Rd,Rn,index ;將內(nèi)存中地址為Rn+index的字?jǐn)?shù)據(jù)裝入Rd中 LDR Rd,Rn,Rm,LSL5 ;將內(nèi)存中地址為Rn+Rm32的字?jǐn)?shù)據(jù)裝入Rd LDR Rd,Rn,Rm ! ;將內(nèi)存中地址為Rn+Rm的字?jǐn)?shù)據(jù)裝入Rd,并將新地址Rn+Rm寫入Rn LDR Rd,Rn,index ! ;將

34、內(nèi)存中地址為Rn+index的字?jǐn)?shù)據(jù)裝入Rd,并將新地址Rn+index寫入Rn LDR Rd,Rn,Rm,LSL5! ;將內(nèi)存中地址為Rn+Rm32的字?jǐn)?shù)據(jù)裝入Rd,并將新地址Rn+Rm32寫入Rn Load/Store指令1-3 LDR Rd,Rn,Rm ;將內(nèi)存中地址為Rn的字?jǐn)?shù)據(jù)裝入寄存器Rd,并將新地址Rn+Rm寫入Rn LDR Rd,Rn,index ;將內(nèi)存中地址為Rn的字?jǐn)?shù)據(jù)裝入寄存器Rd,并將新地址Rn+index寫入Rn LDR Rd,Rn,Rm,LSL5 ;將內(nèi)存中地址為Rn的字?jǐn)?shù)據(jù)裝入寄存器Rd,并將新地址Rn+Rm32寫入Rn 例如: LDR R0,R1,R2,LSL

35、5! ; 將內(nèi)存中地址為R1+R232的字?jǐn)?shù)據(jù)裝入寄存器R0,并將新地址R1+R232寫入R1 Load/Store指令2 LDRB 字節(jié)數(shù)據(jù)加載指令 格式:LDR B , ; 功能:同LDR指令,但該指令只是從內(nèi)存讀取一個(gè)8位的字節(jié)數(shù)據(jù)而不是一個(gè)32位的字?jǐn)?shù)據(jù),并將Rd的高24位清0。 例如: LDRB R0,R1 ;將內(nèi)存中起始地址為R1的一個(gè)字節(jié)數(shù)據(jù)裝入R0中 Load/Store指令3 3LDRBT 用戶模式的字節(jié)數(shù)據(jù)加載指令 格式:LDR BT , ; 功能:同LDRB指令,但無論處理器處于何種模式,都將該指令當(dāng)作一般用戶模式下的內(nèi)存操作。 Load/Store指令4 4LDRH 半

36、字?jǐn)?shù)據(jù)加載指令 格式:LDR H , ; 功能:同LDR指令,但該指令只是從內(nèi)存讀取一個(gè)16位的半字?jǐn)?shù)據(jù)而不是一個(gè)32位的字?jǐn)?shù)據(jù),并將Rd的高16位清0。 例如: LDRH R0,R1 ;將內(nèi)存中起始地址為R1的一個(gè)半字?jǐn)?shù)據(jù)裝入R0中 Load/Store指令5 5LDRSB 有符號(hào)的字節(jié)數(shù)據(jù)加載指令 格式:LDR SB , ; 功能:同LDRB指令,但該指令將寄存器Rd的高24位設(shè)置成所裝載的字節(jié)數(shù)據(jù)符號(hào)位的值。 例如: LDRSB R0,R1 ;將內(nèi)存中起始地址為R1的一個(gè)字節(jié)數(shù)據(jù)裝入R0中,R0的高24位設(shè)置成該字節(jié)數(shù)據(jù)的符號(hào)位 Load/Store指令6 6LDRSH 有符號(hào)的半字?jǐn)?shù)據(jù)

37、加載指令 格式:LDR SH , ; 功能:同LDRH指令,但該指令將寄存器Rd的高16位設(shè)置成所裝載的半字?jǐn)?shù)據(jù)符號(hào)位的值。 例如: LDRSH R0,R1 ;將內(nèi)存中起始地址為R1的一個(gè)16位半字?jǐn)?shù)據(jù)裝入R0中,R0的高16位設(shè)置成該半字?jǐn)?shù)據(jù)的符號(hào)位 Load/Store指令7 7LDRT 用戶模式的字?jǐn)?shù)據(jù)加載指令 格式:LDR T , ; 功能:同LDR指令,但無論處理器處于何種模式,都將該指令當(dāng)作一般用戶模式下的內(nèi)存操作。 addr所表示的有效地址必須是字對(duì)齊的,否則從內(nèi)存中讀出的數(shù)值需進(jìn)行循環(huán)右移操作。 Load/Store指令8 8STR 字?jǐn)?shù)據(jù)存儲(chǔ)指令 格式:STR , ; 功能:

38、把寄存器Rd中的字?jǐn)?shù)據(jù)(32位)保存到addr所表示的內(nèi)存地址中,同時(shí)還可以把合成的有效地址寫回到基址寄存器。 地址addr可以是一個(gè)簡(jiǎn)單的值、一個(gè)偏移量,或者是一個(gè)被移位的偏移量。 尋址方式同LDR指令。 例如: STR R0,R1,5! ;把R0中的字?jǐn)?shù)據(jù)保存到以R1+5為地址的內(nèi)存中,然后R1R1+5 STR指令應(yīng)用舉例 STR指令應(yīng)用舉例 Load/Store指令9 9STRB 字節(jié)數(shù)據(jù)存儲(chǔ)指令 格式:STR B , ; 功能:把寄存器Rd中的低8位字節(jié)數(shù)據(jù)保存到addr所表示的內(nèi)存地址中。 其他用法同STR指令。 例如: STRB R0,R1 ;將寄存器R0中的低8位數(shù)據(jù)存入R1表示

39、的內(nèi)存地址中 Load/Store指令10 10STRBT 用戶模式的字節(jié)數(shù)據(jù)存儲(chǔ)指令 格式:STR BT , ; 功能:同STRB指令,但無論處理器處于何種模式,該指令都將被當(dāng)作一般用戶模式下的內(nèi)存操作。 Load/Store指令11 11STRH 半字?jǐn)?shù)據(jù)存儲(chǔ)指令 格式:STR H , ; 功能:把寄存器Rd中的低16位半字?jǐn)?shù)據(jù)保存到addr所表示的內(nèi)存地址中,而且addr所表示的地址必須是半字對(duì)齊的。 其他用法同STR指令。 例如: STRH R0,R1 ;將寄存器R0中的低16位數(shù)據(jù)存入R1表示的內(nèi)存地址中 存儲(chǔ)格式對(duì)于加載/存儲(chǔ)指令的影響 Load/Store指令12 12STRT

40、用戶模式的字?jǐn)?shù)據(jù)存儲(chǔ)指令 格式:STR T , ; 功能:同STR指令,但無論處理器處于何種模式,該指令都將被當(dāng)作一般用戶模式下的內(nèi)存操作。 Load/Store指令13-1 13LDM 批量數(shù)據(jù)加載指令 格式: LDM !, ; 功能:從一片連續(xù)的內(nèi)存單元讀取數(shù)據(jù)到各個(gè)寄存器中,內(nèi)存單元的起始地址為基址寄存器Rn的值,各個(gè)寄存器由寄存器列表regs表示。 該指令一般用于多個(gè)寄存器數(shù)據(jù)的出棧。 type字段種類: IA:每次傳送后地址加1。 IB:每次傳送前地址加1。 DA:每次傳送后地址減1。 DB:每次傳送前地址減1。 FD:滿遞減堆棧。 ED:空遞減堆棧。 FA:滿遞增堆棧。 EA:空遞

41、增堆棧。 注意:有一個(gè)約定,編號(hào)低的寄存器在存儲(chǔ)數(shù)據(jù)或者加載數(shù)據(jù)時(shí)對(duì)應(yīng)于存儲(chǔ)器的低地址。 Load/Store指令13-2 例如 LDMIA/IB/DA/DB R13!,R0-R1,R3; 各指令執(zhí)行完后,結(jié)果如圖所示。 Load/Store指令13-4 FD、ED、FA和EA指定是滿棧還是空棧,是升序棧還是降序棧,用于堆棧尋址。 一個(gè)滿棧的棧指針指向上次寫的最后一個(gè)數(shù)據(jù)單元. 空棧的棧指針指向第一個(gè)空閑單元。 一個(gè)降序棧是在內(nèi)存中反向增長(zhǎng)而升序棧在內(nèi)存中正向增長(zhǎng)。 Load/Store指令13-5 格式: LDM !, ; !:若選用了此后綴,則當(dāng)指令執(zhí)行完畢后,將最后的地址寫入基址寄存器。

42、 :當(dāng)regs中不包含PC時(shí),該后綴用于指示指令所用的寄存器為用戶模式下的寄存器,否則指示指令執(zhí)行時(shí),將寄存器SPSR的值復(fù)制到CPSR中。 Load/Store指令14-1 14STM 批量數(shù)據(jù)存儲(chǔ)指令 格式:STM !, ; 功能:將各個(gè)寄存器的值存入一片連續(xù)的內(nèi)存單元中,內(nèi)存單元的起始地址為基址寄存器Rn的值,各個(gè)寄存器由寄存器列表regs表示。 該指令一般用于多個(gè)寄存器數(shù)據(jù)的入棧。 :指示指令所用的寄存器為用戶模式下的寄存器。 其他參數(shù)用法同LDM指令。 例如: STMEA R13!,R0-R12,PC ;將寄存器R0R12以及程序計(jì)數(shù)器PC的值保存到R13指示的堆棧中 Load/St

43、ore指令14-2 舉例:其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器 Load/Store指令14-3 堆棧操作和數(shù)據(jù)塊傳送指令類似,也有4種模式,它們之間的關(guān)系如下表所示: Load/Store指令15 15SWP 字?jǐn)?shù)據(jù)交換指令 格式:SWP , , ; 功能: Rdop2,op2op1 從op2所表示的內(nèi)存裝載一個(gè)字并把這個(gè)字放置到目的寄存器Rd中,然后把寄存器op1的內(nèi)容存儲(chǔ)到同一內(nèi)存地址中。 op1,op2均為寄存器。 例如: SWP R0,R1,R2 ;將R2所表示的內(nèi)存單元中的字?jǐn)?shù)據(jù)裝載到R0,然后將R1中的字?jǐn)?shù)據(jù)保存到R2所表示的內(nèi)存單元中 Load/St

44、ore指令16 16SWPB 字節(jié)數(shù)據(jù)交換指令 格式:SWP B , , ; 功能:從op2所表示的內(nèi)存裝載一個(gè)字節(jié)并把這個(gè)字節(jié)放置到目的寄存器Rd的低8位中,Rd的高24位設(shè)置為0;然后將寄存器op1的低8位數(shù)據(jù)存儲(chǔ)到同一內(nèi)存地址中。 例如: SWPB R0,R1,R2 ;將R2所表示的內(nèi)存單元中的一個(gè)字節(jié)數(shù)據(jù)裝載到R0的低8位,然后將R1中的低8位字節(jié)數(shù)據(jù)保存到R2所表示的內(nèi)存單元中 程序狀態(tài)寄存器指令 用于狀態(tài)寄存器和通用寄存器間傳送數(shù)據(jù)。 總共有兩條指令:MRS和MSR。 兩者結(jié)合可用來修改程序狀態(tài)寄存器的值。 程序狀態(tài)寄存器指令1 1MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令

45、格式:MRS ,CPSR/SPSR; 功能:用于將程序狀態(tài)寄存器的內(nèi)容傳送到目標(biāo)寄存器Rd中。 當(dāng)進(jìn)入中斷服務(wù)程序或進(jìn)程切換時(shí),該指令可用來保存當(dāng)前狀態(tài)寄存器的值。 例如: MRS R0,CPSR ;狀態(tài)寄存器CPSR的值存入寄存器R0中 程序狀態(tài)寄存器指令2 2MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令 格式:MSR CPSR/SPSR_ , ; 功能:用于將寄存器Rd的值傳送到程序狀態(tài)寄存器中。 當(dāng)退出中斷服務(wù)程序或進(jìn)程切換時(shí),該指令可用來恢復(fù)狀態(tài)寄存器的值。 操作數(shù)op1可以是通用寄存器或立即數(shù)。 :用來設(shè)置狀態(tài)寄存器中需要操作的位。 32位的狀態(tài)寄存器可以分為4個(gè)域: 位31:24為條件標(biāo)志位域,用f表示。 位23:16為狀態(tài)位域,用s表示。 位15:8為擴(kuò)展位域,用x表示。 位7:0為控制位域,用c表示。 例如:MSR CPSR_f,R0 ;用R0的值修改CPSR的條件標(biāo)志域 MSR CPSR_fsxc,#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論