第3章ARM指令集_第1頁
第3章ARM指令集_第2頁
第3章ARM指令集_第3頁
第3章ARM指令集_第4頁
第3章ARM指令集_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第3 3章章 ARMARM指令集指令集本章主要介紹的內(nèi)容:本章主要介紹的內(nèi)容: ARMARM指令集、指令分類、指令格式和尋址指令集、指令分類、指令格式和尋址方式等。方式等。重點內(nèi)容:重點內(nèi)容: 尋址方式、有效立即數(shù)。尋址方式、有效立即數(shù)。目的和要求:目的和要求: 掌握掌握ARMARM指令集、指令分類、指令格式和指令集、指令分類、指令格式和尋址方式等。尋址方式等。3 3. .1 ARM1 ARM指令集概述指令集概述 ARMARM指令集是指令集是3232位的,程序的啟動都是從位的,程序的啟動都是從ARMARM指令集開始。所有的指令集開始。所有的ARMARM指令集都可以是有指令集都可以是有條件執(zhí)行

2、的。本節(jié)從以下三個方面介紹:條件執(zhí)行的。本節(jié)從以下三個方面介紹:1.1.指令集編碼指令集編碼 2.2.條件執(zhí)行條件執(zhí)行 3.3.指令分類及指令格式指令分類及指令格式 3.1.1 ARM3.1.1 ARM指令集編碼指令集編碼 ARM ARM指令集是以指令集是以3232位二進制編碼的方式給出位二進制編碼的方式給出的,大部分的指令編碼中定義了第一操作數(shù)、的,大部分的指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標(biāo)志影響位以第二操作數(shù)、目的操作數(shù)、條件標(biāo)志影響位以及每條指令所對應(yīng)的不同功能實現(xiàn)的二進制位。及每條指令所對應(yīng)的不同功能實現(xiàn)的二進制位。 每條每條3232位位ARMARM指令都具有不

3、同的二進制編碼指令都具有不同的二進制編碼方式和不同的指令功能相對應(yīng)方式和不同的指令功能相對應(yīng) 。編碼表如下:編碼表如下:987654321019 18 1701111213141516202122232425262731 30 29 28987654321019 18 1701111213141516202122232425262731 30 29 28010010CPCPoffset110111SS0DDDHH0000101111111GRmGRmoffsetRmRnRmRmRm010CRnCRnRnRnRnRnRn1RnRdHiRdRn11Ignored by processor1111c

4、ondCP#RdLCP Opc0111condCP#CRdCP Opc0111condCP#CRdLWNUP011condOffsetL101condRegister ListLWSUP001cond110condoffsetRdLWBUP110condoffsetRdLW1UP000cond0RdLW0UP000cond11111101001000cond0Rd00B01000condRnRdLoSAU10000condRsRnSA000000condoperand 2RdSopcode100cond數(shù)據(jù)處理數(shù)據(jù)處理/PSR狀態(tài)轉(zhuǎn)換狀態(tài)轉(zhuǎn)換半字存取寄存器偏移半字存取寄存器偏移半字存取立即數(shù)偏

5、移半字存取立即數(shù)偏移單數(shù)據(jù)存取單數(shù)據(jù)存取未定義未定義數(shù)據(jù)塊存取數(shù)據(jù)塊存取分支分支協(xié)處理器數(shù)據(jù)存取協(xié)處理器數(shù)據(jù)存取協(xié)處理器數(shù)據(jù)操作協(xié)處理器數(shù)據(jù)操作協(xié)處理器寄存器傳送協(xié)處理器寄存器傳送軟中斷軟中斷乘法乘法長乘長乘數(shù)據(jù)交換數(shù)據(jù)交換分支與交換分支與交換3.1.1 ARM3.1.1 ARM指令集編碼指令集編碼3.1.2 3.1.2 條件執(zhí)行條件執(zhí)行(1 1)ARMARM指令根據(jù)指令根據(jù)CPSRCPSR中的條件位自動判斷是中的條件位自動判斷是否執(zhí)行指令,在條件滿足時,指令執(zhí)行,否執(zhí)行指令,在條件滿足時,指令執(zhí)行,否則指令被忽略,即相當(dāng)于執(zhí)行一條空操否則指令被忽略,即相當(dāng)于執(zhí)行一條空操作指令。作指令。(2

6、2)在)在ARMARM的指令編碼表中,統(tǒng)一占用編碼的的指令編碼表中,統(tǒng)一占用編碼的最高四位最高四位3131:2828來表示來表示“條件碼條件碼”(即(即“condcond”)。)。 條件域表條件域表1 1條件碼條件碼后綴后綴標(biāo)標(biāo) 志志含含 義義0000EQZ置位置位相等相等0001NEZ清零清零不相等不相等0010CSC置位置位無符號數(shù)高于或等于無符號數(shù)高于或等于0011CCC清零清零無符號數(shù)低于無符號數(shù)低于0100MIN置位置位負(fù)數(shù)負(fù)數(shù)0101PLN清零清零正數(shù)或零正數(shù)或零0110VSV置位置位溢出溢出0111VCV清零清零未溢出未溢出3.1.2 3.1.2 條件執(zhí)行條件執(zhí)行條件域表條件域表

