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

下載本文檔

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

文檔簡介

ARM處理器的指令系統(tǒng)第三章2預(yù)習(xí)檢查ARM處理器有哪幾種尋址方式?ARM微處理器有哪幾種指令類型?ARM微處理器有幾種跳轉(zhuǎn)指令類型?3本章目標(biāo)能夠掌握ARM指令的7種尋址方式;能夠掌握ARM基本編程實驗熟悉ARM指令集;熟悉Thumb指令集;4本章結(jié)構(gòu)跳轉(zhuǎn)指令數(shù)據(jù)處理指令A(yù)RM指令實驗ARM指令的尋址方式ARM微處理器指令系統(tǒng)ARM微處理器的指令集概述ARM指令集Thumb指令及應(yīng)用PSR訪問指令加載/存儲指令乘法與乘加指令批量數(shù)據(jù)加載/存儲指令數(shù)據(jù)交換指令移位指令協(xié)處理指令異常產(chǎn)生指令54-1

ARM微處理器的指令集概述

ARM指令集與Thumb指令集Thumb指令集具有靈活、小巧,緊湊的特點ARM指令集支持ARM核所有的特性,具有高效、快速的特點4-1-1

ARM微處理器的指令的分類與格式6跳轉(zhuǎn)指令數(shù)據(jù)處理指令A(yù)RM指令PSR訪問指令加載/存儲指令乘法與乘加指令批量數(shù)據(jù)加載/存儲指令數(shù)據(jù)交換指令移位指令協(xié)處理指令異常產(chǎn)生指令A(yù)RM微處理器的指令的分類:4-1-1

ARM微處理器的指令的分類與格式ARM微處理器的指令的格式:

ARM是三地址指令格式,指令的基本格式如下:4-1-1

ARM微處理器的指令的分類與格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中<>號內(nèi)的項是必須的,{}號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù);指令語法目標(biāo)寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2例:ARM指令集——基本指令格式

ARM指令的基本格式如下:4-1-2指令的條件域<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

使用條件碼“cond”可以實現(xiàn)高效的邏輯操作(節(jié)省跳轉(zhuǎn)和條件語句),提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認為無條件(AL)執(zhí)行。操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于

1011LTN!=V有符號數(shù)小于

1100GTZ=0,N=V有符號數(shù)大于

1101LEZ=1,N!=V有符號數(shù)小于或等于

1110AL任何無條件執(zhí)行

(指令默認條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表4-1-2指令的條件域C代碼:If(a>b) a++;Else b++;對應(yīng)的匯編代碼:CMP R0,R1 ;R0(a)與R1(b)比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤R1,則R1=R1+1示例:4-1-2指令的條件域階段小結(jié)12ARM微處理器的指令集概述指令分類與格式指令的條件域4-2ARM指令的尋址方式13立即尋址寄存器尋址ARM指令尋址基址變址尋址多寄存器尋址寄存器間接尋址相對尋址堆棧尋址尋址方式:尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。ARM處理器具有7種基本尋址方式。

立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOV R0,#0xFF000;將立即數(shù)0xFF000裝入R0寄存器

0x55R0MOVR0,#0xFF00程序存儲4-2-1立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)

操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R0

0xAA0x55R2R14-2-2寄存器尋址MOVR1,R20xAA

寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲單元的數(shù)據(jù)讀出

;保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2指定的存儲

;單元的內(nèi)容交換0x55R0R20x400000000xAA0x400000004-2-3寄存器間接尋址LDRR0,[R2]0xAA

基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量(<4K)相加/減,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址。基址尋址指令舉例如下(前索引尋址):LDR R2,[R3,#0x0C] ;讀取R3+0x0C地址上的存儲單元

;的內(nèi)容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R0的值寄存

;到保存到R1指定的存儲單元

4-2-4基址變址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)

基址尋址指令舉例如下:LDR R0,[R1],#4;R0=[R1],R1=R1+4 ;后索引基址尋址

;ARM這種自動索引機制不消耗額外的時間LDRR0,[R1,R2];R0=[R1+R2]4-2-4基址變址尋址

多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R4,R12};將R1指向的單元中的數(shù)據(jù)讀出到

