




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ARM 指令集指南.txt人永遠(yuǎn)不知道誰哪次不經(jīng)意的跟你說了再見之后就真的再也不見了。一分鐘有多長?這要看你是蹲在廁所里面,還是等在廁所外面ARM指令集2008-03-12 15:27跳轉(zhuǎn)指令跳轉(zhuǎn)指令用于實現(xiàn)程序流程的跳轉(zhuǎn),在ARM 程序中有如下兩種方法可以實現(xiàn)程序流程的跳轉(zhuǎn):l 使用專門的跳轉(zhuǎn)指令。l 直接向程序計數(shù)器PC 寫入跳轉(zhuǎn)地址值。通過向程序計數(shù)器PC寫入跳轉(zhuǎn)地址值,可以實現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn),在跳轉(zhuǎn)之前結(jié)合使用“MOV LR, PC”等類似指令,可以保存將來的返回地址值,從而實現(xiàn)在4GB連續(xù)的線性地址空間的子程序調(diào)用。ARM指令集中的跳轉(zhuǎn)指令可以完成從當(dāng)前指令向前或向后
2、的32MB的地址空間的跳轉(zhuǎn),包括以下4條指令:l B 跳轉(zhuǎn)指令。l BL 帶返回的跳轉(zhuǎn)指令。l BLX 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令。l BX 帶狀態(tài)切換的跳轉(zhuǎn)指令。(1) B指令B指令的格式為:B 目標(biāo)地址B指令是最簡單的跳轉(zhuǎn)指令。一旦遇到一個B指令, ARM處理器將立即跳轉(zhuǎn)到給定的目標(biāo)地址,從那里繼續(xù)執(zhí)行。注意存儲在跳轉(zhuǎn)指令中的實際值是相對當(dāng)前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。它是24位有符號數(shù),左移兩位后有符號擴(kuò)展為32位,表示的有效偏移為26位(前后32MB的地址空間)。如下所示:B Label; 程序無條件跳轉(zhuǎn)到標(biāo)號Label 處
3、執(zhí)行CMP R1, 0; 當(dāng)CPSR 寄存器中的Z 條件碼置位時, 程序跳轉(zhuǎn)到標(biāo)號Label 處執(zhí)行BEQ Label1 / 31(2) BL指令BL指令的格式為:BL 目標(biāo)地址BL是另一個跳轉(zhuǎn)指令,但跳轉(zhuǎn)之前,會在寄存器R14中保存PC的當(dāng)前內(nèi)容,因此,可以通過將R14的內(nèi)容重新加載到PC中,來返回到跳轉(zhuǎn)指令之后的那個指令處執(zhí)行。該指令是實現(xiàn)子程序調(diào)用的一個基本但常用的手段,如下所示:BL Label; 當(dāng)程序無條件跳轉(zhuǎn)到標(biāo)號Label 處執(zhí)行時, 同時將當(dāng)前的PC 值保存到R14 中(3) BLX指令BLX指令的格式為:BLX 目標(biāo)地址BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,
4、并將處理器的工作狀態(tài)有ARM狀態(tài)切換到Thumb狀態(tài),該指令同時將PC的當(dāng)前內(nèi)容保存到寄存器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時,可以通過BLX指令實現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時,子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。(4) BX指令BX指令的格式為:BX 目標(biāo)地址BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。2.14.2 數(shù)據(jù)處理指令數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較指令等。數(shù)據(jù)傳送指令用于在寄存器和存儲器之間進(jìn)行數(shù)據(jù)的雙向傳輸。算術(shù)邏輯運(yùn)算指令完成常用
5、的算術(shù)與邏輯的運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時更新CPSR中的相應(yīng)條件標(biāo)志位。比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。數(shù)據(jù)處理指令包括:l MOV 數(shù)據(jù)傳送指令。l MVN 數(shù)據(jù)取反傳送指令。l CMP 比較指令。l CMN 反值比較指令。l TST 位測試指令。l TEQ 相等測試指令。l ADD 加法指令。l ADC 帶進(jìn)位加法指令。l SUB 減法指令。l SBC 帶借位減法指令。l RSB 逆向減法指令。l RSC 帶借位的逆向減法指令。l AND 邏輯與指令。l ORR 邏輯或指令。l EOR 邏輯異或指令。l BIC 位清除指令。(1) MOV
6、指令MOV指令的格式為:MOVS 目的寄存器, 源操作數(shù)MOV指令可完成從另一個寄存器、被移位的寄存器或?qū)⒁粋€立即數(shù)加載到目的寄存器。其中S選項決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時指令不更新CPSR中條件標(biāo)志位的值。指令示例如下:MOV R1, R0; 將寄存器R0 的值傳送到寄存器R1MOV PC, R14; 將寄存器R14 的值傳送到PC, 常用于子程序返回MOV R1, R0, LSL3; 將寄存器R0 的值左移3 位后傳送到R1(2) MVN指令MVN指令的格式為:MVNS 目的寄存器, 源操作數(shù)MVN指令可完成從另一個寄存器、被移位的寄存器或?qū)⒁粋€立即數(shù)加載到目
7、的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S 定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時指令不更新CPSR中條件標(biāo)志位的值。指令示例如下:MVN R0, 0; 將立即數(shù)0 取反傳送到寄存器R0 中, 完成后R0=-1(3) CMP 指令CMP指令的格式為:CMP 操作數(shù)1, 操作數(shù)2CMP指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,同時更新CPSR中條件標(biāo)志位的值。該指令進(jìn)行一次減法運(yùn)算,但不存儲結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2 的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1大于操作數(shù)2
8、,則此后的有GT后綴的指令將可以執(zhí)行。指令示例如下:CMP R1, R0; 將寄存器R1 的值與寄存器R0 的值相減, 并根據(jù)結(jié)果設(shè)置CPSR 的標(biāo)志位CMP R1, 100; 將寄存器R1 的值與立即數(shù)100 相減, 并根據(jù)結(jié)果設(shè)置CPSR 的標(biāo)志位(4) CMN指令CMN指令的格式為:CMN 操作數(shù)1, 操作數(shù)2CMN指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)取反后進(jìn)行比較,同時更新CPSR中條件標(biāo)志位的值。該指令實際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標(biāo)志位。指令示例如下:CMN R1, R0; 將寄存器R1 的值與寄存器R0 的值相加, 并根據(jù)結(jié)果設(shè)置CPSR 的
9、標(biāo)志位CMN R1, 100; 將寄存器R1 的值與立即數(shù)100 相加, 并根據(jù)結(jié)果設(shè)置CPSR 的標(biāo)志位(5) TST指令TST指令的格式為:TST 操作數(shù)1, 操作數(shù)2TST指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的與運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測試的數(shù)據(jù),而操作數(shù)2是一個位掩碼,該指令一般用來檢測是否設(shè)置了特定的位。指令示例如下:TST R1, %1; 用于測試在寄存器R1 中是否設(shè)置了最低位(%表示二進(jìn)制數(shù))TST R1, 0xffe; 將寄存器R1 的值與立即數(shù)0xffe 按位與, 并根據(jù)結(jié)果設(shè)置CPSR 的標(biāo)志位(6) TEQ
10、指令TEQ指令的格式為:TEQ 操作數(shù)1, 操作數(shù)2TEQ指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的異或運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR 中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。指令示例如下:TEQ R1, R2; 將寄存器R1 的值與寄存器R2 的值按位異或, 并根據(jù)結(jié)果設(shè)置CPSR 的標(biāo)志位(7) ADD指令A(yù)DD指令的格式為:ADDS 目的寄存器, 操作數(shù)1, 操作數(shù)2ADD指令用于把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。指令示例如下:ADD R0, R1,
11、 R2; R0 = R1 + R2ADD R0, R1, #256; R0 = R1 + 256ADD R0, R2, R3, LSL#1; R0 = R2 + (R3 1)(8) ADC指令A(yù)DC指令的格式為:ADCS 目的寄存器, 操作數(shù)1, 操作數(shù)2ADC指令用于把兩個操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個進(jìn)位標(biāo)志位,這樣就可以做比32位大的數(shù)的加法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。以下指令序列完成兩個128位數(shù)的加法,第一個數(shù)由高到低存放在寄存器R7R4
12、,第二個數(shù)由高到低存放在寄存器R11R8,運(yùn)算結(jié)果由高到低存放在寄存器R3R0:ADDS R0, R4, R8; 加低端的字ADCS R1, R5, R9; 加第二個字, 帶進(jìn)位ADCS R2, R6, R10; 加第三個字, 帶進(jìn)位ADC R3, R7, R11; 加第四個字, 帶進(jìn)位(9) SUB指令SUB指令的格式為:SUBS 目的寄存器, 操作數(shù)1, 操作數(shù)2SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運(yùn)算。指令示例如下:SUB R0, R1, R2
13、; R0 = R1 - R2SUB R0, R1, #256; R0 = R1 - 256SUB R0, R2, R3, LSL#1; R0 = R2 - (R3 1)(10) SBC指令SBC指令的格式為:SBCS 目的寄存器, 操作數(shù)1, 操作數(shù)2SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去 CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。該指令可用于有符號數(shù)或無符號數(shù)的減法 運(yùn)算。指令示例如下:SUB
14、S R0, R1, R2; R0 = R1 - R2 - !C, 并根據(jù)結(jié)果設(shè)置CPSR 的進(jìn)位標(biāo)志位(11) RSB指令RSB指令的格式為:RSBS 目的寄存器, 操作數(shù)1, 操作數(shù)2RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運(yùn)算。指令示例如下:RSB R0, R1, R2; R0 = R2 R1RSB R0, R1, #256; R0 = 256 R1RSB R0, R2, R3, LSL#1; R0 = (R3 1) - R2(12
15、) RSC指令RSC指令的格式為:RSCS 目的寄存器, 操作數(shù)1, 操作數(shù)2RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去 CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。該指令可用于有符號數(shù)或無符號數(shù)的減法 運(yùn)算。指令示例如下:RSC R0, R1, R2; R0 = R2 R1 - !C(13) AND指令A(yù)ND指令的格式為:ANDS 目的寄存器, 操作數(shù)1, 操作數(shù)2AND指令用于在兩個操作數(shù)上進(jìn)行邏
16、輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。指令示例如下:AND R0, R0, 3; 該指令保持R0 的0、1 位, 其余位清零(14) ORR指令ORR指令的格式為:ORRS 目的寄存器, 操作數(shù)1, 操作數(shù)2ORR指令用于在兩個操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。指令示例如下:ORR R0, R0, 3; 該指令設(shè)置R0 的0、1 位, 其余位保持不變(
17、15) EOR指令EOR指令的格式為:EORS 目的寄存器, 操作數(shù)1, 操作數(shù)2EOR指令用于在兩個操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。指令示例如下:EOR R0, R0, 3; 該指令反轉(zhuǎn)R0 的0、1 位, 其余位保持不變(16) BIC指令BIC指令的格式為:BICS 目的寄存器, 操作數(shù)1, 操作數(shù)2BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。操作數(shù)2為3
18、2位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不變。指令示例如下:BIC R0, R0, %1011; 該指令清除 R0 中的位 0、1、和 3, 其余的位保持不變2.14.3 乘法指令與乘加指令A(yù)RM微處理器支持的乘法指令與乘加指令共有6條,可分為運(yùn)算結(jié)果為32位和運(yùn)算結(jié)果為64位兩類,與前面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器必須為通用寄存器,不能對操作數(shù)使用立即數(shù)或被移位的寄存器,同時,目的寄存器和操作數(shù)1必須是不同的寄存器。乘法指令與乘加指令共有以下6條:l MUL 32位乘法指令。l MLA 32位乘加指令。l SMULL 64位有符號數(shù)乘法指令
19、。l SMLAL 64位有符號數(shù)乘加指令。l UMULL 64位無符號數(shù)乘法指令。l UMLAL 64位無符號數(shù)乘加指令。(1) MUL指令MUL指令的格式為:MULS 目的寄存器, 操作數(shù)1, 操作數(shù)2MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果放置到目的寄存器中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。指令示例如下:MUL R0, R1, R2; R0 = R1 R2MULS R0, R1, R2; R0 = R1 R2, 同時設(shè)置CPSR 中的相關(guān)條件標(biāo)志位(2) MLA指令MLA指令的格式為:MLAS 目的寄
20、存器, 操作數(shù)1, 操作數(shù)2, 操作數(shù)3MLA指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,再將乘積加上操作數(shù)3,并把結(jié)果放置到目的寄存器中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)或無符號數(shù)。指令示例如下:MLA R0, R1, R2, R3; R0 = R1 R2 + R3MLAS R0, R1, R2, R3; R0 = R1 R2 + R3, 同時設(shè)置CPSR 中的相關(guān)條件標(biāo)志位(3) SMULL指令SMULL指令的格式為:SMULLS 目的寄存器Low, 目的寄存器低High, 操作數(shù)1, 操作數(shù)2SMULL指令完成將操作數(shù)1與操作數(shù)
21、2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。指令示例如下:SMULL R0, R1, R2, R3; R0 = (R2 R3)的低32 位, R1 = (R2 R3)的高32 位(4) SMLAL指令SMLAL指令的格式為:SMLALS 目的寄存器Low, 目的寄存器低High, 操作數(shù)1, 操作數(shù)2SMLAL 指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同
22、目的寄存器 High中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號數(shù)。對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32 位,指令執(zhí)行后存放結(jié)果的高32位。指令示例如下:SMLAL R0, R1, R2, R3; R0 = (R2 R3)的低32 位 R0; R1 = (R2 R3)的高32 位 R1(5) UMULL指令UMULL指令的格式為:UMULLS 目的寄存器Low, 目的寄存器低High, 操作數(shù)
23、1, 操作數(shù)2UMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High 中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號數(shù)。指令示例如下:UMULL R0, R1, R2, R3; R0 = (R2 R3)的低32 位, R1 = (R2 R3)的高32 位(6) UMLAL指令UMLAL指令的格式為:UMLALS 目的寄存器Low, 目的寄存器低High, 操作數(shù)1, 操作數(shù)2UMLAL 指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的
24、值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器 High中的值相加后又放置到目的寄存器High中,同時可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號數(shù)。對于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。對于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。指令示例如下:UMLAL R0, R1, R2, R3; R0 = (R2 R3)的低32 位 R0; R1 = (R2 R3)的高32 位 R12.14.4 程序狀態(tài)寄存器訪問指令A(yù)RM微處理器支持程序狀
25、態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:l MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令。l MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令。(1) MRS指令MRS指令的格式為:MRS條件 通用寄存器, 程序狀態(tài)寄存器(CPSR 或SPSR)MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下兩種情況。 當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時,可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。 當(dāng)在異常處理或進(jìn)程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然
26、后保存。指令示例如下:MRS R0, CPSR; 傳送CPSR 的內(nèi)容到R0MRS R0, SPSR; 傳送SPSR 的內(nèi)容到R0(2) MSR指令MSR指令的格式為:MSR程序狀態(tài)寄存器(CPSR 或SPSR)_, 操作數(shù)MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。用于設(shè)置程序狀態(tài)寄存器中需要操作的位,32位的程序狀態(tài)寄存器可分為4個域:l 位31:24為條件標(biāo)志位域,用f 表示。l 位23:16為狀態(tài)位域,用s 表示。l 位15:8為擴(kuò)展位域,用x 表示。l 位7:0為控制位域,用c 表示。該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,
27、在使用時,一般要在MSR指令中指明將要操作的域。指令示例如下:MSR CPSR, R0; 傳送R0 的內(nèi)容到CPSRMSR SPSR, R0; 傳送R0 的內(nèi)容到SPSRMSR CPSR_c, R0; 傳送R0 的內(nèi)容到SPSR, 但僅僅修改CPSR 中的控制位域2.14.5 加載/存儲指令A(yù)RM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數(shù)據(jù),加載指令用于將存儲器中的數(shù)據(jù)傳送到寄存器,存儲指令則完成相反的操作。常用的加載存儲指令如下:l LDR 字?jǐn)?shù)據(jù)加載指令。l LDRB 字節(jié)數(shù)據(jù)加載指令。l LDRH 半字?jǐn)?shù)據(jù)加載指令。l STR 字?jǐn)?shù)據(jù)存儲指令。l STRB 字節(jié)數(shù)據(jù)存儲指令
28、。l STRH 半字?jǐn)?shù)據(jù)存儲指令。(1) LDR指令LDR指令的格式為:LDR目的寄存器, LDR指令用于從存儲器中將一個32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲器中讀取32位的字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。該指令在程序設(shè)計中比較常用,且尋址方式靈活多樣,請讀者認(rèn)真掌握。指令示例如下:LDR R0, R1; 將存儲器地址為R1 的字?jǐn)?shù)據(jù)讀入寄存器R0LDR R0, R1, R2; 將存儲器地址為R1+R2 的字?jǐn)?shù)據(jù)讀入寄存器R0LDR R0, R1, 8; 將存儲器地
29、址為R1+8 的字?jǐn)?shù)據(jù)讀入寄存器R0LDR R0, R1, R2 !; 將存儲器地址為R1+R2 的字?jǐn)?shù)據(jù)讀入寄存器R0, 并將新地址R1R2 寫入R1LDR R0, R1, 8 !; 將存儲器地址為R1+8 的字?jǐn)?shù)據(jù)讀入寄存器R0, 并將新地址R18 寫入R1LDR R0, R1, R2; 將存儲器地址為R1 的字?jǐn)?shù)據(jù)讀入寄存器R0, 并將新地址R1R2 寫入R1LDR R0, R1, R2, LSL2!; 將存儲器地址為R1R24 的字?jǐn)?shù)據(jù)讀入寄存器R0, 并將新地址R1R24 寫入R1LDR R0, R1, R2, LSL2; 將存儲器地址為R1 的字?jǐn)?shù)據(jù)讀入寄存器R0, 并將新地址R1
30、R24 寫入R1(2) LDRB指令LDRB指令的格式為:LDRB目的寄存器, LDRB指令用于從存儲器中將一個8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高24位清零。該指令通常用于從存儲器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。指令示例如下:LDRB R0, R1; 將存儲器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0, 并將R0的高24位清零LDRB R0, R1, 8; 將存儲器地址為R18 的字節(jié)數(shù)據(jù)讀入寄存器R0, 并將R0的高24位清零(3) LDRH指令LDRH指令的
31、格式為:LDRH 目的寄存器, LDRH指令用于從存儲器中將一個16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將寄存器的高16位清零。該指令通常用于從存儲器中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。當(dāng)程序計數(shù)器PC作為目的寄存器時,指令從存儲器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。指令示例如下:LDRH R0, R1; 將存儲器地址為R1 的半字?jǐn)?shù)據(jù)讀入寄存器R0, 并將R0 的高16 位清零LDRH R0, R1, 8; 將存儲器地址為R18 的半字?jǐn)?shù)據(jù)讀入寄存器R0, 并將R0 的高16 位清零LDRH R0, R1, R2; 將存儲器地址為R1R2 的半字?jǐn)?shù)據(jù)
32、讀入寄存器R0, 并將R0 的高16 位清零(4) STR指令STR指令的格式為:STR源寄存器, STR指令用于從源寄存器中將一個32位的字?jǐn)?shù)據(jù)傳送到存儲器中。該指令在程序設(shè)計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。指令示例如下:STR R0, R1, 8; 將R0 中的字?jǐn)?shù)據(jù)寫入以R1 為地址的存儲器中, 并將新地址R18 寫入R1STR R0, R1, 8; 將R0 中的字?jǐn)?shù)據(jù)寫入以R18 為地址的存儲器中(5) STRB指令STRB指令的格式為:STRB 源寄存器, STRB指令用于從源寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。指令示
33、例如下:STRB R0, R1; 將寄存器R0 中的字節(jié)數(shù)據(jù)寫入以R1 為地址的存儲器中STRB R0, R1, 8; 將寄存器R0 中的字節(jié)數(shù)據(jù)寫入以R18 為地址的存儲器中(6) STRH指令STRH指令的格式為:STRH 源寄存器, STRH指令用于從源寄存器中將一個16位的半字?jǐn)?shù)據(jù)傳送到存儲器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。指令示例如下:STRH R0, R1; 將寄存器R0 中的半字?jǐn)?shù)據(jù)寫入以R1 為地址的存儲器中STRH R0, R1, 8; 將寄存器R0 中的半字?jǐn)?shù)據(jù)寫入以R18 為地址的存儲器中2.14.6 批量數(shù)據(jù)加載/存儲指令A(yù)RM微處理器所支持批量數(shù)據(jù)加載/存儲指令
34、可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令則完成相反的操作。常用的加載存儲指令如下。l LDM 批量數(shù)據(jù)加載指令。l STM 批量數(shù)據(jù)存儲指令。LDM(或STM)指令的格式為:LDM(或STM)類型 基址寄存器!, 寄存器列表LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送數(shù)據(jù),該指令的常見用途是將多個寄存器的內(nèi)容入棧或出棧。其中,類型為以下幾種情況:l IA 每次傳送后地址加1。l IB 每次傳送前地址加1。l DA 每次傳送后地址減1。l DB 每次
35、傳送前地址減1。l FD 滿遞減堆棧。l ED 空遞減堆棧。l FA 滿遞增堆棧。l EA 空遞增堆棧。!為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。基址寄存器不允許為R15,寄存器列表可以為R0R15 的任意組合。為可選后綴,當(dāng)指令為LDM 且寄存器列表中包含R15,選用該后綴時表示除了正常的數(shù)據(jù)傳送之外,還將SPSR 復(fù)制到CPSR。同時,該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。指令示例如下:STMFD R13!, R0, R4-R12, LR; 將寄存器列表中的寄存器(R0, R4 到R12, L
36、R)存入堆棧LDMFD R13!, R0, R4-R12, PC; 將堆棧內(nèi)容恢復(fù)到寄存器(R0, R4 到R12, LR)2.14.7 數(shù)據(jù)交換指令A(yù)RM微處理器所支持?jǐn)?shù)據(jù)交換指令能在存儲器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令有如下兩條:l SWP 字?jǐn)?shù)據(jù)交換指令。l SWPB 字節(jié)數(shù)據(jù)交換指令。(1) SWP指令SWP指令的格式為:SWP目的寄存器, 源寄存器1, 源寄存器2SWP指令用于將源寄存器2所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。指令示例如
37、下:SWP R0, R1, R2; 將R2 所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到R0, 同時將R1 中的字?jǐn)?shù)據(jù); 傳送到R2 所指向的存儲單元SWP R0, R0, R1; 該指令完成將R1 所指向的存儲器中的字?jǐn)?shù)據(jù)與R0 中的字?jǐn)?shù)據(jù)交換(2) SWPB指令SWPB指令的格式為:SWP條件B 目的寄存器, 源寄存器1, 源寄存器2SWPB指令用于將源寄存器2所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。指令示例如下:SWPB R0, R
38、1, R2; 將R2 所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到R0, R0 的高24 位清零,; 同時將R1 中的低8 位數(shù)據(jù)傳送到R2 所指向的存儲單元SWPB R0, R0, R1; 該指令完成將R1 所指向的存儲器中的字節(jié)數(shù)據(jù)與R0 中的低8 位數(shù)據(jù)交換2.14.8 移位指令(操作)ARM微處理器內(nèi)嵌的桶型移位器(Barrel Shifter),支持?jǐn)?shù)據(jù)的各種移位操作,移位操作在ARM指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中是一個字段,在匯編語言中表示為指令中的選項。例如,數(shù)據(jù)處理指令的第二個操作數(shù)為寄存器時,就可以加入移位操作選項對它進(jìn)行各種移位操作。移位操作包括如下6種類型,ASL
39、和LSL是等價的,可以自由互換:l LSL 邏輯左移。l ASL 算術(shù)左移。l LSR 邏輯右移。l ASR 算術(shù)右移。l ROR 循環(huán)右移。l RRX 帶擴(kuò)展的循環(huán)右移。(1) LSL(或ASL)操作LSL(或ASL)操作的格式為:通用寄存器, LSL(或ASL) 操作數(shù)LSL(或ASL)可完成對通用寄存器中的內(nèi)容進(jìn)行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例如下:MOV R0, R1, LSL#2; 將R1 中的內(nèi)容左移兩位后傳送到R0 中(2) LSR操作LSR操作的格式為:通用寄存器, LSR
40、 操作數(shù)LSR可完成對通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例如下:MOV R0, R1, LSR#2; 將R1 中的內(nèi)容右移兩位后傳送到R0 中, 左端用零來填充(3) ASR操作ASR操作的格式為:通用寄存器, ASR 操作數(shù)ASR可完成對通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位的值來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例如下:MOV R0, R1, ASR#2; 將R1 中的內(nèi)容右移兩位后傳送到R0 中, 左端用第3
41、1 位的值來填充(4) ROR操作ROR操作的格式為:通用寄存器, ROR操作數(shù)ROR可完成對通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即 數(shù)(031)。顯然,當(dāng)進(jìn)行32位的循環(huán)右移操作時,通用寄存器中的值不改變。操作示例如下:MOV R0, R1, ROR#2; 將R1 中的內(nèi)容循環(huán)右移兩位后傳送到R0 中(5) RRX操作RRX操作的格式為:通用寄存器, RRX 操作數(shù)RRX可完成對通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進(jìn)位標(biāo)志位C 來填充。其中,
42、操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例如下:MOV R0, R1, RRX#2; 將R1 中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移兩位后傳送到R0 中2.14.9 協(xié)處理器指令A(yù)RM微處理器可支持多達(dá)16個協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過程中,每個協(xié)處理器只執(zhí)行針對自身的協(xié)處理指令,忽略ARM處理器和其他協(xié)處理器的 指令。ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器與協(xié)處理器的寄存器之間傳送數(shù)據(jù)和在ARM協(xié)處理器的寄存器與存儲器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括以下5條:l CDP 協(xié)處理器數(shù)操作指令。l LDC 協(xié)處理器數(shù)據(jù)加載指令。l STC 協(xié)處理器數(shù)據(jù)存儲指令。l MCR ARM 處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令。l MRC 協(xié)處理器寄存器到ARM 處理器寄存器的數(shù)據(jù)傳送指令。(1) CDP指令CDP指令的格式為:CDP協(xié)處理器編碼, 協(xié)處理器操作碼1, 目的寄存器, 源寄存器1, 源寄存器2, 協(xié)處理器操作碼2CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學(xué)年樂業(yè)縣三上數(shù)學(xué)期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 2025-2026學(xué)年江蘇省淮安市淮陰師范學(xué)院第一附屬小學(xué)數(shù)學(xué)三年級第一學(xué)期期末復(fù)習(xí)檢測試題含解析
- 2024年興隆臺區(qū)三上數(shù)學(xué)期末綜合測試模擬試題含解析
- 2024年烏恰縣三上數(shù)學(xué)期末聯(lián)考模擬試題含解析
- 2024年麗江地區(qū)古城區(qū)數(shù)學(xué)三年級第一學(xué)期期末質(zhì)量檢測試題含解析
- 2024年濟(jì)寧市曲阜市數(shù)學(xué)三上期末預(yù)測試題含解析
- 公共營養(yǎng)師二級資格考試-膳食調(diào)查和評價試題大全課件
- 2025年執(zhí)業(yè)藥師考試學(xué)科交叉知識點(diǎn)試題及答案
- 2025年經(jīng)濟(jì)法新變化試題及答案揭曉
- 護(hù)理實習(xí)感想試題及答案總結(jié)
- T-ZAWS 004-2024 金屬非金屬露天礦山安全現(xiàn)狀評價報告編制導(dǎo)則
- 面神經(jīng)麻痹課件
- 2025專業(yè)技術(shù)人員繼續(xù)教育考試題庫(含答案)
- 糧油倉儲管理員(三級)理論知識考試題及答案
- 【MOOC】中國稅法:案例·原理·方法-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 2024水電站輸水發(fā)電系統(tǒng)運(yùn)行安全評價導(dǎo)則
- 砍伐樹木的勞務(wù)合同范本
- 2024年食品安全知識考試題庫
- 2024年保密工作培訓(xùn)
- 短視頻內(nèi)容課件
- 品類創(chuàng)新學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
評論
0/150
提交評論