7、2 2條件碼條件碼 后綴后綴標(biāo)標(biāo) 志志含含 義義1001LSC清零清零Z置位置位無符號數(shù)低于或等于無符號數(shù)低于或等于1010GEN等于等于V有符號數(shù)大于或等于有符號數(shù)大于或等于1011LTN不等于不等于V有符號數(shù)小于有符號數(shù)小于1100GTZ清零且清零且N等于等于V有符號數(shù)大于有符號數(shù)大于1101LEZ置位且置位且N不等于不等于V有符號數(shù)小于或等于有符號數(shù)小于或等于1110AL總是(默認(rèn))總是(默認(rèn))無條件執(zhí)行無條件執(zhí)行1000HIC置位置位Z清零清零無符號數(shù)高于無符號數(shù)高于1111NV從不(未使用)從不(未使用)無無3.1.2 3.1.2 條件執(zhí)行條件執(zhí)行3.1.3 3.1.3 指令分類及指

8、令格式指令分類及指令格式1.1.指令分類簡述指令分類簡述 ARMARM指令集是指令集是Load/StoreLoad/Store型的,只能通過型的,只能通過Load/StoreLoad/Store指令實現(xiàn)對系統(tǒng)存儲器的訪問,而指令實現(xiàn)對系統(tǒng)存儲器的訪問,而其他類型的指令是基于處理器內(nèi)部的寄存器操其他類型的指令是基于處理器內(nèi)部的寄存器操作完成。作完成。 ARMARM指令集可以分為六大類:指令集可以分為六大類: (1 1)數(shù)據(jù)處理指令)數(shù)據(jù)處理指令 (2 2)Load/StoreLoad/Store指令指令 (3 3)跳轉(zhuǎn)指令)跳轉(zhuǎn)指令 (4 4)程序狀態(tài)寄存器處理指令)程序狀態(tài)寄存器處理指令 (5

9、 5)協(xié)處理器指令)協(xié)處理器指令 (6 6)異常產(chǎn)生指令)異常產(chǎn)生指令3.1.3 3.1.3 指令分類及指令格式指令分類及指令格式2.2.指令格式指令格式 S ,RnS , 3.3.基本指令格式說明基本指令格式說明 (1 1)opcodeopcode:操作碼;指令助記符,如:操作碼;指令助記符,如LDRLDR、STRSTR等。等。 (2 2)condcond:可選的條件碼;執(zhí)行條件,如:可選的條件碼;執(zhí)行條件,如EQEQ、NENE等。等。 (3 3)S S:可選后綴;若指定:可選后綴;若指定“S”S”,則根據(jù)指令執(zhí)行結(jié),則根據(jù)指令執(zhí)行結(jié)果更新果更新CPSRCPSR中的條件碼。中的條件碼。 (4

10、 4)RdRd:目標(biāo)寄存器。:目標(biāo)寄存器。 (5 5)RnRn:存放第:存放第1 1操作數(shù)的寄存器。操作數(shù)的寄存器。 (6 6)operand2operand2:第:第2 2個操作數(shù)。個操作數(shù)。4 4、指令格式使用舉例、指令格式使用舉例 LDRLDRR0,R1R0,R1;將;將R1R1所指地址單元中的數(shù)據(jù)所指地址單元中的數(shù)據(jù);送到;送到R0R0中,執(zhí)行條件中,執(zhí)行條件ALAL BEQBEQDATAEVENDATAEVEN;執(zhí)行條件分支指令,執(zhí)行條;執(zhí)行條件分支指令,執(zhí)行條;件;件EQEQ,即相等則跳轉(zhuǎn)到目標(biāo),即相等則跳轉(zhuǎn)到目標(biāo);DATEVENDATEVEN處處 ADDSADDSR2,R1,#1

11、R2,R1,#1;加法指令,;加法指令,R2R1+1R2R1+1,影響,影響;CPSRCPSR寄存器寄存器(S)(S) SUBNESSUBNESR2,R1,#0 x20R2,R1,#0 x20 ;執(zhí)行條件減法運算,執(zhí)行條;執(zhí)行條件減法運算,執(zhí)行條;件;件NENE,R2R1-R2R1- 0 x200 x20,影響,影響;CPSRCPSR寄存器寄存器(S)(S)3.1.3 3.1.3 指令分類及指令格式指令分類及指令格式3.2 ARM3.2 ARM尋址方式尋址方式1.1.立即尋址立即尋址2.2.寄存器尋址寄存器尋址3.3.寄存器間接尋址寄存器間接尋址4.4.基址加偏址尋址基址加偏址尋址 5.5.堆

12、棧尋址堆棧尋址 6.6.塊拷貝尋址塊拷貝尋址 7.7.相對尋址相對尋址 3.2.1 3.2.1 立即尋址立即尋址(1 1)立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址)立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指方式,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù),這個操作數(shù)被稱為立即數(shù),令也就取到了操作數(shù),這個操作數(shù)被稱為立即數(shù),對應(yīng)的尋址方式也就叫做立即尋址。對應(yīng)的尋址方式也就叫做立即尋址。 例:例: ADDADDR0R0,R0R0,# #1 1 ;R0R0+1R0R0+1 ADDADDR0R0,R0R0,# #0 x3f0 x3f ;R0R0

13、+0 x3fR0R0+0 x3f(2 2)在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),)在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要求以要求以“#”#”為前綴,對于以十六進制表示的立為前綴,對于以十六進制表示的立即數(shù),還要求在即數(shù),還要求在“#”#”后加上后加上“0 x”0 x”或或“&”&”;在;在“#”#”后加后加“0b”0b”表示二進制數(shù);在表示二進制數(shù);在“#”#”后加后加“0d”0d”或缺省時表示十進制數(shù)?;蛉笔r表示十進制數(shù)。在在3232位指令編碼中存放位指令編碼中存放3232位立即數(shù)的方法是:位立即數(shù)的方法是:在在ARMARM數(shù)據(jù)處理指令中,當(dāng)參與操作的第二操作