;R2~R4、R12中(R1自動加4)STMIA R0!,{R2-R4,R12};將寄存器R2~R4、R12的值保

;存到R0指向的存儲;單元中

;(R0自動加4)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器4-2-5多寄存器尋址LDRR1!,{R2-R4,R6}0x010x020x030x040x40000000

相對尋址是基址尋址的一種變通。由程序計數(shù)器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下:

4-2-6相對尋址BL SUBR1 ;調(diào)用到SUBR1子程序

BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號處

...LOOP MOV R6,#1 ...SUBR1 ...

堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧词嵌褩5臈m敗4鎯ζ鞫褩?煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧4-2-7堆棧尋址4-2-7堆棧尋址棧底棧頂棧區(qū)SP

堆棧存儲區(qū)棧頂棧底棧區(qū)

SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧棧頂SP

棧頂SP

棧底空堆棧棧底滿堆棧

堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。

4-2-7堆棧尋址0x123456780x12345678棧頂SP

0x12345678棧頂SP

壓棧壓棧4-2-7堆棧尋址四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。階段小結(jié)25立即尋址寄存器尋址寄存器間接尋址基址變址尋址多寄存器尋址相對尋址堆棧尋址4-3ARM指令實驗指導(dǎo)26ARM匯編語言的基本框架:AREAARMexp1,CODE,READONLY;NamethisblockofcodeARMexp1 ENTRY ;Markfirstinstructiontoexecutestart MOVr0,#10 ;Setupparameters MOVr1,#3 ADDr0,r0,r1 ;r0=r0+r1stop MOVr0,#0x18 ;angel_SWIreason_ReportException LDRr1,=0x20026 ;ADP_Stopped_ApplicationExit SWI0x123456 ;ARMsemihostingSWI END ;Markendoffile4-3ARM指令實驗指導(dǎo)使用ADS編譯、鏈接、調(diào)試程序:創(chuàng)建一個工程將源文件加入工程中配置工程編譯選項編譯調(diào)試階段小結(jié)28ARM指令實驗指導(dǎo)ARM匯編語言的基本框架使用ADS編譯、鏈接、調(diào)試程序4-4ARM指令集跳轉(zhuǎn)指令數(shù)據(jù)處理指令A(yù)RM指令集PSR訪問指令加載/存儲指令乘法與乘加指令批量數(shù)據(jù)加載/存儲指令數(shù)據(jù)交換指令移位指令協(xié)處理指令異常產(chǎn)生指令4-4-1跳轉(zhuǎn)指令在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn)。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。分支指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號立即數(shù)(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標(biāo)地址寄存器,該寄存器裝載跳轉(zhuǎn)地址4-4-1跳轉(zhuǎn)指令助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}4-4-1跳轉(zhuǎn)指令助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}

分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:B{cond}Label

應(yīng)用示例:4-4-1跳轉(zhuǎn)指令

B WAITA ;跳轉(zhuǎn)到WAITA標(biāo)號處

B 0x1234 ;跳轉(zhuǎn)到絕對地址0x1234處BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}

帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行應(yīng)用示例(調(diào)用子程序):

BL Label 4-4-1跳轉(zhuǎn)指令助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}

帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:BX{cond}Rm跳轉(zhuǎn)地址Rm[0]跳轉(zhuǎn)后CPSR標(biāo)志T位處理器狀態(tài)00ARM11Thumb4-4-1跳轉(zhuǎn)指令助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}

帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標(biāo)志T置位,且將目標(biāo)地址的代碼解釋為Thumb代碼;若Rm的位[0]為0,則Rm的位[1]就不能為1

。指令格式如下:BX{cond}Rm4-4-1跳轉(zhuǎn)指令應(yīng)用示例:

ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0

BXR0 ;跳轉(zhuǎn)到R0指定的地址,

