ARM尋址方式: 1、 立即尋址,操作數(shù)在指令中給出。 ADDR0,R0,#1; R0?R0+1 ANDR8,R7,#&FF; R8?R7[7:0]; ADDR0,R0,#&3F R0?R0+0X3F 立即數(shù)要求加上#作為前綴,十六進(jìn)制使用0x,或者&表示 2、 寄存器尋址,直接使用寄存器名字 ADD R0,R1,R2; R0?R1+R2 3、 寄存器移位尋址,ARM特有 ADD R3,R2,R1,LSL#3; R3?R2+8*R1 其中LSL #3 為左移三位 表示移位的還有: LSL:邏輯左移 LSR:邏輯右移 ASR:算術(shù)右移 ROR:循環(huán)右移 RRX:擴(kuò)展為1的循環(huán)右移 4、 寄存器間接尋址,寄存器中的值作為操作數(shù)地址,操作數(shù)在RAM中 LDR R0,[R1]; R0?[R1] STR R0,[R1]; [R1]?R0 5、 基址尋址,給定寄存器的值加上一個(gè)偏移作為操作數(shù)地址,操作數(shù)在RAM中 LDR R0,[R1,#4]; R0?[R1+4] LDR R0,[R1,#4]!; R0?[R1+4],R1?R1+4 LDR R0,[R1],#4; R0?[R1],R1?R1+4 LDR R0,[R1,R2]; R0?[R1+R2] 6、 多寄存器尋址,一條指令可以完成多個(gè)寄存器值的傳送,最多16個(gè)寄存器 LDMIAR0,{R1,R2,R3,R4}; R1?[R0],R2?[R0+4],R3?[R0+8],R4?[R0+12] 格式:LDM+ IB:地址增加在先 R1?[R0+4],R2?[R0+8],R3?[R0+12],R4?[R0+16] IA:地址增加在后 R1?[R0],R2?[R0+4],R3?[R0+8],R4?[R0+12] DB:地址減少在先 R1?[R0-4],R2?[R0-8],R3?[R0-12],R4?[R0-16] DA:地址減少在后 R1?[R0],R2?[R0-4],R3?[R0-8],R4?[R0-12] I:Increment D:Decrement B:Before A:After 7、 堆棧尋址 堆棧尋址有四種情況 1, 堆棧向高地址方向生長(zhǎng) 2, 堆棧向低地址方向生長(zhǎng) 3, 當(dāng)前堆棧指針指向有意義的數(shù)據(jù)[滿](推送數(shù)據(jù)前堆棧需騰出4字節(jié)空間) 4, 當(dāng)前堆棧指針指向無意義的數(shù)據(jù)(可直接向當(dāng)前位置推送數(shù)據(jù)) 1,2情況與3,4情況兩兩組合,產(chǎn)生四種結(jié)果,四種結(jié)果如下 滿遞增堆棧(FA): 堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。 入棧:STMFA,出棧:LDMFA 滿遞減堆棧(FD): 堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。 入棧:STMFD,出棧:LDMFD 空遞增堆棧(EA): 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。 入棧:STMEA,出棧:LDMEA 空遞減堆棧(ED): 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。 入棧:STMED,出棧:LDMED STMFA r13!, {r0-r5} ; Push onto a FullAscending Stack LDMFA r13!, {r0-r5} ; Pop from a FullAscending Stack STMFD r13!, {r0-r5} ; Push onto a FullDescending Stack LDMFD r13!, {r0-r5} ; Pop from a Full DescendingStack STMEA r13!, {r0-r5} ; Push onto an EmptyAscending Stack LDMEA r13!, {r0-r5} ; Pop from an EmptyAscending Stack STMED r13!, {r0-r5} ; Push onto EmptyDescending Stack LDMED r13!, {r0-r5} ; Pop from an EmptyDescending Stack
8、 相對(duì)尋址 以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。
LDRPC,[PC,#+0xFF0];PC ←[PC+8+0xFF0] ARM微處理器指令分類 1、 跳轉(zhuǎn)指令 2、 數(shù)據(jù)處理指令 3、 程序狀態(tài)寄存器(PSR)傳輸指令 4、 加載、存儲(chǔ)(Load/Store)指令 5、 協(xié)處理器指令 6、 異常中斷產(chǎn)生指令 ARM微處理器指令格式 典型的ARM指令格式(機(jī)器碼)如下:
語法格式: <opcode>{<cond>}{S}<Rd>,<Rn>,<Shifter_operand> <opcode>:指令助記符 {<cond>}:指令執(zhí)行條件 {<S>} :指令的操作是否影響CPSR的值 <Rd> :目標(biāo)寄存器 <Rn> :包含第一個(gè)操作數(shù)的寄存器 <shifter_operand>:第二個(gè)操作數(shù) 指令的條件域 當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均可根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行滿足條件時(shí)被執(zhí)行。 每一條ARM指令包含4位條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼可用兩個(gè)字符表示,這兩個(gè)字符可以添加在指令助記符的后面和指令同時(shí)使用。 B 無條件跳轉(zhuǎn) BEQ 相等則跳轉(zhuǎn),即當(dāng)CPSR中的Z標(biāo)志置位時(shí)發(fā)生跳轉(zhuǎn)。
幾乎所有的ARM數(shù)據(jù)處理指令均可以根據(jù)執(zhí)行結(jié)果來選擇是否更新條件碼標(biāo)志。若要更新條件碼標(biāo)志,則指令中須包含后綴S 一些指令(CMP,CMN,TST,TEQ)不需要后綴S 一些指令只更新部分標(biāo)志,而不影響其他標(biāo)志 跳轉(zhuǎn)指令 在ARM程序中有兩種方法可以實(shí)現(xiàn)程序的跳轉(zhuǎn) 1、使用跳轉(zhuǎn)指令 2、直接向程序計(jì)數(shù)器PC寫入目標(biāo)地址值 通過向PC寄存器寫入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4G的地址空間中任意跳轉(zhuǎn)。這種跳轉(zhuǎn)指令稱為長(zhǎng)跳轉(zhuǎn)。 ARM的跳轉(zhuǎn)指令可以從當(dāng)前指令向前或者向后的32M的地址空間跳轉(zhuǎn),包括以下四條指令: B 跳轉(zhuǎn)指令 BL 帶返回的跳轉(zhuǎn)指令 BLX 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令 BX 帶狀態(tài)切換的跳轉(zhuǎn)指令
指令的語法格式 B{L}{<cond>}<targt_address> L:是否保存返回地址( L:PCàLR ) <cond>:指令執(zhí)行的條件碼 <targt_address>:指令跳轉(zhuǎn)的目標(biāo)地址。計(jì)算方法,24 位有符號(hào)數(shù)補(bǔ)碼立即數(shù)擴(kuò)展為 32 位,再左移2位;將得到的值加到PC寄存器中,即得到跳轉(zhuǎn)的目標(biāo)地址。(-32MB~+32MB)。 B(跳轉(zhuǎn)指令)及BL(帶返回的跳轉(zhuǎn)指令) 指令的使用 子程序返回: BX R14 MOV PC,R14 STMFDR13!,{<registers>,R14} LDMFDR13!,{<registers>,PC} 示例 B Label ;程序跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行 BCS Label ;當(dāng)CPSR寄存器中的C條件碼置位時(shí),程序 ;跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行 BL func_1 ;程序跳轉(zhuǎn)到子程序func_1處執(zhí)行,同時(shí)將當(dāng)前PC值 ;保存到LR中 BLX(1) BLX(1)指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC寄存器的內(nèi)容復(fù)制到LR寄存器中。 本指令屬于無條件執(zhí)行的指令
指令的語法格式 BLX <targt_address> BLX(2) BLX(2)指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址的指令可以是ARM指令,也可以是Thumb指令。目標(biāo)地址放在指令中的寄存器<Rm>中,當(dāng)<Rm>寄存器的bit[0]值為0時(shí),目標(biāo)地址處的指令類型為ARM指令;當(dāng)<Rm>寄存器的bit[0]值為1時(shí),目標(biāo)地址處的指令類型為Thumb指令。該指令同時(shí)將PC寄存器的內(nèi)容復(fù)制到LR寄存器中。 指令的語法格式 BLX{<cond>} <Rm> BLX(2) BLX 目標(biāo)地址 BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)從ARM狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC的當(dāng)前內(nèi)容保存到寄存器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時(shí),可以通過BLX指令實(shí)現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時(shí),子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。 BX指令 BX{條件} 目標(biāo)地址 BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。 數(shù)據(jù)處理指令: 數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較指令等。 數(shù)據(jù)傳送指令用于在寄存器之間進(jìn)行數(shù)據(jù)的傳輸。 算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)邏輯運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位。 比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。 ARM指令集中數(shù)據(jù)處理指令集包括: 傳送指令: MOV 數(shù)據(jù)傳送指令 MVN 數(shù)據(jù)取反傳送指令 比較指令: CMP 比較指令 CMN 反值比較指令 TST 位測(cè)試指令 TEQ 相等測(cè)試指令 算術(shù)指令: ADD 加法指令 ADC 帶進(jìn)位加法指令 SUB 減法指令 SBC 帶借位減法指令 RSB 逆向減法指令 RSC 帶借位的逆向減法指令 邏輯指令: AND 邏輯與指令 ORR 邏輯或指令 EOR 邏輯異或指令 BIC 位清除指令 MOV指令 MOV{條件}{S} 目的寄存器,源操作數(shù) MOV指令可完成從另一個(gè)寄存器、被移位的寄存器或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。其中S選項(xiàng)決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。
MOV R1,R0 ;將寄存器R0的值傳送到寄存器R1 MOV PC,R14 ;將寄存器R14的值傳送到PC,常用于子程序返回 MOV R1,R0,LSL #3 ;將寄存器R0的值左移3位后傳送到R1 MVN指令 MVN{條件}{S} 目的寄存器,源操作數(shù) MVN指令可完成從另一個(gè)寄存器、被移位的寄存器、或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。 MVN R0,#0 ;將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1 CMP指令 CMP{條件} 操作數(shù)1,操作數(shù)2 CMP指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等)。 CMP R1,R0 ;將寄存器R1的值與寄存器R0的值相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 CMP R1,#100 ;將寄存器R1的值與立即數(shù)100相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 CMN指令 CMN{條件} 操作數(shù)1,操作數(shù)2 CMN指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)取反后進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令實(shí)際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標(biāo)志位。 CMN R1,R0 ;將寄存器R1的值與寄存器R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 CMN R1,#100 ;將寄存器R1的值與立即數(shù)100相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 TST指令 TST{條件} 操作數(shù)1,操作數(shù)2 TST指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的與運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測(cè)試的數(shù)據(jù),而操作數(shù)2是一個(gè)位掩碼,該指令一般用來檢測(cè)是否設(shè)置了特定的位。 TST R1, #2_1 ;用于測(cè)試在寄存器R1中是否設(shè)置了最低位 TST R1, #0xff0 ;將寄存器R1的值與立即數(shù)0xff0按位與,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位 TEQ指令 TEQ{條件} 操作數(shù)1,操作數(shù)2 TEQ指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(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)志位。 ADD指令 ADD{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 ADD指令用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。 ADD R0,R1,R2 ; R0 = R1 + R2 ADD R0,R1,#256 ; R0 = R1 + 256 ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1) ; R0 = R2 + 2×R3 ADC指令 ADC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 ADC指令用于把兩個(gè)操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,這樣就可以做比32位大的數(shù)的加法。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。 兩個(gè)128位數(shù)的加法: ADDS R0,R4,R8 ; 加低端的字,帶進(jìn)位 ADCS R1,R5,R9 ; 加第二個(gè)字,帶進(jìn)位 ADCS R2,R6,R10 ; 加第三個(gè)字,帶進(jìn)位 ADC R3,R7,R11 ; 加第四個(gè)字 SUB指令 SUB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。 SUB R0,R1,R2 ; R0 = R1 - R2 SUB R0,R1,#256 ; R0 = R1 - 256 SUB R0,R2,R3,LSL #1 ; R0 = R2 - (R3 << 1) SBC指令 SBC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。 SBCS R0,R1,R2 ;R0 = R1 - R2 - !C,并根據(jù)結(jié)果設(shè)置CPSR的進(jìn)位標(biāo)志位 RSB指令 RSB指令的格式為: RSB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。 RSB R0,R1,R2 ;R0 = R2 – R1 RSB R0,R1,#256 ;R0 = 256 – R1 RSB R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2 RSC指令 RSC指令的格式為: RSC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。 RSC R0,R1,R2 ;R0 = R2 – R1 - !C AND指令 AND指令的格式為: AND{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 AND指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。 AND R0,R0,#3 ;該指令保持R0的0、1位,其余位清零。 ORR指令 ORR指令的格式為: ORR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 ORR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。 ORR R0,R0,#3 ; 該指令設(shè)置R0的0、1位,其余位保持不變。 EOR指令 EOR指令的格式為: EOR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 EOR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。 EOR R0,R0,#3 ;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。 乘法指令與乘加指令 ARM微處理器支持的乘法指令與乘加指令共有6條,可分為運(yùn)算結(jié)果為32位和運(yùn)算結(jié)果為64位兩類,與前面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器必須為通用寄存器,不能對(duì)操作數(shù)使用立即數(shù)或被移位的寄存器,同時(shí),目的寄存器和操作數(shù)1必須是不同的寄存器。 乘法指令與乘加指令共有以下6條: MUL 32位乘法指令 MLA 32位乘加指令 SMULL 64位有符號(hào)數(shù)乘法指令 SMLAL 64位有符號(hào)數(shù)乘加指令 UMULL 64位無符號(hào)數(shù)乘法指令 UMLAL 64位無符號(hào)數(shù)乘加指令 MUL指令 MUL指令的格式為: MUL{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2 MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果(低32位)放置到目的寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)或無符號(hào)數(shù)。 MUL R0,R1,R2 ;R0 = R1 × R2低32位 ;R1=0x00FFFFFF,R2=0x00123456,R0=0x55EDCBAA ;0x00FFFFFF*0x00123456=0x123455EDCBAA SMULL指令 SMULL指令的格式為: SMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2 SMULL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。 SMULL R0,R1,R2,R3 ; R0 = (R2 × R3)的低32位;R1 = (R2 × R3)的高32位 ;R2=0x00FFFFFF,R3=0x00123456 ; R0=0x55EDCBAA,R1=0x00001234 ;0x00FFFFFF*0x00123456=123455EDCBAA SMLAL指令 SMLAL指令的格式為: SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2 SMLAL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。 對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。 對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。 SMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0 ;R1 = (R2 × R3)的高32位 + R1 UMULL指令 UMULL指令的格式為: UMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2 UMULL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號(hào)數(shù)。 UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 ;R1 = (R2 × R3)的高32位 UMLAL指令 UMLAL指令的格式為: UMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2 UMLAL指令完成操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無符號(hào)數(shù)。 對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。 對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。 UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0 ;R1 = (R2 × R3)的高32位 + R1 程序狀態(tài)寄存器訪問指令 ARM微處理器支持程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條: MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令 MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令 MRS指令 MRS指令的格式為: MRS{條件} 通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR) MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下幾種情況: 當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時(shí),可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。 當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。 MRS R0,CPSR ;傳送CPSR的內(nèi)容到R0 MRS R0,SPSR ;傳送SPSR的內(nèi)容到R0 MSR指令 MSR指令的格式為: MSR{條件} 程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù) MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(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表示; 該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,在使用時(shí),一般要在MSR指令中指明將要操作的域。 MSR CPSR_cxsf,R0 ;傳送R0的內(nèi)容到CPSR MSR SPSR_cxsf,R0 ;傳送R0的內(nèi)容到SPSR MSR CPSR_c,R0 ;傳送R0的內(nèi)容到SPSR,但僅僅修改CPSR中的控制位域 加載/存儲(chǔ)指令 ARM微處理器支持加載/存儲(chǔ)指令用于在寄存器和存儲(chǔ)器之間傳送數(shù)據(jù),加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則完成相反的操作。常用的加載存儲(chǔ)指令如下: LDR 字?jǐn)?shù)據(jù)加載指令 LDRB 字節(jié)數(shù)據(jù)加載指令 LDRH 半字?jǐn)?shù)據(jù)加載指令 STR 字?jǐn)?shù)據(jù)存儲(chǔ)指令 STRB 字節(jié)數(shù)據(jù)存儲(chǔ)指令 STRH 半字?jǐn)?shù)據(jù)存儲(chǔ)指令 LDR指令 LDR指令的格式為: LDR{條件} 目的寄存器,<存儲(chǔ)器地址> LDR指令用于從存儲(chǔ)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲(chǔ)器中讀取32位的字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。當(dāng)程序計(jì)數(shù)器PC作為目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣。 LDR R0,[R1] ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0 LDR R0,[R1,R2] ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0 LDR R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0 LDR R0,[R1,R2]! ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1 LDR R0,[R1,#8]! ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+8寫入R1 LDR R0,[R1],R2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1 LDR R0,[R1,R2,LSL#2]! ;將存儲(chǔ)器地址為R1+R2×4的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1 LDR R0,[R1],R2,LSL#2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1 LDRB指令 LDRB指令的格式為: LDR{條件}B 目的寄存器,<存儲(chǔ)器地址> LDRB指令用于從存儲(chǔ)器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高24位清零。該指令通常用于從存儲(chǔ)器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。 LDRB R0,[R1] ;將存儲(chǔ)器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零 LDRB R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零 LDRH指令 LDRH指令的格式為: LDR{條件}H 目的寄存器,<存儲(chǔ)器地址> LDRH指令用于從存儲(chǔ)器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高16位清零。該指令通常用于從存儲(chǔ)器中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。 LDRH R0,[R1] ;將存儲(chǔ)器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零 LDRH R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零 LDRH R0,[R1,R2] ;將存儲(chǔ)器地址為R1+R2的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零 STR指令 STR指令的格式為: STR{條件} 源寄存器,<存儲(chǔ)器地址> STR指令用于從源寄存器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。 STR R0,[R1],#8 ;將R0中的字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中,并將新地址R1+8寫入R1 STR R0,[R1,#8] ;將R0中的字?jǐn)?shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中 STRB指令 STRB指令的格式為: STR{條件}B 源寄存器,<存儲(chǔ)器地址> STRB指令用于從源寄存器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。 STRB R0,[R1] ;將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1為地址的存儲(chǔ)器中 STRB R0,[R1,#8] ;將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中 STRH指令 STRH指令的格式為: STR{條件}H 源寄存器,<存儲(chǔ)器地址> STRH指令用于從源寄存器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。 STRH R0,[R1] ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中 STRH R0,[R1,#8] ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R1+8為地址的存儲(chǔ)器中 批量數(shù)據(jù)加載/存儲(chǔ)指令 ARM微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。 常用的加載存儲(chǔ)指令如下: LDM 批量數(shù)據(jù)加載指令 STM 批量數(shù)據(jù)存儲(chǔ)指令 LDM(或STM)指令 LDM(或STM)指令的格式為: LDM(或STM){條件}{類型} 基址寄存器{!},寄存器列表{∧} LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送數(shù)據(jù),該指令的常見用途是將多個(gè)寄存器的內(nèi)容入?;虺鰲?。其中,{類型}為以下幾種情況: IA 每次傳送后地址加1; IB 每次傳送前地址加1; DA每次傳送后地址減1; DB 每次傳送前地址減1; FD 滿遞減堆棧; ED 空遞減堆棧; FA 滿遞增堆棧; EA 空遞增堆棧; {!}為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。 基址寄存器不允許為R15,寄存器列表可以為R0~R15的任意組合。 {∧}為可選后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含R15,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。 從子程序返回: 無嵌套 MOV PC,LR 有嵌套 STMFD R13!,{R0,R4-R12,LR} ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧 …… LDMFD R13!,{R0,R4-R12,PC} ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR) 從異常返回(例如IRQ中斷): 無嵌套 SUBS PC,LR,#4 其他 SUBS LR,LR,#4 STMFD R13!,{R0,R4-R12,LR} ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧 LDMFD R13!,{R0,R4-R12,PC}^ ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR) 數(shù)據(jù)交換指令(信號(hào)量操作指令) ARM微處理器所支持?jǐn)?shù)據(jù)交換指令能在存儲(chǔ)器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令有如下兩條: SWP 字?jǐn)?shù)據(jù)交換指令 SWPB 字節(jié)數(shù)據(jù)交換指令 SWP指令 SWP指令的格式為: SWP{條件} 目的寄存器,源寄存器1,[源寄存器2] SWP指令用于將源寄存器2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。 SWP R0,R1,[R2] ;將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R0,同時(shí)將R1中的字?jǐn)?shù)據(jù)傳送到R2所指向的存儲(chǔ)單元 SWP R0,R0,[R1] ;該指令完成將R1所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)與R0中的字?jǐn)?shù)據(jù)交換 SWPB指令 SWPB指令的格式為: SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2] SWPB指令用于將源寄存器2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時(shí)將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。 SWPB R0,R1,[R2] ;將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到R0,R0的高24位清零,同時(shí)將R1中的低8位數(shù)據(jù)傳送到R2所指向的存儲(chǔ)單元 SWPB R0,R0,[R1] ;該指令完成將R1所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)與R0中的低8位數(shù)據(jù)交換, R0的高24位清零 移位操作 ARM微處理器內(nèi)嵌的桶型移位器(Barrel Shifter),支持?jǐn)?shù)據(jù)的各種移位操作,移位操作在ARM指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中是一個(gè)字段,在匯編語言中表示為指令中的選項(xiàng)。例如,數(shù)據(jù)處理指令的第二個(gè)操作數(shù)為寄存器時(shí),就可以加入移位操作選項(xiàng)對(duì)它進(jìn)行各種移位操作。移位操作包括如下6種類型: LSL 邏輯左移 ASL 算術(shù)左移 LSR 邏輯右移 ASR 算術(shù)右移 ROR 循環(huán)右移 RRX 帶擴(kuò)展的循環(huán)右移 LSL(或ASL)操作 LSL(或ASL)操作的格式為: 通用寄存器,LSL(或ASL) 操作數(shù) LSL(或ASL)可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~31)。 MOV R0, R1, LSL #2 ;將R1中的內(nèi)容左移兩位后傳送到R0中。 LSR操作 LSR操作的格式為: 通用寄存器,LSR 操作數(shù) LSR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~32)。
MOV R0, R1, LSR #2 ;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用零來填充。 ASR操作 ASR操作的格式為: 通用寄存器,ASR 操作數(shù) ASR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位的值來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~32)。 MOV R0, R1, ASR #2 ;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用第31位的值來填充。 ROR操作 ROR操作的格式為: 通用寄存器,ROR 操作數(shù) ROR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(1~31)。 MOV R0, R1, ROR #2 ;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0中。 RRX操作 RRX操作的格式為: 通用寄存器,RRX RRX可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進(jìn)位標(biāo)志位C來填充。 MOV R0, R1, RRX ;將R1中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移一位后傳送到R0中。 協(xié)處理器指令 ARM微處理器可支持多達(dá)16個(gè)協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過程中,每個(gè)協(xié)處理器只執(zhí)行針對(duì)自身的協(xié)處理指令,忽略ARM處理器和其他協(xié)處理器的指令。 ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在ARM協(xié)處理器的寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括以下5條: CDP 協(xié)處理器數(shù)據(jù)操作指令 LDC 協(xié)處理器數(shù)據(jù)加載指令 STC 協(xié)處理器數(shù)據(jù)存儲(chǔ)指令 MCR ARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令 MRC 協(xié)處理器寄存器到ARM處理器寄存器的數(shù)據(jù)傳送指令 CDP指令 CDP指令的格式為: CDP{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器協(xié)處理器操作碼2 CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲(chǔ)器。
CDP P5,2,C12,C10,C3,4 ;該指令完成協(xié)處理器P5的初始化 LDC指令 LDC指令的格式為: LDC{條件}{L} 協(xié)處理器編碼,目的寄存器,[源寄存器] LDC指令用于將源寄存器所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。 LDC P6,CR1,[R4] ;將ARM處理器的寄存器R4所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器P6的寄存器CR1中。 STC指令 STC指令的格式為: STC{條件}{L} 協(xié)處理器編碼,源寄存器,[目的寄存器] STC指令用于將源寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向的存儲(chǔ)器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。 STC P8,CR8,[R2,#4]! ;將協(xié)處理器P8的寄存器CR8中的字?jǐn)?shù)據(jù)傳送到ARM處理器的寄存器R2+4所指向的存儲(chǔ)器中,R2=R2+4。 MCR指令 MCR指令的格式為: MCR{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2{,協(xié)處理器操作碼2} MCR指令用于將ARM處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協(xié)處理器的寄存器。 MCR P15,0,R0,C1,C0 ;CP15 register 1:=R0 MRC指令 MRC指令的格式為: MRC{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2 MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協(xié)處理器的寄存器。 MRC P15,0,R0,C1,C0 ;R0:=CP15 register 1 異常產(chǎn)生指令 ARM微處理器所支持的異常指令有如下兩條: SWI 軟件中斷指令 BKPT 斷點(diǎn)中斷指令 SWI指令 SWI指令的格式為: SWI{條件} 24位的立即數(shù) SWI指令用于產(chǎn)生軟件中斷,以便用戶程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應(yīng)的系統(tǒng)服務(wù),指令中24位的立即數(shù)指定用戶程序調(diào)用系統(tǒng)例程的類型,相關(guān)參數(shù)通過通用寄存器傳遞,當(dāng)指令中24位的立即數(shù)被忽略時(shí),用戶程序調(diào)用系統(tǒng)例程的類型由通用寄存器R0的內(nèi)容決定,同時(shí),參數(shù)通過其他通用寄存器傳遞。 SWI 0x02 ;該指令調(diào)用操作系統(tǒng)編號(hào)為02的系統(tǒng)例程。 BKPT指令 BKPT指令的格式為: BKPT 16位的立即數(shù) BKPT指令產(chǎn)生軟件斷點(diǎn),引起Prefetch Abort 異常??捎糜诔绦虻恼{(diào)試。 u ARM體系結(jié)構(gòu)除了支持執(zhí)行效率很高的32位ARM指令集以外,同時(shí)支持16位的Thumb指令集。Thumb指令集是ARM指令集的一個(gè)子集,允許指令編碼為16位的長(zhǎng)度。與等價(jià)的32位代碼相比較,Thumb指令集在保留32代碼優(yōu)勢(shì)的同時(shí),大大節(jié)省了系統(tǒng)的存儲(chǔ)空間。 u 所有的Thumb指令都有對(duì)應(yīng)的ARM指令,而且Thumb的編程模型也對(duì)應(yīng)于ARM的編程模型,在應(yīng)用程序的編寫過程中,只要遵循一定調(diào)用的規(guī)則,Thumb子程序和ARM子程序就可以互相調(diào)用。當(dāng)處理器在執(zhí)行ARM程序段時(shí),稱ARM處理器處于ARM工作狀態(tài),當(dāng)處理器在執(zhí)行Thumb程序段時(shí),稱ARM處理器處于Thumb工作狀態(tài)。 u 與ARM指令集相比較,Thumb指令集中的數(shù)據(jù)處理指令的操作數(shù)仍然是32位,指令地址也為32位,但Thumb指令集為實(shí)現(xiàn)16位的指令長(zhǎng)度,舍棄了ARM指令集的一些特性,如大多數(shù)的Thumb指令是無條件執(zhí)行的,而幾乎所有的ARM指令都是有條件執(zhí)行的;大多數(shù)的Thumb數(shù)據(jù)處理指令的目的寄存器與其中一個(gè)源寄存器相同。 u 由于Thumb指令的長(zhǎng)度為16位,即只用ARM指令一半的位數(shù)來實(shí)現(xiàn)同樣的功能,所以,要實(shí)現(xiàn)特定的程序功能,所需的Thumb指令的條數(shù)較ARM指令多。在一般的情況下,Thumb指令與ARM指令的時(shí)間效率和空間效率關(guān)系為: u Thumb代碼所需的存儲(chǔ)空間約為ARM代碼的60%~70% u Thumb代碼使用的指令數(shù)比ARM代碼多約30%~40% u 若使用32位數(shù)據(jù)寬度的存儲(chǔ)器,ARM代碼比Thumb代碼快約40% u 若使用16位數(shù)據(jù)寬度的存儲(chǔ)器,Thumb代碼比ARM代碼快約40%~50% u 與ARM代碼相比較,使用Thumb代碼,存儲(chǔ)器的功耗會(huì)降低約30% u 顯然,ARM指令集和Thumb指令集各有其優(yōu)點(diǎn),若對(duì)系統(tǒng)的性能有較高要求,應(yīng)使用32位的存儲(chǔ)系統(tǒng)和ARM指令集,若對(duì)系統(tǒng)的成本及功耗有較高要求,則應(yīng)使用16位的存儲(chǔ)系統(tǒng)和Thumb指令集。當(dāng)然,若兩者結(jié)合使用,充分發(fā)揮其各自的優(yōu)點(diǎn),會(huì)取得更好的效果。 |
|