14、數(shù)據(jù)處理指令中,當(dāng)參與操作的第二操作數(shù)為立即數(shù)型時,每個立即數(shù)都是采用一個數(shù)為立即數(shù)型時,每個立即數(shù)都是采用一個8 8位的常位的常數(shù)循環(huán)右移偶數(shù)位而間接得到。其中循環(huán)右移的位數(shù)循環(huán)右移偶數(shù)位而間接得到。其中循環(huán)右移的位數(shù)由一個數(shù)由一個4 4位二進制的兩倍來表示,如果立即數(shù)記作位二進制的兩倍來表示,如果立即數(shù)記作,8 8位常數(shù)記作位常數(shù)記作immed_8immed_8,4 4位的循環(huán)右位的循環(huán)右移值記作移值記作rotate_immrotate_imm,有效的立即數(shù)是由一個,有效的立即數(shù)是由一個8 8位的位的立即數(shù)循環(huán)右移偶數(shù)位得到。立即數(shù)循環(huán)右移偶數(shù)位得到。 有效立即數(shù)有效立即數(shù)immediat

15、eimmediate可以表示成:可以表示成: =immed_8=immed_8循環(huán)右移(循環(huán)右移(2 2rotate_immrotate_imm)(3 3)有效立即數(shù)問題)有效立即數(shù)問題3.2.1 3.2.1 立即尋址立即尋址23cond22212019181716151413121110 9 8 7 6 5 4 3 2 1 031302928272625240 0opcodeSRnRdoperand 2#目的寄存器目的寄存器第一操作數(shù)寄存器第一操作數(shù)寄存器設(shè)置條件碼設(shè)置條件碼算術(shù)算術(shù)/邏輯功能邏輯功能# rot8bit immediate# shiftSh 0RmRsSh 1Rm010118

16、 70117 6 5 4 30118 7 6 5 4 30立即數(shù)對齊立即數(shù)對齊立即數(shù)移位長度立即數(shù)移位長度移位類型移位類型第二操作數(shù)寄存器第二操作數(shù)寄存器寄存器移位長度寄存器移位長度2525(3 3)有效立即數(shù)問題)有效立即數(shù)問題數(shù)據(jù)處理指令二進制編碼數(shù)據(jù)處理指令二進制編碼3.2.1 3.2.1 立即尋址立即尋址(3 3)有效立即數(shù)問題)有效立即數(shù)問題例:例:.global.global_start_start.text.text_start:_start:MOVMOVR0,R0,# #0 x0000F2000 x0000F200MOVMOVR1,R1,# #0 x001100000 x001

17、10000MOVMOVR4,R4,# #0 x000128000 x00012800ADDSADDSR2,R1,R0R2,R1,R0BGEBGEhereherestop:stop: B Bstopstophere:here: SUBSUBR3,R4,R1R3,R4,R1.end.end問題:問題:0 x10100 x1010、0 x0010200 x001020和和x0FF1000 x0FF1000、0 x3FC0 x3FC、0 xF00000010 xF0000001等常數(shù)是不是合法的立即數(shù)?等常數(shù)是不是合法的立即數(shù)?;由;由0 xF2循環(huán)右移循環(huán)右移24(212)得到得到;由;由0 x11

18、循環(huán)右移循環(huán)右移16(28)得到得到;由;由0 x4A循環(huán)右移循環(huán)右移22(211)得到得到3.2.1 3.2.1 立即尋址立即尋址3.2.2 3.2.2 寄存器尋址寄存器尋址 寄存器尋址就是利用寄存器中的數(shù)值作寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處理器經(jīng)為操作數(shù),這種尋址方式是各類微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。的尋址方式。 例:例: ADDADDR0R0,R1R1,R2R2;R0R1R0R1R2R2 該指令的執(zhí)行效果是將寄存器該指令的執(zhí)行效果是將寄存器R1R1和和R2R2的的內(nèi)容相加,其結(jié)果存放在

19、寄存器內(nèi)容相加,其結(jié)果存放在寄存器R0R0中。中。(1 1)第二操作數(shù)為寄存器型的移位操作)第二操作數(shù)為寄存器型的移位操作 在在ARMARM指令的數(shù)據(jù)處理指令中參與操作的第二操作指令的數(shù)據(jù)處理指令中參與操作的第二操作數(shù)為寄存器型時,在執(zhí)行寄存器尋址操作時,可以選數(shù)為寄存器型時,在執(zhí)行寄存器尋址操作時,可以選擇是否對第二操作數(shù)進行移位,即擇是否對第二操作數(shù)進行移位,即RmRm,其,其中中RmRm稱為第二操作數(shù)寄存器,稱為第二操作數(shù)寄存器,用來指定移位類用來指定移位類型(型(LSLLSL、LSRLSR、ASLASL、ASRASR、RORROR或或RRXRRX)和移位位數(shù)。)和移位位數(shù)。移位位數(shù)可以

