版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 三、三、ARM指令系統(tǒng)指令系統(tǒng) F 尋址方式尋址方式 F ARMARM指令集指令集 ( (重點重點) ) F ARM ARM偽指令偽指令 F ThumbThumb指令集指令集 (ARM(ARM指令集的功能子集指令集的功能子集) ) 2 尋址方式尋址方式 F立即尋址立即尋址 MOV R0,#20;20 R0 F寄存器尋址寄存器尋址 MOV R0,R1;(R1)R0 F寄存器移位尋址寄存器移位尋址 F寄存器間接尋址寄存器間接尋址 LDR R0,R3;(R3)R0 F基址加偏址尋址基址加偏址尋址 LDR R0,R1,#4! ( (R1)+4) )R0 ;(R1)+4R1 前變址偏移尋址前變址偏移
2、尋址 LDR R0,R1,#4 ; (R1)R0 ,(R1) +4R1 后變址偏移尋址后變址偏移尋址 F堆棧尋址堆棧尋址 LDM/STM FD、ED、FA、EA F多寄存器尋址多寄存器尋址 LDM/STM IA、IB、DA、DB F相對尋址相對尋址 B rel ;(pc)+rel pc 3 LDMLDMIAIA R1,R0,R2,R5 R1,R0,R2,R5 ;R0;R0 R1 R1 ;R2 R1+4 ;R2 R1+4 ;R5 R1+8 ;R5 R1+8 LDMLDMIBIB R1,R0,R2,R5 R1,R0,R2,R5 ;R0;R0 R1+4 R1+4 ;R2 R1+8 ;R2 R1+8
3、;R5 R1+12 ;R5 R1+12 LDMLDMDADA R1,R0,R2,R5 R1,R0,R2,R5 ;R5;R5 R1 R1 ;R2 R1-4 ;R2 R1-4 ;R0 R1-8 ;R0 R1-8 LDMLDMDBDB R1,R0,R2,R5 R1,R0,R2,R5 ;R5;R5 R1-4 R1-4 ;R2 R1-8 ;R2 R1-8 ;R0 R1-12 ;R0 R1-12 4 ARM存儲器訪問指令多寄存器存取 數(shù)據(jù)塊傳送指令操作 過程如右圖所示,其 中R1為指令執(zhí)行前的 基址寄存器,R1則 為指令執(zhí)行后的基址 寄存器。 R5 R6 R7 R1 R1 指令STMIA R1!,R5-R
4、7 4008H 4004H 4000H 4014H 4010H 400CH R5 R6 R7R1 R1 指令STMDA R1!,R5-R7 4008H 4004H 4000H 4014H 4010H 400CH R5 R6 R7 R1 R1 指令STMIB R1!,R5-R7 4008H 4004H 4000H 4014H 4010H 400CH R5 R6 R7 R1 R1 指令STMDB R1!,R5-R7 4008H 4004H 4000H 4014H 4010H 400CH EAFA EDFD 5 棧頂SP 棧頂SP 棧底 空堆棧 棧底 滿堆棧 0 x12345678 0 x12345
5、678棧頂SP0 x12345678 棧頂SP 壓棧壓棧 F堆棧尋址堆棧尋址 LDM/STM FD、ED、FA、EA 6 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧壓棧 堆棧壓棧 FLDM:出棧出棧 /STM:壓棧壓棧 FD、ED、FA、EA 7 8 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧壓棧 堆棧壓棧 STMFA:滿遞增滿遞增(入棧入棧) STMIB: STMFD:滿遞減滿遞減(入棧入棧) STMD
6、B 0 x12345678 0 x12345678 Rn Rn 棧頂SP 棧頂SP 9 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧壓棧 堆棧壓棧 STMEA:空遞增空遞增(入棧入棧) STMIA STMED:空遞減空遞減(入棧入棧) STMDA 0 x12345678 0 x12345678 Rn Rn 棧頂SP 棧頂SP 10 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧出棧 堆棧出棧 LDMFA: 滿遞
7、增滿遞增(出棧出棧) LDMDA LDMFD :滿遞減滿遞減(出棧出棧) LDMIA 0 x12345678 0 x12345678 Rn Rn 棧頂SP 棧頂SP 11 棧底 棧頂 棧區(qū) SP 堆棧存 儲區(qū) 棧頂 棧底 棧區(qū) SP 向下 增長 向上 增長 0 x12345678 0 x12345678 堆棧出棧 堆棧出棧 LDMED: 空遞減空遞減(出棧出棧) LDMIB LDMEA :空遞增空遞增(出棧出棧) LDMDB 0 x12345678 0 x12345678 Rn Rn 棧頂SP 棧頂SP 12 數(shù)據(jù)塊傳送 存儲 堆棧操作 壓棧 說明 數(shù)據(jù)塊傳送 加載 堆棧操作 出棧 說明 ST
8、MDASTMED空遞減LDMDALDMFA滿遞減 STMIASTMEA空遞增LDMIALDMFD滿遞增 STMDBSTMFD滿遞減LDMDBLDMEA空遞減 STMIBSTMFA滿遞增LDMIBLDMED空遞增 ;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作 STMDAR0!,R5-R6 壓棧 . . . LDMIBR0!,R5-R6 出棧 ;使用堆棧指令進(jìn)行堆棧操作 STMEDR0!,R5-R6 . . . LDMEDR0!,R5-R6 兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操 作編程很簡單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和 出棧操作則需要考慮空與滿、加與減對應(yīng)的問題需要考
9、慮空與滿、加與減對應(yīng)的問題。 堆棧操作和數(shù)據(jù)塊傳送 向向 下下 生生 長長 空空 堆堆 棧棧 13 應(yīng)用示例: S3C44B0 部分啟動代碼 Vectors b ResetHandler;/* for debug b HandlerUndef;/* handlerUndef b HandlerSWI ;/* SWI interrupt handler*/ b HandlerPabort ;/* handlerPAbort */ b HandlerDabort ;/* handlerDAbort */ b . ;/* handlerReserved */ ldr pc, =HandlerIRQ
10、b HandlerFIQ HandlerFIQ;HANDLER HandleFIQ sub sp, sp,#4 ;reserved for PC stmfd sp!,r8-r9 ;STMDB ldr r8, =HandleFIQ; _ISR_STARTADDRESS ldr r9, r8 str r9,sp,#8 ldmfd sp!,r8-r9,pc ;LDMIA 14 簡單的ARM程序 ;文件名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加 ;說明:使用ARMulate軟件仿真調(diào)試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識程序入口
11、CODE32 ;聲明32位ARM指令 START MOVR0,#0 ;設(shè)置參數(shù) MOVR1,#10 LOOPBLADD_SUB ;調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)到LOOP ADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結(jié)束 使用“;”進(jìn)行注釋 標(biāo)號頂格寫 實際代碼段 聲明文件結(jié)束 15 3.3 ARM指令系統(tǒng)介紹 16 存儲器尋址存儲器尋址 芯片復(fù)位后用戶看見的地址空間 128KB Flash(LPC2114/2212) 256KB Flash(LPC2124/2214) 16KB SRAM 8KB BootB
12、lock 2MB VPB 外設(shè) 2MB AHB 外設(shè) 0 x00000000 0 xFFFFFFFF 保留給片內(nèi)存儲器使用 保留給片內(nèi)存儲器使用 保留給外部儲器使用 0 x40000000 0 xE0000000 0 x80000000 0 xF0000000 0 x00020000 地址空間 ARM7處理器是典型的RISC處理器,對存儲器的訪問只能使用加 載和存儲指令實現(xiàn)。ARM7處理器是馮諾依曼存儲結(jié)構(gòu),程序空 間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對 外圍IO、程序數(shù)據(jù)的訪問均要通過加載加載/存儲指令存儲指令進(jìn)行。 17 (一)存儲器訪問指令(Load/Store)
13、 1、單字和無符號字節(jié)Load/Store指令 2、半字和有符號字節(jié)Load/Store指令 3、雙字Load/Store指令 4、多寄存器Load/Store指令 5、內(nèi)存與寄存器交換指令 18 (一)存儲器訪問(Load/Store)指令 1.單字和無符號字節(jié)Load/Store指令 功能:提供ARM寄存器和內(nèi)存之間單字節(jié) (8位)或單字(32位)位)數(shù)據(jù)的傳送。 LDR/STR 的功能 3.3 ARM指令系統(tǒng)介紹 19 LDR和STR字和無符號字節(jié)加載/存儲指令編碼 指令執(zhí)行的條件碼 I為0時,偏移量為12 位立即數(shù),為1時, 偏移量為寄存器移 位 P表示前/后變址 U表示加/減 B為1
14、表示字節(jié)訪問, 為0表示字訪問 W表示回寫 為指令的尋址方式 Rd為源/目標(biāo)寄存器 Rn為基址寄存器 L用于區(qū)別加載(L為1) 或存儲(L為0) 20 字節(jié)碼結(jié)構(gòu) (一)存儲器訪問(Load/Store)指令 STRB R0,R3,-R8,ASR#2 ;R0 (R3-R8/4), 21 指令格式: (1)零偏移 LDR/STR條件碼BT Rd,Rn ;(Rn) Rd 功能:將功能:將Rn的內(nèi)容作為傳送數(shù)據(jù)的地址。的內(nèi)容作為傳送數(shù)據(jù)的地址。 B: 可選后綴,若有 B,則傳送Rd的最低有效字節(jié)。 若操作碼是LDR,則將Rd的其它字節(jié)清零。(加 載無符字節(jié)數(shù)據(jù),零擴(kuò)展到32位) 1.單字和無符號字節(jié)
15、Load/Store指令 (一)存儲器訪問(Load/Store)指令 22 (1)零偏移)零偏移 Rd:ARM寄存器 Rn:存儲器的基址寄存器,若指令是帶寫回的前 變址 (加后綴“!”)或后變址。 (一)存儲器訪問(Load/Store)指令 23 (2)前變址 LDR/STRB Rd,Rn,! ;(Rn)+offset) Rd; ;有“!”,則(Rn)+offset Rn ;無“!”,Rn不變 (一)存儲器訪問(Load/Store)指令 24 (2)前變址 在數(shù)據(jù)傳送之前,將偏移量加到Rn中,其 結(jié)果作為傳送數(shù)據(jù)的存儲器地址。若使用后綴使用后綴 “!”,則結(jié)果寫回到,則結(jié)果寫回到Rn中。
16、中。Rn不允許是不允許是R15。 其中 offsetRn上的偏移量。 ?。嚎蛇x后綴,若有“!”,則將結(jié)果地址寫回 到Rn,若若Rn是是R15,則不能夠用后綴,則不能夠用后綴 “!”。 LDR Rd,Rn,#offset! ( (Rn)+offset) )Rd ;(Rn)+offsetRd (一)存儲器訪問(Load/Store)指令 25 (3)程序相對偏移 LDR/STR條件碼 Rd,Label;(Label) Rd Label:程序相對偏移表達(dá)式,必須在當(dāng)前指 令的4kB范圍內(nèi)。 LDR Rd,Label 等價為: LDR Rd,R15,Label -pc ( (R15)+Label-pc
17、) )Rd (一)存儲器訪問(Load/Store)指令 匯編器由匯編器由pc計算偏移量,并將計算偏移量,并將pc作為作為Rn生成前變址指令。不生成前變址指令。不 能使用后綴能使用后綴“!”。 26 (4)后變址 LDR/STRBT Rd,Rn, 將Rn的值用作傳送數(shù)據(jù)的存儲器地址,數(shù)據(jù)傳送 后,偏移量加到Rn中,結(jié)果寫回到Rn。 Rn不允許是R15。 LDR Rd,Rn,offset ;(Rn) Rd,(Rn)+offset Rn (一)存儲器訪問(Load/Store)指令 27 例例1:將:將R0中的內(nèi)容存放到外設(shè)中中的內(nèi)容存放到外設(shè)中 LDR R1,UARTADD ;將UART地址放進(jìn)
18、R1中 STRB R0,R1 ;將數(shù)據(jù)放進(jìn)外設(shè)中 UARTADD 將R1的內(nèi)容與R0指向的存儲單元的內(nèi)容進(jìn)行交換 SWPBR1,R2,R0;將R0指向的存儲單元內(nèi)的容讀取一字節(jié)數(shù)據(jù)到R1中 ;(高24位清零),并將R2的內(nèi)容寫入到該內(nèi)存單元中 ;(最低字節(jié)有效) 49 格式: SWPB Rd,Rm,Rn ;(Rn) Rd,(Rm) (Rn) , nm,d ;如d=m,為交換: Rm (Rn) ,(Rm) (Rn) 其中 B 若有B,則交換字節(jié),否則交換32位字。 Rm 寄存器Rm的數(shù)據(jù)存儲到存儲器。Rm 可以與Rd相同,此 時,寄存器的內(nèi)容與存儲器的內(nèi)容進(jìn)行交換。 Rd 數(shù)據(jù)從存儲器讀取到寄存
19、器Rd 。 Rn 寄存器Rn的內(nèi)容為進(jìn)行數(shù)據(jù)交換的存儲器的地址,Rn必 須與Rd和Rm不同。 6、內(nèi)存和寄存器交換指令 (一)存儲器訪問(Load/Store)指令 50 (二)ARM數(shù)據(jù)處理指令 數(shù)據(jù)處理指令的特點: 1、所有的操作數(shù)要么來自寄存器,要么來自立即數(shù), 不會來自內(nèi)存。 2、如果有結(jié)果,則結(jié)果一定是32位寬(一個例外: 長乘法指令產(chǎn)生64位結(jié)果),并放在一個寄存器中, 不會寫入內(nèi)存。 3、每一個操作數(shù)寄存器和結(jié)果寄存器都在指令中獨 立指出,即:ARM指令采用3地址模式: Rd、Rn、Rm。 4、所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影 響狀態(tài)標(biāo)志。 51 功能: 完成數(shù)據(jù)在
20、寄存器中的運算,這些運算包括32 位數(shù)據(jù)的算術(shù)運算、邏輯運算、位操作以及飽 和運算處理,其中某一個操作數(shù)可以經(jīng)過移位 或循環(huán)運算得到。 1、數(shù)據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 52 ARM數(shù)據(jù)處理指令指令編碼 指令執(zhí)行的條件碼 I用于區(qū)別立即數(shù)(I 為1)和寄存器移位 (I為0) opcode數(shù)據(jù)處理指 令操作碼 第二操作數(shù) Rd目標(biāo)寄存器 Rn第一操作數(shù)寄存器 S設(shè)置條件碼,與指令 中的S位對應(yīng) 帶進(jìn)位加法ADC0101 帶進(jìn)位減法指令SBC0110 帶進(jìn)位逆向減法指令RSC0111 位測試指令TST1000 相等測試指令TEQ1001 比較指令CMP1010 負(fù)數(shù)比較指令CMN1011
21、 邏輯或操作指令ORR1100 數(shù)據(jù)傳送MOV1101 位清除指令BIC1110 數(shù)據(jù)非傳送MVN1111 加法運算指令A(yù)DD0100 逆向減法指令RSB0011 減法運算指令SUB0010 邏輯異或操作指令EOR0001 邏輯與操作指令A(yù)ND0000 說明指令助記符操作碼 opcode操作碼功能表 53 1、數(shù)據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 字節(jié)碼結(jié)構(gòu) 54 格式: S Rd,Rn,OPerand2 操作碼包括ADD、SUB、RSB、ADC、SBC、RSC 、 AND、ORR、EOR、BIC、MOV、MVN、CMP、 CMN、TST和TEQ指令。 其中: S 若選定若選定S,則根據(jù)操作
22、結(jié)果更新條件碼標(biāo)志,則根據(jù)操作結(jié)果更新條件碼標(biāo)志(N、Z、 C和V) Rd ARM結(jié)果寄存器 Rn 存儲第1操作數(shù)的ARM寄存器 Operand2 第2操作數(shù) 1、數(shù)據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 55 注注:(1)條件碼標(biāo)志)條件碼標(biāo)志 若指定S,那么ADD、SUB、RSB、ADC、SBC、 RSC指令會根據(jù)結(jié)果更新標(biāo)志N、Z、C和V。 減法(含比較)夠減時,C=1。 AND、ORR、EOR、BIC、MOV和MVN指令將: 根據(jù)結(jié)果更新標(biāo)志根據(jù)結(jié)果更新標(biāo)志N N和和Z Z; 在計算在計算Operand2Operand2時更新標(biāo)志時更新標(biāo)志C C; 不影響不影響V V標(biāo)志。標(biāo)志。 1、數(shù)
23、據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 CMP、CMN、TST和TEQ指令不需要S。 56 注:注: (2)R15的使用的使用 ADD、SUB、RSB、ADC、SBC、 RSC 、AND、ORR、EOR、BIC、MOV和 MVN指令以及CMP、CMN、TST和TEQ指令 若將R15作為Rn(操作數(shù))使用,那么使用 的值是當(dāng)前指令的地址加當(dāng)前指令的地址加8。 1、數(shù)據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 57 若選用S,則將當(dāng)前模式的SPSR拷貝到CPSR, 這樣可從異常返回。 SUBS PC,R14,#4 MOVS PC,R14 在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將 R15作為Rd或任何
24、操作數(shù)來使用。 1、數(shù)據(jù)運算指令 (二)ARM數(shù)據(jù)處理指令 58 2、第2操作數(shù) 大多數(shù)ARM數(shù)據(jù)處理指令都有一 個靈活的第2操作數(shù),在指令格式中由 “Operand2”表示。它有兩種格式: (二)ARM數(shù)據(jù)處理指令 59 (1)#immed_8r 常量表達(dá)式,常量必須對應(yīng)于8位位圖,該位圖在32位字 中,被循環(huán)移位偶數(shù)位(0,2,4,6,8, 26,28,30) 2、第2操作數(shù) (二)ARM數(shù)據(jù)處理指令 循環(huán)右移10位 0 x12 0 0 0 1 0 0 1 0 0 x00 0 0 0 0 0 0 0 0 0 x00 0 0 0 0 0 0 0 0 0 x00 0 0 0 0 0 0 0 0
25、 0 x00 0 0 0 0 0 0 0 0 0 x00 0 0 0 0 0 0 0 0 0 x80 1 0 0 0 0 0 0 0 0 x04 0 0 0 0 0 1 0 0 8位常數(shù) 0 x12 0 0 0 1 0 0 1 0 0 x05 0 0 1 0 1 合法常量:合法常量: 0XFF、0XFF000、0XF000000F。 非法常量:非法常量: 0X101、0XFF04、0XFF003、0XFFFFFFFF。 60 (2)Rm,shift Rm 存儲第2操作數(shù)的ARM寄存器,可用各種 方法對寄存器中的位圖進(jìn)行移位或循環(huán)移位。 移位結(jié)果作為第2操作數(shù),但Rm本身不變。 shift Rm
26、的移位方法,是下面之一: ASR n 算術(shù)右移n移位(1 n 32) LSL n 邏輯左移n移位(0 n 31) LSR n 邏輯右移n移位(1 n 32) ROR n 循環(huán)右移n位(0 n 31) RRX 帶進(jìn)位的循環(huán)右移1位 2、第2操作數(shù) (二)ARM數(shù)據(jù)處理指令 61 (2)Rm,shift 2、第2操作數(shù) (二)ARM數(shù)據(jù)處理指令 LSL移位操作: 0 LSR移位操作: 0 ASR移位操作: ROR移位操作: RRX移位操作: C 62 助記符說明操作條件碼位置 ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, o
27、perand2減法運算指令RdRn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, Rn, operand2 帶進(jìn)位逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 63 助記符說明操作條件碼位置 ADD
28、Rd, RnADD Rd, Rn, operand2, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, Rn, operand2 帶進(jìn)位
29、逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 加法運算指令A(yù)DD指令將operand2的值與Rn的值相加,結(jié)果保存 到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應(yīng)用示例: ADDS R1,R1,#1;R1=R1+1,并影響標(biāo)志位 ADD R1,R1,R2;R1=R1+R2 64 助記符說明操作條件碼位置 ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, RnSUB Rd, Rn, operand2, operand2減法運算指令Rd
30、Rn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, Rn, operand2 帶進(jìn)位逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 減法運算指令SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd
31、 中。指令格式如下: SUBcondS Rd,Rn,operand2 應(yīng)用示例: SUBSR0,R0,#1;R0=R0-1 ,并影響標(biāo)志位 SUBSR2,R1,R2;R2=R1-R2 ,并影響標(biāo)志位 65 助記符說明操作條件碼位置 ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondS RSB Rd, RnRSB Rd, Rn, operand2, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2
32、帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, Rn, operand2 帶進(jìn)位逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 逆向減法運算指令RSB指令將operand2的值減去Rn,結(jié)果保存到 Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應(yīng)用示例: RSB R3,R1,#0 xFF00;R3=0 xFF00-R1 RSBS R1,R2,R2
33、,LSL #2;R1=(R22)-R2=R23 66 助記符說明操作條件碼位置 ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, RnADC Rd, Rn, operand2, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2-
34、(NOT)Carry SBCcondS RSC Rd, Rn, operand2 帶進(jìn)位逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 帶進(jìn)位加法指令A(yù)DC將operand2的值與Rn的值相加,再加上 CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下: ADCcondS Rd,Rn,operand2 應(yīng)用示例(使用ADC實現(xiàn)64位加法,結(jié)果存于R1、R0中): ADDS R0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位 ADC R1,R1,R3;R1等于高32位相加,并加上低位進(jìn)位 67 助記符說明操作條件碼位
35、置 ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, RnSBC Rd, Rn, operand2, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, Rn, operan
36、d2 帶進(jìn)位逆向減法 指令 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 帶進(jìn)位減法指令SBC用寄存器Rn減去operand2,再減去CPSR中的 C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存到Rd中。指 令格式如下: (減法(含比較)夠減時,C=1) SBCcondS Rd,Rn,operand2 應(yīng)用示例(使用SBC實現(xiàn)64位減法,結(jié)果存于R1、R0中): SUBS R0,R0,R2 ; 低32位相減,并影響標(biāo)志位 SBC R1,R1,R3;高32位相減,并減去低位借位 68 助記符說明操作條件碼位置 ADD Rd, Rn,
37、 operand2加法運算指令RdRn+operand2ADDcondS SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondS RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondS ADC Rd, Rn, operand2帶進(jìn)位加法RdRn+operand2+CarryADCcondS SBC Rd, Rn, operand2帶進(jìn)位減法指令 RdRn-operand2- (NOT)Carry SBCcondS RSC Rd, RnRSC Rd, Rn, operand2, operand2 帶進(jìn)位逆向減法 指令
38、 Rdoperand2-Rn- (NOT)Carry RSCcondS ARM數(shù)據(jù)處理指令算術(shù)運算 帶進(jìn)位逆向減法指令RSC指令用寄存器operand2減去Rn,再減去 CPSR中的C條件標(biāo)志位的非,結(jié)果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 應(yīng)用示例(使用RSC指令實現(xiàn)求64位數(shù)值的負(fù)數(shù) ): RSBS R2,R0,#0 RSC R3,R1,#0 69 助記符說明操作條件碼位置 AND Rd, Rn, operand2邏輯與操作指令RdRn R0=R0R2=R1保留R0中的0位和1位,丟棄其余的位 71 助記符說明操作條件碼位置 AND Rd, Rn,
39、operand2邏輯與操作指令RdRn 將R0的低4位置1 (2) MOVR1,R2,LSR #24 ;使用ORR指令將R2的高8位 ORRR3,R1,R3,LSL #8;數(shù)據(jù)移入到R3低8位中 72 助記符說明操作條件碼位置 AND Rd, Rn, operand2邏輯與操作指令RdRn 將R1的低4位取反 EOR R2,R1,R0;R2=R1R0 EORSR0,R5,#0 x01; 將R5和0 x01進(jìn)行邏輯異或, ;結(jié)果保存到R0,并影響標(biāo)志位 73 助記符說明操作條件碼位置 AND Rd, Rn, operand2邏輯與操作指令RdRn 將R1的低4位清零,其它位不變 BICR1,R2
40、,R3;將R3的反碼和R2相邏輯“與”, ;結(jié)果保存到R1中 74 助記符說明操作條件碼位置 CMP Rn, operand2比較指令 標(biāo)志N、Z、C、VRn- operand2 CMPcond CMN Rn, operand2負(fù)數(shù)比較指令 標(biāo) 志 N 、 Z 、 C 、 VRn+operand2 CMNcond TST Rn, operand2位測試指令 標(biāo)志N、Z、C、VRn R1與10比較,設(shè)置相關(guān)標(biāo)志位 CMPR1,R2; R1與R2比較,設(shè)置相關(guān)標(biāo)志位 76 助記符說明操作條件碼位置 CMP RnCMP Rn, operand2, operand2比較指令 標(biāo)志N、Z、C、VRn-
41、operand2 CMPcond CMN Rn, operand2負(fù)數(shù)比較指令 標(biāo) 志 N 、 Z 、 C 、 VRn+operand2 CMNcond TST Rn, operand2位測試指令 標(biāo)志N、Z、C、VRn R0+1,判斷R0是否為1的補碼 ;如果是,則設(shè)置Z標(biāo)志位 78 助記符說明操作條件碼位置 CMP Rn, operand2比較指令 標(biāo)志N、Z、C、VRn- operand2 CMPcond CMN RnCMN Rn, operand2, operand2負(fù)數(shù)比較指令 標(biāo) 志 N 、 Z 、 C 、 VRn+operand2 CMNcond TST Rn, operand2
42、位測試指令 標(biāo)志N、Z、C、VRn 判斷R0的最低位是否為0 TSTR1,#0 x0F; 判斷R1的低4位是否為0 80 助記符說明操作條件碼位置 CMP Rn, operand2比較指令 標(biāo)志N、Z、C、VRn- operand2 CMPcond CMN Rn, operand2負(fù)數(shù)比較指令 標(biāo) 志 N 、 Z 、 C 、 VRn+operand2 CMNcond TST RnTST Rn, operand2, operand2位測試指令 標(biāo)志N、Z、C、VRn 比較R0與R1是否相等 (不影響V位和C位) 82 助記符說明操作條件碼位置 CMP Rn, operand2比較指令 標(biāo)志N、Z
43、、C、VRn- operand2 CMPcond CMN Rn, operand2負(fù)數(shù)比較指令 標(biāo) 志 N 、 Z 、 C 、 VRn+operand2 CMNcond TST Rn, operand2位測試指令 標(biāo)志N、Z、C、VRn R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,同時影響CPSR中的N位和Z位 87 助記符說明操作條件碼位置 MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondS MLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondS UMULL RdLo,Rd
44、Hi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondS UMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) UMLALcondS SMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondS SMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) SMLALcondS ARM指令乘法指令 32位乘加指令MLA指令將Rm和Rs中的值相乘,再將乘積加上第3 個操作數(shù),
45、結(jié)果的低32位保存到Rd中。指令格式如下: MLAcondS Rd,Rm,Rs,Rn 應(yīng)用示例: MLA R1,R2,R3,R0; R1=R2R3+R0 88 助記符說明操作條件碼位置 MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondS MLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondS UMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondS UMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令 (RdL
46、o,RdHi) Rm*Rs+(RdLo,RdHi) UMLALcondS SMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondS SMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) SMLALcondS ARM指令乘法指令 64位無符號乘法指令UMULL指令將Rm和Rs中的值作無符號數(shù)相 乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如 下: UMULLcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: UMULL R0,R1,R5
47、,R8; (R1、R0)=R5R8 89 助記符說明操作條件碼位置 MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondS MLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondS UMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondS UMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) UMLALcondS SMULL RdLo,RdHi,Rm,Rs6
48、4位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondS SMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) SMLALcondS ARM指令乘法指令 64位無符號乘加指令UMLAL指令將Rm和Rs中的值作無符號數(shù)相 乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32 位保存到RdHi中。指令格式如下: UMLALcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0) 90 助記符說明操作條件碼位置
49、MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondS MLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondS UMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondS UMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) UMLALcondS SMULL RdLo,RdHi,Rm,RsSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcon
50、dS SMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) SMLALcondS ARM指令乘法指令 64位有符號乘法指令SMULL指令將Rm和Rs中的值作有符號數(shù)相 乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如 下: SMULLcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: SMULLR2,R3,R7,R6; (R3、R2)=R7R6 91 助記符說明操作條件碼位置 MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondS MLA Rd,Rm,Rs,Rn32位
51、乘加指令RdRm*Rs+Rn (RdRm)MLAcondS UMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondS UMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,RdHi) UMLALcondS SMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondS SMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令 (RdLo,RdHi) Rm*Rs+(RdLo,R
52、dHi) SMLALcondS ARM指令乘法指令 64位有符號乘加指令SMLAL指令將Rm和Rs中的值作有符號數(shù)相乘, 64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保 存到RdHi中。指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: SMLALR2,R3,R7,R6; (R3、R2)=R7R6+(R3、R2) 92 MOV、MVN 傳送、傳送非 格式: MOVSRd,Operand2 ;將Operand2的值拷貝到Rd MVN SRd,Operand2 ;將Operand2的值進(jìn)行按位邏輯非 ;操作后送到Rd. S: 選擇S,
53、則會根據(jù)操作結(jié)果更新條件碼(N、Z、C) (三)ARM傳送指令 93 助記符說明操作條件碼位置 MOV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondS MVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcondS ARM指令數(shù)據(jù)傳送 94 助記符說明操作條件碼位置 MOV Rd,operand2MOV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondS MVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcondS ARM指令數(shù)據(jù)傳送 MOV指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r常數(shù)表 達(dá)式 ”)或
54、寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運算等操作。 指令格式如下: MOVcondS Rd,operand2 MOV指令舉例如下: MOVR1,#0 x10;R1=0 x10 MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影響標(biāo)志位 MOVPC,LR;PC=LR,子程序返回 MOVS PC,R14 ;從異常返回,恢復(fù)從異常返回,恢復(fù)CPSR 95 助記符說明操作條件碼位置 MOV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondS MVN Rd,operand2MVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcond
55、S ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送 MVN指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r常數(shù) 表達(dá)式 ”)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器 (Rd),因為其具有取反功能,所以可以裝載范圍更廣的立即數(shù)。指令格 式如下: MVNcondS Rd,operand2 MVN指令舉例如下: MVNR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2;將R2取反,結(jié)果存到R1 96 在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進(jìn)行讀 操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了 解到進(jìn)入異常前的處理器狀態(tài)。 MRS
56、cond Rd,psr MRS指令格式 指令對應(yīng)編碼 指令執(zhí)行的條件碼目標(biāo)寄存器,不能 為R15 區(qū)別CPSR(為0) 和SPSR(為1)寄存 器 (三)程序狀態(tài)寄存器訪問指令 97 ARM狀態(tài)寄存器讀指令 在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進(jìn)行讀 操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了 解到進(jìn)入異常前的處理器狀態(tài)。 MRScond Rd,psr MRS指令格式 應(yīng)用示例: MRS R1,CPSR; 將CPSR狀態(tài)寄存器讀取,保存到R1中 MRS R2,SPSR; 將SPSR狀態(tài)寄存器讀取,保存到R2中 98 ARM狀態(tài)寄存器寫
57、指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進(jìn)行寫 操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作, 可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。 MSRcond psr_fields,#immed_8rMSR指令格式1 MSRcond psr_fields,RmMSR指令格式2 指令執(zhí)行的條件碼 CPSR或SPSR 指定傳送的區(qū)域,可以為以下字母 (必須小寫)的一個或者組合: c 控制域屏蔽字節(jié)(psr7.0) x 擴(kuò)展域屏蔽字節(jié)(psr15.8) s 狀態(tài)域屏蔽字節(jié)(psr23.16) f 標(biāo)志域屏蔽字節(jié)(psr31.2
58、4) 保存要傳送到狀態(tài) 寄存器指定域數(shù)據(jù) 的源寄存器 要傳送到狀態(tài)寄存 器指定域的立即數(shù) 99 保存要傳送到狀態(tài) 寄存器指定域數(shù)據(jù) 的源寄存器 ARM狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進(jìn)行寫 操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作, 可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。 指令執(zhí)行的條件碼 CPSR或SPSR 指定傳送的區(qū)域,可以為以下字母 (必須小寫)的一個或者組合: c 控制域屏蔽字節(jié)(psr7.0) x 擴(kuò)展域屏蔽字節(jié)(psr15.8) s 狀態(tài)域屏蔽字節(jié)(psr23.16) f 標(biāo)
59、志域屏蔽字節(jié)(psr31.24) 要傳送到狀態(tài)寄存 器指定域的立即數(shù) MSR指令1編碼 MSR指令2編碼 R o t a t e : 立即數(shù)對齊 8_bit_immediate: 8位立即數(shù) 例:設(shè)置例:設(shè)置N,Z,C,V標(biāo)志標(biāo)志 MSR CPSR_f #ff000000 ;僅高;僅高8位有效,其它必須位位有效,其它必須位0 100 (1) (2) (3) (4) ARM狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進(jìn)行寫 操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作, 可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等
60、。 應(yīng)用示例1: ;子程序:使能IRQ中斷 ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 應(yīng)用示例2: ;子程序:禁能IRQ中斷 DISABLE_IRQ MRS R0 CPSR ORR R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.將CPSR寄存器內(nèi)容讀出到R0; 2.修改對應(yīng)于CPSR中的I控制位; 3.將修改后的值寫回 CPSR寄存器 的對應(yīng)控制域; 4.返回上一層函數(shù); 101 ARM轉(zhuǎn)移類指令完成循環(huán)、調(diào)用子程序和 從ARM狀態(tài)轉(zhuǎn)向Thumb狀態(tài)等功能。它包括B、 B
溫馨提示
- 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年度電商平臺廣告代理合同
- 二零二五年度LED燈具市場推廣與銷售合同
- 安全最后一課-冬季主題班會
- 2025轉(zhuǎn)租房屋租賃合同格式
- 以強帶弱企業(yè)合作協(xié)議
- 2025陽光南岸主體土建勞務(wù)合同
- 2025公司合同范本下載
- 2025技術(shù)引進(jìn)合同范本
- 2025廣告牌安裝合同范文
- 2025競業(yè)避止合同樣板
- 山東省濰坊市2024-2025學(xué)年高三上學(xué)期期末 地理試題(無答案)
- 勞動法培訓(xùn)課件
- 2024年建筑施工安全工作計劃(3篇)
- 2024屆九省聯(lián)考英語試題(含答案解析、MP3及錄音稿)
- 倉庫消防知識安全培訓(xùn)
- 從事專業(yè)與所學(xué)專業(yè)不一致專業(yè)技術(shù)人員申報職稱崗位任職合格證明附件6
- 我國房屋建筑模板技術(shù)的研究綜述
- 人教版小學(xué)三年級上冊數(shù)學(xué)豎式筆算練習(xí)題
- 航天科工集團(tuán)在線測評題
- 山東省濰坊新2025屆高三語文第一學(xué)期期末經(jīng)典試題含解析
- 醫(yī)院三基考核試題(康復(fù)理療科)
評論
0/150
提交評論