;并根據(jù)R0的最低位來切換處理器狀態(tài)4-4-2數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令;算術(shù)邏輯運算指令;比較指令。數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,而不能對內(nèi)存中的數(shù)據(jù)進行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以使指令影響狀態(tài)標(biāo)志。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)帶進位加法ADC0101帶進位減法指令SBC0110帶進位逆向減法指令RSC0111位測試指令TST1000相等測試指令TEQ1001比較指令CMP1010負數(shù)比較指令CMN1011邏輯或操作指令ORR1100數(shù)據(jù)傳送MOV1101位清除指令BIC1110數(shù)據(jù)非傳送MVN1111加法運算指令A(yù)DD0100逆向減法指令RSB0011減法運算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令A(yù)ND0000說明指令助記符操作碼opcode操作碼功能表4-4-2數(shù)據(jù)處理指令指令編碼助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送Rd←(~operand2)MVN{cond}{S}注:當(dāng)后綴S時,這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,在計算Operand2時更新標(biāo)志C,不影響標(biāo)志V。4-4-2數(shù)據(jù)處理指令指令編碼助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送Rd←(~operand2)MVN{cond}{S}

MOV指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r——常數(shù)表達式”)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運算等操作。指令格式如下:MOV{cond}{S}Rd,operand2

MOV指令舉例如下:

MOV R11,#0xF000000B ;R1=0xF000000B

MOV R0,R1 ;R0=R1

MOVS R3,R1,LSL#2 ;R3=R1<<2,并影響標(biāo)志位

MOV PC,LR ;PC=LR,子程序返回4-4-2數(shù)據(jù)處理指令數(shù)據(jù)傳送助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送Rd←(~operand2)MVN{cond}{S}

MVN指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r——常數(shù)表達式”)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器(Rd),因為其具有取反功能,所以可以裝載范圍更廣的立即數(shù)。指令格式如下:

MVN{cond}{S}Rd,operand2

MVN指令舉例如下:

MVN R1,#0xFF ;R1=0xFFFFFF00

MVN R1,R2 ;將R2按位取反,結(jié)果存到R14-4-2數(shù)據(jù)處理指令數(shù)據(jù)傳送助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}注:這些指令影響N,Z,C和V標(biāo)志位。4-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