20、是移位位數(shù)可以是5 5位立即數(shù)(位立即數(shù)(#)或者是寄存)或者是寄存器(器(RsRs)。在指令執(zhí)行時將移位后的內(nèi)容作為第二操)。在指令執(zhí)行時將移位后的內(nèi)容作為第二操作數(shù)參與運算。作數(shù)參與運算。 例:例: ADD R3ADD R3, ,R2R2, ,R1R1, ,LSRLSR #2#2 ;R3R3R2+R1R2+R14 40 x000000550 x00000055R3R3R1R1 0 x000000200 x000000200 x000000150 x00000015R2R2ADD R3,R2,ADD R3,R2,R1,LSRR1,LSR #2#20 x0000001D0 x0000001D邏

21、輯右移邏輯右移2 2位位+ +0 x000000080 x00000008R1R13.2.2 3.2.2 寄存器尋址寄存器尋址(2 2)第二操作數(shù)移位方式)第二操作數(shù)移位方式 LSLLSL:邏輯左移,空出的最低有效位用邏輯左移,空出的最低有效位用0 0填充。填充。LSRLSR:邏輯右移,空出的最高有效位用邏輯右移,空出的最高有效位用0 0填充。填充。ASLASL:算術(shù)左移,由于左移空出的有效位用算術(shù)左移,由于左移空出的有效位用0 0填充,因此它與填充,因此它與LSLLSL同同義。義。ASRASR:算術(shù)右移,算術(shù)移位的對象是帶符號數(shù),移位過程中必須保算術(shù)右移,算術(shù)移位的對象是帶符號數(shù),移位過程中

22、必須保持操作數(shù)的符號不變。如果源操作數(shù)是正數(shù),空出的最高有持操作數(shù)的符號不變。如果源操作數(shù)是正數(shù),空出的最高有效位用效位用0 0填充,如果是負(fù)數(shù)用填充,如果是負(fù)數(shù)用1 1填充。填充。 RORROR:循環(huán)右移,移出的字的最低有效位依次填入空出的最高有效循環(huán)右移,移出的字的最低有效位依次填入空出的最高有效位。位。RRXRRX:帶擴展的循環(huán)右移。帶擴展的循環(huán)右移。 將寄存器的內(nèi)容循環(huán)右移將寄存器的內(nèi)容循環(huán)右移1 1位,空位用位,空位用原來原來C C標(biāo)志位填充。標(biāo)志位填充。3.2.2 3.2.2 寄存器尋址寄存器尋址LSL #50000031000000310LSR #5000000 0310ASR

23、#5,positive operand111111 1310ASR #5,negative operand310ROR #5C310RRXCC3.2.2 3.2.2 寄存器尋址寄存器尋址(3 3)第二操作數(shù)的移位位數(shù))第二操作數(shù)的移位位數(shù) 移位位數(shù)可以用立即數(shù)方式或者寄存器方式給出。移位位數(shù)可以用立即數(shù)方式或者寄存器方式給出。 例:例:ADD R3ADD R3, ,R2R2, ,R1R1, ,LSR #2LSR #2 ;R3R3R2+R1R2+R14 4ADD R3ADD R3, ,R2R2, ,R1R1, ,LSR R4LSR R4 ;R3R3R2+R1R2+R12 2R4R4 寄存器寄存器

24、R1R1的內(nèi)容分別邏輯右移的內(nèi)容分別邏輯右移2 2位、位、R4R4位(即位(即R1R14 4、R1R12 2R4R4),再與寄存器),再與寄存器R2R2的內(nèi)容相加,結(jié)果放入的內(nèi)容相加,結(jié)果放入R3R3中。中。3.2.2 3.2.2 寄存器尋址寄存器尋址3.2.3 3.2.3 寄存器間接尋址寄存器間接尋址 寄存器間接尋址就是以寄存器中的值作為操寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,作數(shù)的地址, 而操作數(shù)本身存放在存儲器中。而操作數(shù)本身存放在存儲器中。 例:例: LDRLDRR0R0,R1R1;R0R1R0R1 STRSTRR0R0,R1R1;R1R0R1R0第一條指令將以第一條指令將

25、以R1R1的值為地址的存儲器中的的值為地址的存儲器中的數(shù)據(jù)傳送到數(shù)據(jù)傳送到R0R0中。第二條指令將中。第二條指令將R0R0的值傳送到以的值傳送到以R1R1的值為地址的存儲器中。的值為地址的存儲器中。0 x000000550 x00000055R0R0R1R1 0 x400000000 x400000000 x000000AA0 x000000AA0 x400000000 x40000000存儲器存儲器寄存器寄存器LDR R0,LDR R0,R1R10 x000000AA0 x000000AA3.2.3 3.2.3 寄存器間接尋址寄存器間接尋址 基址變址尋址就是將寄存器(該寄存器一般稱作基址變址

26、尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。變址尋址方式常用于從而得到一個操作數(shù)的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。采用變址尋址方式的指訪問某基地址附近的地址單元。采用變址尋址方式的指令又可以分為以下幾種形式:令又可以分為以下幾種形式:前變址模式:前變址模式: LDR R0LDR R0, ,R1R1, ,0 044;R0R0R1+4R1+4自動變址模式:自動變址模式: LDR R0,R1,LDR R0,R1,0404?。籖0R1+4R0R1+4、R1R1+4

27、R1R1+4后變址模式:后變址模式: LDR R0,R1,LDR R0,R1,0404;R0R1R0R1、R1R1+4R1R1+40 x000000550 x00000055R0R0R1R1 0 x400000000 x400000000 x000000AA0 x000000AA0 x400000040 x40000004LDR R0,R1,#04LDR R0,R1,#040 x000000AA0 x000000AA將將R1+#04R1+#04作為作為地址裝載數(shù)據(jù)地址裝載數(shù)據(jù)前變址模式前變址模式0 x000000550 x00000055R0R0R1R1 0 x400000000 x40000

28、0000 x000000AA0 x000000AA0 x400000040 x40000004LDR R0,R1,#04LDR R0,R1,#04!0 x000000AA0 x000000AA將將R1+#04R1+#04作為作為地址裝載數(shù)據(jù)地址裝載數(shù)據(jù)自動變址模式自動變址模式0 x400000040 x40000004再將再將R1R1的的內(nèi)容內(nèi)容加上加上#04#040 x000000550 x00000055R0R0R1R1 0 x400000000 x400000000 x000000BB0 x000000BB0 x400000000 x40000000LDR R0,R1,#04LDR R0

29、,R1,#040 x000000BB0 x000000BB將將R1R1作為地作為地址裝載數(shù)據(jù)址裝載數(shù)據(jù)后變址模式后變址模式0 x400000040 x40000004再將再將R1R1的的內(nèi)容內(nèi)容加上加上#04#04 基址寄存器的地址偏移可以是一個立即數(shù),也可以基址寄存器的地址偏移可以是一個立即數(shù),也可以是另一個寄存器,并且在加到基址寄存器前還可以經(jīng)過是另一個寄存器,并且在加到基址寄存器前還可以經(jīng)過移位操作。移位操作。 例:例:LDRLDR R R0 0, ,R1R1, ,R2R2LDR R0LDR R0, ,R1R1, ,R2R2, ,LSL #2LSL #2 常用的是立即數(shù)偏移的形式,地址偏

30、移為寄存器形常用的是立即數(shù)偏移的形式,地址偏移為寄存器形式的指令很少使用。式的指令很少使用。3.2.4 3.2.4 基址加偏址尋址基址加偏址尋址;R0mem32R1+R2R0mem32R1+R2;R0R1+R2R0R1+R2* *443.2.5 3.2.5 堆棧尋址堆棧尋址(1 1)堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進后出()堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進后出(First In First In Last OutLast Out,F(xiàn)ILOFILO)的方式工作,使用一個稱作堆)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。指針總

31、是指向棧頂。(2 2)當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿)當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿堆棧(堆棧(Full StackFull Stack),而當(dāng)堆棧指針指向下一個),而當(dāng)堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為空堆棧(將要放入數(shù)據(jù)的空位置時,稱為空堆棧(Empty Empty StackStack)。)。(3 3)即訪問存儲器時,存儲器的地址向高地址方向生)即訪問存儲器時,存儲器的地址向高地址方向生長,稱為遞增堆棧(長,稱為遞增堆棧(ascending stackascending stack)。存儲)。存儲器的地址向低地址方向生長,稱為遞減堆棧器的地址向低地址方

32、向生長,稱為遞減堆棧(descending stackdescending stack)。)。棧頂棧頂SP棧頂棧頂SP棧底棧底空堆??斩褩5讞5诐M堆棧滿堆棧0 x123456780 x123456780 x123456780 x12345678棧頂棧頂SP0 x123456780 x12345678棧頂棧頂SP壓棧壓棧壓棧壓棧(1 1)堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進后出()堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進后出(First In First In Last OutLast Out,F(xiàn)ILOFILO)的方式工作,使用一個稱作堆)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧棧指針的專

33、用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。指針總是指向棧頂。(2 2)當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿)當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿堆棧(堆棧(Full StackFull Stack),而當(dāng)堆棧指針指向下一個),而當(dāng)堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為空堆棧(將要放入數(shù)據(jù)的空位置時,稱為空堆棧(Empty Empty StackStack)。)。(3 3)即訪問存儲器時,存儲器的地址向高地址方向生)即訪問存儲器時,存儲器的地址向高地址方向生長,稱為遞增堆棧(長,稱為遞增堆棧(ascending stackascending stack)。存儲)。存儲

34、器的地址向低地址方向生長,稱為遞減堆棧器的地址向低地址方向生長,稱為遞減堆棧(descending stackdescending stack)。)。向下向下增加增加向上向上增加增加棧底棧底棧頂棧頂棧區(qū)棧區(qū)SP堆棧存堆棧存儲區(qū)儲區(qū)棧頂棧頂棧底棧底棧區(qū)棧區(qū)SP0 x123456780 x123456780 x123456780 x12345678堆棧壓棧堆棧壓棧堆棧壓棧堆棧壓棧3.2.5 3.2.5 堆棧尋址堆棧尋址四種類型的堆棧工作方式:四種類型的堆棧工作方式:(1 1)滿遞增堆棧:)滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由低堆棧指針指向最后壓入的數(shù)據(jù),且由低 地址向高地址生成。地址向高地

35、址生成。 LDMFA STMFALDMFA STMFA(2 2)滿遞減堆棧:)滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由高堆棧指針指向最后壓入的數(shù)據(jù),且由高 地址向低地址生成。地址向低地址生成。 LDMFD STMFDLDMFD STMFD(3 3)空遞增堆棧:)空遞增堆棧:堆棧指針指向下一個將要放入數(shù)據(jù)的空堆棧指針指向下一個將要放入數(shù)據(jù)的空 位置,且由低地址向高地址生成。位置,且由低地址向高地址生成。 LDMEA STMEALDMEA STMEA(4 4)空遞減堆棧:)空遞減堆棧:堆棧指針指向下一個將要放入數(shù)據(jù)的空堆棧指針指向下一個將要放入數(shù)據(jù)的空 位置,且由高地址向低地址生成。位置,且由