加法運算指令——ADD指令將operand2的值與Rn的值相加,結(jié)果保存到Rd寄存器。指令格式如下:ADD{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

ADDSR1,R1,#1020 ;R1=R1+1020,并影響標(biāo)志位

ADDR1,R1,R2,LSL#2 ;R1=R1+R2<<24-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

減法運算指令——SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。指令格式如下:SUB{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

ADDSR1,R1,#1020 ;R1=R1+1020,并影響標(biāo)志位

ADDR1,R1,R2,LSL#2 ;R1=R1+R2<<24-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

逆向減法運算指令——RSB指令將operand2的值減去Rn,結(jié)果保存到Rd中。指令格式如下:

RSB{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

RSBR3,R1,#0xFF00;R3=0xFF00-R1

RSBSR1,R2,R2,LSL#2;R1=(R2<<2)-R2=R2×3影響標(biāo)志位4-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

帶進位加法指令——ADC將operand2的值與Rn的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下:

ADC{cond}{S}Rd,Rn,operand2

應(yīng)用示例(使用ADC實現(xiàn)64位加法,結(jié)果存于R1(高32位)、R0中):

ADDSR0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位

ADCR1,R1,R3 ;R1等于高32位相加,并加上低位進位4-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

帶進位減法指令——SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存到Rd中。指令格式如下:SBC{cond}{S}Rd,Rn,operand2

應(yīng)用示例(使用SBC實現(xiàn)64位減法,結(jié)果存于R1、R0中):

SUBSR0,R0,R2 ;低32位相減,并影響標(biāo)志位

SBCR1,R1,R3 ;高32位相減,并減去低位借位4-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

帶進位逆向減法指令——RSC指令用寄存器operand2減去Rn,再減去CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd中。指令格式如下:

RSC{cond}{S}Rd,Rn,operand2

應(yīng)用示例(使用RSC指令實現(xiàn)求64位數(shù)值的負數(shù)):

RSBSR2,R0,#0;R2=-R0

RSCR3,R1,#0;R3=-R1-!Carry4-4-2數(shù)據(jù)處理指令算術(shù)運算助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}注:當(dāng)后綴S時,這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,在計算Operand2時更新標(biāo)志C,不影響標(biāo)志V。4-4-2數(shù)據(jù)處理指令邏輯運算指令助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}

邏輯與操作指令——AND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下:AND{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

ANDSR0,R0,#0x01 ;R0=R0&0x01,取出最低位數(shù)據(jù)

ANDEQR2,R1,R3 ;R2=R1&R34-4-2數(shù)據(jù)處理指令邏輯運算指令助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}

邏輯或操作指令——ORR指令將operand2的值與寄存器Rn的值按位作邏輯“或”操作,結(jié)果保存到Rd中。指令格式如下:ORR{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

MOV R1,R2,LSR#24 ;使用ORR指令將R2的高8位

ORR R3,R1,R3,LSL#8 ;數(shù)據(jù)移入到R3低8位中4-4-2數(shù)據(jù)處理指令邏輯運算指令助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}

邏輯異或操作指令——EOR指令將operand2的值與寄存器Rn的值按位作邏輯“異或”操作,結(jié)果保存到Rd中。指令格式如下:EOR{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

EOR R1,R1,#0x0F ;將R1的低4位取反

EORR2,R1,R0 ;R2=R1^R0

EORS R0,R5,#0x01 ;將R5和0x01進行邏輯異或,

;結(jié)果保存到R0,并影響標(biāo)志位4-4-2數(shù)據(jù)處理指令邏輯運算指令助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}

位清除指令——BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下:

BIC{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

BICR1,R1,#0x0F ;將R1的低4位清零,其它位不變

BIC R1,R2,R3 ;將R3的反碼和R2相邏輯“與”,

;結(jié)果保存到R1中4-4-2數(shù)據(jù)處理指令邏輯運算指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}注:這些指令影響N,Z,C和V標(biāo)志位。4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

比較指令——CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位(N/Z/C/V),以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。CMP指令與SUBS指令的區(qū)別在于CMP指令不保存運算結(jié)果。指令格式如下:

CMP{cond} Rn,operand2

應(yīng)用示例:

CMP R1,#10 ;R1與10比較,設(shè)置相關(guān)標(biāo)志位

CMPGT R1,R2 ;R1與R2比較,設(shè)置相關(guān)標(biāo)志位

;若R1>10,則執(zhí)行本指令4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

負數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:

CMN{cond} Rn,operand2

應(yīng)用示例:

CMN R0,#1 ;R0+1,判斷R0是否為1的補碼

;如果是,則設(shè)置Z標(biāo)志位4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

負數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:CMN{cond} Rn,operand2注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結(jié)果。CMN指令可用于負數(shù)比較,比如CMNR0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復(fù)位。4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

位測試指令——TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:TST{cond}Rn,operand2

應(yīng)用示例:

TST R0,#0x01 ;判斷R0的最低位是否為0

TST R1,#0x0F ;判斷R1的低4位是否為04-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

位測試指令——TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:TST{cond}Rn,operand2注意:TST指令與ANDS指令的區(qū)別在于TST指令不保存運算結(jié)果。TST指令通常與EQ、NE條件碼配合使用,當(dāng)所有測試位均為0時,EQ有效(Z=1),而只要有一個測試位不為0,則NE有效(Z=0)。4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

相等測試指令——TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:TEQ{cond}Rn,operand2

應(yīng)用示例:

TEQ R0,R1 ;比較R0與R1是否相等(不影響V位和C位)4-4-2數(shù)據(jù)處理指令比較指令助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}

相等測試指令——TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:

TEQ{cond}Rn,operand2注意:TEQ指令與EORS指令的區(qū)別在于TEQ指令不保存運算結(jié)果。使用TEQ進行相等測試時,常與EQ、NE條件碼配合使用。當(dāng)兩個數(shù)據(jù)相等時,EQ有效;否則NE有效。4-4-2數(shù)據(jù)處理指令比較指令4-4-3乘法與乘加指令A(yù)RM9具有三種乘法指令,分別為:32×32位乘法指令;32×32位乘加指令;32×32位結(jié)果為64位的乘/乘加指令。指令執(zhí)行的條件碼Opcode乘法指令操作碼S設(shè)置條件碼,與指令中的S位對應(yīng)Rm為被乘數(shù)寄存器Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標(biāo)寄存器(低32位)Rd/RdHi為目標(biāo)寄存器或64位乘法指令的目標(biāo)寄存器(高32位)Rs為乘數(shù)寄存器64位有符號乘加指令SMLAL11164位有符號乘法指令SMULL11064位無符號乘加指令UMLAL10164位無符號乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000說明指令助記符操作碼opcode操作碼功能表4-4-3乘法與乘加指令乘法指令編碼助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}4-4-3乘法與乘加指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

32位乘法指令——MUL指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。Rd,Rm,Rs不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下:MUL{cond}{S}Rd,Rm,Rs

4-4-3乘法與乘加指令應(yīng)用示例:

MULR1,R2,R3;R1=R2×R3

MULSR0,R3,R7;R0=R3×R7,影響CPSR中的N位和Z位助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

32位乘加指令——MLA指令將Rm和Rs中的值相乘,再將乘積加上第3個操作數(shù),結(jié)果的低32位保存到Rd中。Rd,Rm,Rs,Rn不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下:MLA{cond}{S}Rd,Rm,Rs,Rn

應(yīng)用示例:

MLAR1,R2,R3,R0

;R1=R2×R3+R04-4-3乘法與乘加指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

64位無符號乘法指令——UMULL指令將Rm和Rs中的值作無符號數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能為R15。RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下:UMULL{cond}{S}RdLo,RdHi,Rm,Rs

應(yīng)用示例:

UMULLR0,R1,R5,R8 ;(R1、R0)=R5×R84-4-3乘法與乘加指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

64位無符號乘加指令——UMLAL指令將Rm和Rs中的值作無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能為R15。RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下:

UMLAL{cond}{S}RdLo,RdHi,Rm,Rs

應(yīng)用示例:

UMLALR0,R1,R5,R8 ;(R1、R0)=R5×R8+(R1、R0)4-4-3乘法與乘加指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

64位有符號乘法指令——SMULL指令將Rm和Rs中的值作有符號數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能為R15。RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下:SMULL{cond}{S}RdLo,RdHi,Rm,Rs

應(yīng)用示例:

SMULL R2,R3,R7,R6

;(R3、R2)=R7×R64-4-3乘法與乘加指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

64位有符號乘加指令——SMLAL指令將Rm和Rs中的值作有符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。RdLo/Hi,Rm,Rs不能為R15。RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下:SMLAL{cond}{S}RdLo,RdHi,Rm,Rs

應(yīng)用示例:

SMLAL R2,R3,R7,R6 ;(R3、R2)=R7×R6+(R3、R2)4-4-3乘法與乘加指令

在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。該指令不影響條件碼。MRS{cond}Rd,psrMRS指令格式指令對應(yīng)編碼指令執(zhí)行的條件碼目標(biāo)寄存器,不能為R15區(qū)別CPSR(為0)和SPSR(為1)寄存器4-4-4程序狀態(tài)寄存器訪問指令

在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRS{cond}Rd,psrMRS指令格式應(yīng)用示例:

MRSR1,CPSR ;將CPSR狀態(tài)寄存器讀取,保存到R1中

MRSR2,SPSR ;將SPSR狀態(tài)寄存器讀取,保存到R2中4-4-4程序狀態(tài)寄存器訪問指令

在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。MSR{cond}psr_fields,#immed_8rMSR指令格式1MSR{cond}psr_fields,RmMSR指令格式2指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c控制域屏蔽字節(jié)(psr[7..0])x擴展域屏蔽字節(jié)(psr[15..8])s狀態(tài)域屏蔽字節(jié)(psr[23..16])f標(biāo)志域屏蔽字節(jié)(psr[31..24])保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)的源寄存器要傳送到狀態(tài)寄存器指定域的立即數(shù)4-4-4程序狀態(tài)寄存器訪問指令

在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c控制域屏蔽字節(jié)(psr[7..0])x擴展域屏蔽字節(jié)(psr[15..8])s狀態(tài)域屏蔽字節(jié)(psr[23..16])f標(biāo)志域屏蔽字節(jié)(psr[31..24])要傳送到狀態(tài)寄存器指定域的立即數(shù)MSR指令1編碼MSR指令2編碼8_bit_immediate:8位位圖立即數(shù)4-4-4程序狀態(tài)寄存器訪問指令(1)(2)(3)(4)

在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論