36、高地址向低地址生成。 LDMED STMEDLDMED STMED3.2.5 3.2.5 堆棧尋址堆棧尋址3.2.6 3.2.6 塊拷貝尋址塊拷貝尋址(1 1)塊拷貝尋址是多寄存器傳送指令)塊拷貝尋址是多寄存器傳送指令LDM/STMLDM/STM的尋址方的尋址方式。式。LDM/STMLDM/STM指令可以把存儲器中的一個數(shù)據(jù)塊加指令可以把存儲器中的一個數(shù)據(jù)塊加載到多個寄存器中,也可以把多個寄存器中的內(nèi)載到多個寄存器中,也可以把多個寄存器中的內(nèi)容保存到存儲器中。尋址操作中的寄存器可以是容保存到存儲器中。尋址操作中的寄存器可以是R0-R15R0-R15這這1616個寄存器的子集或是所有寄存器。個寄

37、存器的子集或是所有寄存器。(2 2)LDM/STMLDM/STM指令依據(jù)其后綴名的不同其尋址的方式也指令依據(jù)其后綴名的不同其尋址的方式也有很大不同。有很大不同。0 x400000000 x40000000R1R1R2R20 x?0 x?0 x010 x010 x400000000 x400000000 x?0 x?R3R3R4R40 x?0 x?R6R60 x?0 x?0 x020 x020 x030 x030 x040 x040 x400000040 x400000040 x400000080 x400000080 x4000000C0 x4000000C存儲器存儲器LDM R1!,R2-R

38、4,R6LDM R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010多寄存器多寄存器loadload和和storestore指令的堆棧和塊拷貝對照指令的堆棧和塊拷貝對照遞增遞增遞減遞減滿滿空空滿滿空空增值增值先增先增STMIBSTMIBSTMFASTMFALDMIBLDMIBLDMEDLDMED后增后增STMIASTMIASTMEASTMEALDMIALDMIALDMFDLDMFD減值減值先減先減LDMDBLDMDBLDMEALDMEASTMDBSTMDBSTMFDSTMFD后減后減LDMDALDMDALDMFALDMFASTMDASTMDASTMEDSTM

39、ED3.2.6 3.2.6 塊拷貝尋址塊拷貝尋址3.2.7 3.2.7 相對尋址相對尋址 與基址變址尋址方式相類似,相對尋址以程序計數(shù)與基址變址尋址方式相類似,相對尋址以程序計數(shù)器器PCPC的當(dāng)前值為基地址,指令中的地址標(biāo)號作為偏移量,的當(dāng)前值為基地址,指令中的地址標(biāo)號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。將兩者相加之后得到操作數(shù)的有效地址。 以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BLBL采用了相對尋址方式:采用了相對尋址方式: 例:例:BLBLNEXTNEXT;跳轉(zhuǎn)到子程序;跳轉(zhuǎn)到子程序 ;NEXTNEXT處執(zhí)行處執(zhí)行NEXTNEXTM

40、OVMOVPCPC,LRLR;從子程序返回;從子程序返回 3.3 ARM3.3 ARM指令詳細(xì)介紹指令詳細(xì)介紹 1.數(shù)據(jù)處理指令2.Load/Store指令3.程序狀態(tài)寄存器與通用寄存器之間的傳送指令4.轉(zhuǎn)移指令5.異常中斷指令6.協(xié)處理器指令3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令 ARMARM的數(shù)據(jù)處理指令主要完成寄存器中的數(shù)據(jù)處理指令主要完成寄存器中數(shù)據(jù)的算術(shù)和邏輯運算操作。本節(jié)按以下內(nèi)數(shù)據(jù)的算術(shù)和邏輯運算操作。本節(jié)按以下內(nèi)容組織:容組織:1.1.數(shù)據(jù)處理指令數(shù)據(jù)處理指令分類分類2.2.數(shù)據(jù)處理指令二進制編碼數(shù)據(jù)處理指令二進制編碼3.3.數(shù)據(jù)處理指令表數(shù)據(jù)處理指令表4.4.數(shù)據(jù)處

41、理指令詳細(xì)介紹數(shù)據(jù)處理指令詳細(xì)介紹1.1.數(shù)據(jù)處理指令數(shù)據(jù)處理指令分類分類 數(shù)據(jù)處理指令根據(jù)指令實現(xiàn)數(shù)據(jù)處理指令根據(jù)指令實現(xiàn)處理功能可分為以下六類:處理功能可分為以下六類: (1 1)數(shù)據(jù)傳送指令;)數(shù)據(jù)傳送指令; (2 2)算術(shù)運算指令)算術(shù)運算指令; (3 3)邏輯運算指令;)邏輯運算指令; (4 4)比較指令;)比較指令; (5 5)測試指令;)測試指令; (6 6)乘法指令。)乘法指令。3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令2.2.數(shù)據(jù)處理指令數(shù)據(jù)處理指令二進制編碼二進制編碼數(shù)據(jù)處理指令的二進制編碼如下:數(shù)據(jù)處理指令的二進制編碼如下:23cond222120191817161

42、51413121110 9 8 7 6 5 4 3 2 1 031302928272625240 0opcodeSRnRdoperand 2#目的寄存器目的寄存器第一操作數(shù)寄存器第一操作數(shù)寄存器設(shè)置條件碼設(shè)置條件碼算術(shù)算術(shù)/邏輯功能邏輯功能# rot8bit immediate# shiftSh 0RmRsSh 1Rm010118 70117 6 5 4 30118 7 6 5 4 30立即數(shù)對齊立即數(shù)對齊立即數(shù)移位長度立即數(shù)移位長度移位類型移位類型第二操作數(shù)寄存器第二操作數(shù)寄存器寄存器移位長度寄存器移位長度25253.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令3.3.數(shù)據(jù)處理指令數(shù)據(jù)處理指

43、令指令表指令表數(shù)據(jù)處理指令的詳細(xì)列表如下:數(shù)據(jù)處理指令的詳細(xì)列表如下:操作碼操作碼24:21助記符助記符意義意義效果效果0000AND邏輯位與邏輯位與Rd Rn AND Op20001EOR邏輯位異或邏輯位異或Rd Rn EOR Op20010SUB減減Rd Rn - Op20011RSB反向減反向減Rd Op2 - Rn0100ADD加加Rd Rn + Op20101ADC帶進位加帶進位加Rd Rn + Op2 + C0110SBC帶進位減帶進位減Rd Rn - Op2 + C - 10111RSC反向帶進位減反向帶進位減Rd Op2 - Rn + C - 11000TST測試測試根據(jù)根據(jù)R

44、n AND Op2設(shè)置條件碼設(shè)置條件碼1001TEQ測試相等測試相等根據(jù)根據(jù)Rn EOR Op2設(shè)置條件設(shè)置條件1010CMP比較比較根據(jù)根據(jù)Rn - Op2設(shè)置條件碼設(shè)置條件碼1011CMN負(fù)數(shù)比較負(fù)數(shù)比較根據(jù)根據(jù)Rn + Op2設(shè)置條件碼設(shè)置條件碼1100ORR邏輯位或邏輯位或Rd Rn OR Op21101MOV傳送傳送Rd Op21110BIC位清零位清零Rd Rn AND NOT Op21111MVN求反求反Rd NOT Op23.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令助記符助記符說明說明操作操作條件碼位置條件碼位置MOV Rd,operand2MOV Rd,operand2數(shù)

45、據(jù)傳送數(shù)據(jù)傳送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2MVN Rd,operand2數(shù)據(jù)非傳送數(shù)據(jù)非傳送RdRd( (operand2)operand2)MVNcondSMVNcondS 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令(1 1)數(shù)據(jù)傳輸)數(shù)據(jù)傳輸(1 1)數(shù)據(jù)傳輸)數(shù)據(jù)傳輸助記符助記符說明說明操作操作條件碼位置條件碼位置MOV Rd,operand2MOV Rd,operand2數(shù)據(jù)傳送數(shù)據(jù)傳送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2MVN

46、Rd,operand2數(shù)據(jù)非傳送數(shù)據(jù)非傳送RdRd( (operand2)operand2)MVNcondSMVNcondS MOVMOV指令將指令將8 8位立即數(shù)或寄存器傳送到目標(biāo)寄存器(位立即數(shù)或寄存器傳送到目標(biāo)寄存器(RdRd),可用于移位),可用于移位運算等操作。運算等操作。 指令格式如下:指令格式如下: MOVcondSMOVcondS Rd,operand2 Rd,operand2 MOVMOV指令舉例如下:指令舉例如下: MOVMOVR1,#0 x10R1,#0 x10;R10 x10 ;R10 x10 MOVMOVR0,R1R0,R1;R0R1;R0R1 MOVSMOVSR3,

47、R1,LSL #2R3,R1,LSL #2;R3R12;R3R12,并影響標(biāo)志位,并影響標(biāo)志位 MOVMOVPC,LRPC,LR;PCLR;PCLR,子程序返回,子程序返回 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令(1 1)數(shù)據(jù)傳輸)數(shù)據(jù)傳輸助記符助記符說明說明操作操作條件碼位置條件碼位置MOV Rd,operand2MOV Rd,operand2數(shù)據(jù)傳送數(shù)據(jù)傳送RdRdoperand2 operand2 MOVcondSMOVcondS MVN Rd,operand2MVN Rd,operand2數(shù)據(jù)非傳送數(shù)據(jù)非傳送RdRd( (operand2)operand2)MVNcondSM

48、VNcondS MVNMVN指令將指令將8 8位立即數(shù)或寄存器(位立即數(shù)或寄存器(operand2operand2)按位取反后傳送到目標(biāo)寄)按位取反后傳送到目標(biāo)寄存器(存器(RdRd),因為其具有取反功能,所以可以裝載范圍更廣的立即數(shù)。),因為其具有取反功能,所以可以裝載范圍更廣的立即數(shù)。 指令格式如下:指令格式如下: MVNcondSMVNcondS Rd,operand2 Rd,operand2 MVNMVN指令舉例如下:指令舉例如下: MVNMVNR1,#0 xFFR1,#0 xFF;R10 xFFFFFF00;R10 xFFFFFF00 MVNMVNR1,R2R1,R2; ;將將R2R

49、2取反,結(jié)果存到取反,結(jié)果存到R1R13.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令助記符助記符說明說明操作操作條件碼位置條件碼位置ADD Rd, RnADD Rd, Rn, operand2, operand2加法運算指令加法運算指令RdRdRn+operand2Rn+operand2ADDcondSADDcondS SUB Rd, RnSUB Rd, Rn, operand2, operand2減法運算指令減法運算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondS RSB Rd, RnRSB Rd, Rn, operand2, operand2逆向減

50、法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, RnADC Rd, Rn, operand2, operand2帶進位加法帶進位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCcondS SBC Rd, RnSBC Rd, Rn, operand2, operand2帶進位減法指令帶進位減法指令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondS RSC Rd, RnRSC Rd, Rn, op

51、erand2, operand2帶進位逆向減法帶進位逆向減法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondS 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令(2 2)算術(shù)運算)算術(shù)運算(2 2)算術(shù)運算)算術(shù)運算 ADDADD指令將指令將operand2operand2的值與的值與RnRn的值相加,結(jié)果保存到的值相加,結(jié)果保存到RdRd寄存器。寄存器。 指令格式如下:指令格式如下: ADDcondSADDcondS Rd,Rn,operand2 Rd,Rn,operand2 應(yīng)用示例:應(yīng)用示例: ADDS

52、 R1,R1,#1ADDS R1,R1,#1;R1;R1R1+1R1+1,并影響標(biāo)志位,并影響標(biāo)志位 ADD R1,R1,R2ADD R1,R1,R2;R1;R1R1+R2 R1+R2 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令助記符助記符說明說明操作操作條件碼位置條件碼位置ADD Rd, RnADD Rd, Rn, operand2, operand2加法運算指令加法運算指令RdRdRn+operand2Rn+operand2ADDcondSADDcondS SUB Rd, RnSUB Rd, Rn, operand2, operand2減法運算指令減法運算指令RdRdRn-opera

53、nd2Rn-operand2SUBcondSSUBcondS RSB Rd, RnRSB Rd, Rn, operand2, operand2逆向減法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, RnADC Rd, Rn, operand2, operand2帶進位加法帶進位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCcondS SBC Rd, RnSBC Rd, Rn, operand2, operand2帶進位減法指令帶進位減法指令RdRdRn-operand2

54、-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondS RSC Rd, RnRSC Rd, Rn, operand2, operand2帶進位逆向減法帶進位逆向減法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondS SUBSUB指令用寄存器指令用寄存器RnRn減去減去operand2operand2,結(jié)果保存到,結(jié)果保存到RdRd中。中。 指令格式如下:指令格式如下: SUBcondSSUBcondS Rd,Rn,operand2 Rd,Rn,operand2 應(yīng)用

55、示例:應(yīng)用示例: SUBSSUBSR0,R0,#1R0,R0,#1;R0;R0R0-1 R0-1 ,并影響標(biāo)志位,并影響標(biāo)志位 SUBSSUBSR2,R1,R2R2,R1,R2;R2;R2R1-R2R1-R2 ,并影響標(biāo)志位,并影響標(biāo)志位 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令(2 2)算術(shù)運算)算術(shù)運算助記符助記符說明說明操作操作條件碼位置條件碼位置ADD Rd, RnADD Rd, Rn, operand2, operand2加法運算指令加法運算指令RdRdRn+operand2Rn+operand2ADDcondSADDcondS SUB Rd, RnSUB Rd, Rn, o

56、perand2, operand2減法運算指令減法運算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondS RSB Rd, RnRSB Rd, Rn, operand2, operand2逆向減法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, RnADC Rd, Rn, operand2, operand2帶進位加法帶進位加法RdRdRn+operand2+CarryRn+operand2+CarryADCcondSADCcondS SBC Rd, RnSBC Rd, Rn, operan

57、d2, operand2帶進位減法指令帶進位減法指令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondS RSC Rd, RnRSC Rd, Rn, operand2, operand2帶進位逆向減法帶進位逆向減法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondS RSBRSB指令將指令將operand2operand2的值減去的值減去RnRn,結(jié)果保存到,結(jié)果保存到RdRd中。中。 指令格式如下:指令格式如下: RSBcondSRS

58、BcondS Rd,Rn,operand2 Rd,Rn,operand2 應(yīng)用示例:應(yīng)用示例: RSB R3,R1,#0 xFF00RSB R3,R1,#0 xFF00;R3;R30 xFF00-R10 xFF00-R1 RSBS R1,R2,R2,LSL #2RSBS R1,R2,R2,LSL #2;R1;R1(R22)-R2=R2(R22)-R2=R23 3 3.3.1 3.3.1 數(shù)據(jù)處理指令數(shù)據(jù)處理指令(2 2)算術(shù)運算)算術(shù)運算助記符助記符說明說明操作操作條件碼位置條件碼位置ADD Rd, RnADD Rd, Rn, operand2, operand2加法運算指令加法運算指令RdR

59、dRn+operand2Rn+operand2ADDcondSADDcondS SUB Rd, RnSUB Rd, Rn, operand2, operand2減法運算指令減法運算指令RdRdRn-operand2Rn-operand2SUBcondSSUBcondS RSB Rd, RnRSB Rd, Rn, operand2, operand2逆向減法指令逆向減法指令RdRdoperand2-Rnoperand2-RnRSBcondSRSBcondS ADC Rd, RnADC Rd, Rn, operand2, operand2帶進位加法帶進位加法RdRdRn+operand2+Carr

60、yRn+operand2+CarryADCcondSADCcondS SBC Rd, RnSBC Rd, Rn, operand2, operand2帶進位減法指令帶進位減法指令RdRdRn-operand2-Rn-operand2-(NOT)Carry(NOT)CarrySBCcondSSBCcondS RSC Rd, RnRSC Rd, Rn, operand2, operand2帶進位逆向減法帶進位逆向減法指令指令RdRdoperand2-Rn-operand2-Rn-(NOT)Carry(NOT)CarryRSCcondSRSCcondS ADCADC將將operand2operand2的值與的值與R

溫馨提示

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

評論

0/150

提交評論