ARM指令集特點(diǎn)尋址方式和指令分類詳解習(xí)題課件_第1頁(yè)
ARM指令集特點(diǎn)尋址方式和指令分類詳解習(xí)題課件_第2頁(yè)
ARM指令集特點(diǎn)尋址方式和指令分類詳解習(xí)題課件_第3頁(yè)
ARM指令集特點(diǎn)尋址方式和指令分類詳解習(xí)題課件_第4頁(yè)
ARM指令集特點(diǎn)尋址方式和指令分類詳解習(xí)題課件_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章ARM指令集主要介紹以下內(nèi)容:ARM指令集的基本特點(diǎn)與Thumb指令集的區(qū)別與x86處理器的區(qū)別ARM指令格式ARM尋址方式ARM指令集分類詳解14.6ARM處理器的尋址方式和指令系統(tǒng)ARM指令集和Thumb指令集具有以下共同點(diǎn):⒈較多的寄存器,可以用于多種用途。⒉對(duì)存儲(chǔ)器的訪問(wèn)只能通過(guò)Load/Store指令。兩種指令集的差異特征在下頁(yè)給出4.6.1ARM處理器指令系統(tǒng)主要特征2ARM指令集和Thumb指令集的不同點(diǎn)項(xiàng)目ARM指令Thumb指令指令工作標(biāo)志CPSR的T位=0CPSR的T位=1操作數(shù)尋址方式大多數(shù)指令為3地址大多數(shù)指令為2地址指令長(zhǎng)度32位16位內(nèi)核指令58條30條條件執(zhí)行大多數(shù)指令只有分支指令數(shù)據(jù)處理指令訪問(wèn)桶形移位器和ALU獨(dú)立的桶形移位器和ALU指令寄存器使用15個(gè)通用寄存器+PC8個(gè)通用低寄存器+7個(gè)高寄存器+PC程序狀態(tài)寄存器特權(quán)模式下可讀可寫(xiě)不能直接訪問(wèn)異常處理能夠全盤(pán)處理不能處理3ARM指令集與x86指令集的主要不同點(diǎn)ARM指令集規(guī)整指令格式即:正交指令格式三地址指令由指令的附加位決定運(yùn)算完畢后是否改變狀態(tài)標(biāo)志狀態(tài)標(biāo)志位只有4位有兩種指令密度無(wú)整數(shù)除法指令大多數(shù)ARM指令都可以條件執(zhí)行有適合DSP處理的乘加指令Load/Store訪存體系結(jié)構(gòu)x86指令集非規(guī)整指令格式即:非正交指令格式二地址指令指令隱含決定運(yùn)算完畢后是否改變狀態(tài)標(biāo)志狀態(tài)標(biāo)志位有6位單一指令密度有整數(shù)除法指令專用條件判斷指令進(jìn)行程序分支沒(méi)有適合DSP處理的乘加指令運(yùn)算指令能夠訪問(wèn)存儲(chǔ)器44.6.2ARM指令集的編碼格式和語(yǔ)法一條典型的ARM指令語(yǔ)法如下所示:<opcode>{<cond>}{S}<Rd>,<Rn>{,<Operand2>}其中:<opcode>是指令助記符,決定了指令的操作。 例如:ADD表示算術(shù)加操作指令。{<cond>}是指令執(zhí)行的條件,可選項(xiàng)。{S}決定指令的操作是否影響CPSR的值,可選項(xiàng)。<Rd>表示目標(biāo)寄存器,必有項(xiàng)。<Rn>表示包含第1個(gè)操作數(shù)的寄存器,當(dāng)僅需要一個(gè)源操作數(shù)時(shí)可省略。<Operand2>表示第2個(gè)操作數(shù),可選項(xiàng)。 第2操作數(shù)有兩種格式:#immed_8r,Rm{,Shift}5ARM數(shù)據(jù)處理指令中第2操作數(shù)編碼格式圖解6靈活的第2操作數(shù)立即數(shù)型格式:

#<32位立即數(shù)>也寫(xiě)成#immed_8r#<32位立即數(shù)>是取值為數(shù)字常量的表達(dá)式,并不是所有的32位立即數(shù)都是有效的。有效的立即數(shù)很少。它必須由一個(gè)8位的立即數(shù)循環(huán)右移偶數(shù)位得到。原因是32位ARM指令中條件碼和操作碼等占用了一些必要的指令碼位,32位立即數(shù)無(wú)法編碼在指令中。舉例:ADDr3,r7,#1020;#immed_8r型第2操作數(shù), ;1020是0xFF循環(huán)右移30位后生成的32位立即數(shù)

;推導(dǎo):1020=0x3FC=0x000003FC 7靈活的第2操作數(shù)(續(xù)1)數(shù)據(jù)處理指令中留給Operand2操作數(shù)的編碼空間只有12位,需要利用這12位產(chǎn)生32位的立即數(shù)。其方法是:把指令最低8位(bit[7:0])立即數(shù)循環(huán)右移偶數(shù)次,循環(huán)右移次數(shù)由2*bit[11:8](bit[11:8]是Operand2的高4位)指定。例如:MOVR4,#0x8000000A ;其中的立即數(shù)#0x8000000A是由8位的0xA8循環(huán)右移0x4位得到。又例如:MOVR4,#0xA0000002 ;其中的立即數(shù)#0xA0000002是由8位的0xA8循環(huán)右移0x6位得到。8靈活的第2操作數(shù)(續(xù)2)寄存器移位型格式:Rm{,<shift>}Rm是第2操作數(shù)寄存器,可對(duì)它進(jìn)行移位或循環(huán)移位。<shift>用來(lái)指定移位類型(LSL,LSR,ASR,ROR或RRX)和移位位數(shù)。其中移位位數(shù)有兩種表示方式,一種是5位立即數(shù)(#shift),另外一種是位移量寄存器Rs的值。參看下面的例子。例子中的R1是Rm寄存器。ADDR5,R3,R1,LSL#2 ;R5←R3+R1*4ADDR5,R3,R1,LSLR4 ;R5←R3+R1*2R4;R4是Rs寄存器,Rs用于計(jì)算右移次數(shù)9寄存器移位方式生成的第2操作數(shù)

Rm{,shift}將寄存器的移位結(jié)果作為操作數(shù),但Rm值保存不變,移位方法如下:ASR #n ;算術(shù)右移n位(1≤n≤32)。LSL #n ;邏輯左移n位(1≤n≤31)。LSR #n ;邏輯右移n位(1≤n≤32)。ROR #n ;循環(huán)右移n位(1≤n≤31)。RRX ;帶擴(kuò)展的循環(huán)右移1位。10寄存器位移方式生成第2操作數(shù)

應(yīng)用舉例ADDR1,R1,R1,LSL#3

;R1=R1*9,因?yàn)镽1←R1+R1*8。SUBR1,R1,R2,LSR#2

;R1=R1-R2÷4,;因?yàn)镽2右移2位相當(dāng)于R2除以4。EORR11,R12,R3,ASR#5

;R11=R12⊕(R3÷32);第2操作數(shù)是R3的內(nèi)容除以3211指令的條件執(zhí)行大多數(shù)ARM指令可包含一個(gè)可選的條件碼{cond},只有CPSR中的條件碼滿足指定條件時(shí),帶條件碼的指令才能執(zhí)行。此外,大多數(shù)ARM指令可以根據(jù)執(zhí)行結(jié)果選擇是事更新條件標(biāo)志,如果更新則指令中須包含字母‘S’:

MOVS R4,R4,LSR#32 ;C標(biāo)志更新為R4的位[31],R4清零。12指令條件碼表(1)條件碼助記符標(biāo)志含義EQZ=1相等NEZ=0不相等CS/HSC=1無(wú)符號(hào)數(shù)大于或等于CC/LOC=0無(wú)符號(hào)數(shù)小于MIN=1負(fù)數(shù)(minus

)PLN=0正數(shù)或零VSV=1上溢出VCV=0沒(méi)有上溢出13指令條件碼表(2)條件碼助記符標(biāo)志含義HIC=1,Z=0無(wú)符號(hào)數(shù)大于LSC=0,Z=l無(wú)符號(hào)數(shù)小于或等于GEN=V有符號(hào)數(shù)大于或等于LTN!=V有符號(hào)數(shù)小于GTZ=0,N=V有符號(hào)數(shù)大于LEZ=1,N!=V有符號(hào)數(shù)小于或等于AL任何無(wú)條件執(zhí)行(指令默認(rèn)條件)NVARMv3之前該指令從不執(zhí)行144.6.3ARM處理器尋址方式尋址方式是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有8種基本尋址方式,以下列出:寄存器尋址 -立即尋址寄存器偏移尋址 -寄存器間接尋址基址尋址 -多寄存器尋址堆棧尋址 -相對(duì)尋址15寄存器尋址操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。寄存器尋址指令舉例如下:MOVR1,R2 ;讀取R2的值送到R1MOVR0,R0 ;R0=R0,相當(dāng)于無(wú)操作SUBR0,R1,R2 ;R0←R1-R2;將R1的值減去R2的值,結(jié)果保存到R0ADDR0,R1,R2 ;R0←R1+R2;這條指令將兩個(gè)寄存器(R1和R2)的內(nèi)容相加,結(jié)果放入第3個(gè)寄存器R0中。必須注意寫(xiě)操作數(shù)的順序:第1個(gè)是結(jié)果寄存器,然后是第一操作數(shù)寄存器,最后是第二操作數(shù)寄存器。16立即尋址立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身。也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBSR0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOVR0,#0xFF000;將十六進(jìn)制立即數(shù)0xFF000裝入R0寄存器立即數(shù)要以“#”號(hào)為前綴,16進(jìn)制數(shù)值時(shí)以“0x”表示。17寄存器偏移尋址寄存器偏移尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?作數(shù)是寄存器偏移方式時(shí),第2個(gè)寄存器操作數(shù)在與第1操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器偏移尋址指令舉例如下:MOVR0,R2,LSL#3;R2的值左移3位,結(jié)果放入R0,即R0=R2×8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后與R1相“與”,結(jié)果放入R1,并且影響標(biāo)志位。SUBR11,R12,R3,ASR#5;R12―R3÷32,然后存入R11。18寄存器偏移尋址(續(xù))可采用的移位操作如下:LSL:邏輯左移(LogicalShiftLeft),低端空出位補(bǔ)0。LSR:邏輯右移(LogicalShiftRight),高端空出位補(bǔ)0。ASR:算術(shù)右移(ArithmeticShiftRight),移位過(guò)程中保持符號(hào)位不變,即若源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ)0;否則補(bǔ)1。ROR:循環(huán)右移(RotateRight),由字低端移出的位填入字高端空出的位。RRX:帶擴(kuò)展的循環(huán)右移(RotateRightextendedbylplace),操作數(shù)右移1位,高端空出的位用原C標(biāo)志值填充。如果指定后綴“S”,則將Rm原值的位[0]移到進(jìn)位標(biāo)志。19移位操作示意圖各種移位操作如下圖所示:20寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDRR1,[R2]

將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出,保存在R1中。SWPR1,R1,[R2]

將寄存器R1的值與R2指定的存儲(chǔ)單元的內(nèi)容交換21基址加偏移尋址基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問(wèn)基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問(wèn)等?;穼ぶ分噶钆e例如下:LDRR2,[R3,#0x0C]

讀取R3+0x0C地址上的存儲(chǔ)單元的內(nèi)容,放入R2。STRR1,[R0,#-4]! ;[R0-4]←[R1],R0=R0-4,符號(hào)“!”表明指令在完成數(shù)據(jù)傳送后應(yīng)該更新基址寄存器,否則不更新;屬前索引。LDR

R2,[R3],#0x0C;R2=[R3],R3=R3+0x0C稱為后索引22基址加索引尋址指令舉例LDRR1,[R0,R3,LSL#1] ;將R0+R3×2地址上的存儲(chǔ)單元的內(nèi)容讀出,存入R1。LDRR0,[R1,R2,LSL#2]!

;將內(nèi)存起始地址為R1+R2*4的字?jǐn)?shù)據(jù)讀取到R0中,

;同時(shí)修改R1,使得:R1=R1+R2*4。LDRR0,[R1,R2]!

;以R1+R2值為地址,訪問(wèn)內(nèi)存。將該位置的字?jǐn)?shù)據(jù)讀

;取到R0中,同時(shí)修改R1,使得:R1=R1+R2。

;屬于前索引指令23多寄存器尋址多寄存器尋址即是一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIAR1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到R2~R7、R12中;(R1自動(dòng)增加)STMIAR0!,{R2-R7,R12};將寄存器R2~R7、R12的值保存到R0指向的存儲(chǔ)單元中,;(R0自動(dòng)增加)使用多寄存器尋址指令時(shí),寄存器子集的順序是按由小到大的順序排列,連續(xù)的寄存器可用“-”連接;否則用“,”分隔書(shū)寫(xiě)。24多寄存器尋址(續(xù)1)多寄存器尋址指令舉例LDMIAR1!,{R0,R2,R5};;R0←[R1];R2←[R1+4];R5←[R1+8];R1保持自動(dòng)增值;寄存器列表{R0,R2,R5}與{R2,R0,R5}等效多寄存器指令的執(zhí)行順序與寄存器列表次序無(wú)關(guān),而與寄存器的序號(hào)保持一致。25多寄存器指令的執(zhí)行順序舉例1通過(guò)ADS集成開(kāi)發(fā)環(huán)境的AXD調(diào)試器窗口觀察26多寄存器指令的執(zhí)行順序舉例2通過(guò)ADS集成開(kāi)發(fā)環(huán)境的AXD調(diào)試器窗口觀察27多寄存器尋址(續(xù)2)下面是多寄存器傳送指令STM舉例如下:STMIAR0!,{R1—R7};將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針在保存第一;個(gè)值之后增加,增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)STMIBR0!,{R1—R7};將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針在保存第一;個(gè)值之前增加,增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)STMDAR0!,{R1—R7};將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針在保存第一;個(gè)值之后增加,增長(zhǎng)方向?yàn)橄蛳略鲩L(zhǎng)STMDBR0!,{R1—R7};將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針在保存第一;個(gè)值之前增加,增長(zhǎng)方向?yàn)橄蛳略鲩L(zhǎng)28堆棧尋址存儲(chǔ)器堆??煞譃閮煞N:向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧。向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧。滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng)空堆棧堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置29堆棧尋址(續(xù)1)有4種類型的堆棧組合滿遞增:堆棧通過(guò)增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。指令如LDMFA、STMFA等??者f增:堆棧通過(guò)增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置。指令如LDMEA、STMEA等。滿遞減:堆棧通過(guò)減小存儲(chǔ)器的地址向下增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址。指令如LDMFD、STMFD等??者f減:堆棧通過(guò)減小存儲(chǔ)器的地址向下增長(zhǎng),堆棧指針指向堆棧下的第一個(gè)空位置。指令如LDMED、STMED等。30堆棧尋址(續(xù)2)堆棧尋址指令舉例如下:STMFDSP!,{R1—R7,LR};將R1~R7、LR入棧(push),滿遞減堆棧。LDMFDSP!,{R1—R7,LR};數(shù)據(jù)出棧(pop),放入R1~R7、LR寄存器。;滿遞減堆棧31多寄存器傳送指令映射表STM=將寄存器內(nèi)容存入內(nèi)存單元(堆棧操作:入棧)LDM=將內(nèi)存單元內(nèi)容存入寄存器(堆棧操作:出棧)32多寄存器傳送指令說(shuō)明數(shù)據(jù)塊傳送:I=向地址增大方向處理數(shù)據(jù)傳送(Increment)D=向地址減小方向處理數(shù)據(jù)傳送(Decrement)A=先傳送數(shù)據(jù)后改變地址(after)B=先改變地址后傳送數(shù)據(jù)(before)堆棧操作:F=滿棧頂指針(full)E=空棧頂指針(empty)A=堆棧向高地址方向增長(zhǎng)(ascendingstack)D=堆棧向低地址方向增長(zhǎng)(decendingstack)33相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下:BL SUBR1;保存子程序返回地址

... ;調(diào)用到SUBR1子程序BEQ LOOP

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

…LOOP MOV R6,#1 …SUBR1 …相對(duì)尋址34相對(duì)尋址舉例

BLSUBR ;轉(zhuǎn)移到SUBR ……… ……...SUBR ….. ;子程序入口

….. MOVPC,R14 ;返回;R14也就是LR35課后練習(xí)1,使用兩種類型的第2操作數(shù),分別編寫(xiě)3條ARM指令,并且說(shuō)明這些指令中的第2操作數(shù)的形成方法。2,在ARM指令中,第二個(gè)數(shù)為常數(shù)時(shí)以下哪些數(shù)合法,哪些數(shù)不合法?

0x3FC、0x1FE、0、0xF0000000、0xFFFF、0xF0000010、200、0xF0000001、511、0x1010、364.6.4ARM指令集分類說(shuō)明ARM指令集大致分為6類:分支指令、Load/Store指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器指令、異常中斷指令、協(xié)處理器指令。以下分別介紹其中的主要指令。37(一)

分支指令A(yù)RM有兩種方法可以實(shí)現(xiàn)程序分支轉(zhuǎn)移。跳轉(zhuǎn)指令所謂的長(zhǎng)跳轉(zhuǎn)直接向PC寄存器(R15)中寫(xiě)入目標(biāo)地址。ARM跳轉(zhuǎn)指令有以下4種:①B分支指令,語(yǔ)法B{cond}label②BL帶鏈接分支指令語(yǔ)法:BL{cond}label③BX分支并可選地交換指令集語(yǔ)法:BX{cond}Rm④BLX帶鏈接分支并可選擇地交換指令集。語(yǔ)法:BLX{cond}label|Rm38BL指令舉例BL指令的意義:BranchandLink示例:

……..……..

bl

MyPro ;調(diào)用子程序MyPro ………..MyPro ;子程序MyPro本體

……….. ………..

movPC,LR ;將R14的值送入R15,返回39BX指令使用舉例通過(guò)使用BX指令可以讓ARM處理器內(nèi)核工作狀態(tài)在ARM狀態(tài)和Thumb狀態(tài)之間進(jìn)行切換。參看下例:;從ARM狀態(tài)轉(zhuǎn)變?yōu)門(mén)humb狀態(tài)

LDR R0,=Sub_Routine+1 BX R0;從Thumb狀態(tài)轉(zhuǎn)變?yōu)锳RM狀態(tài)

LDR R0,=Sub_Routine BX R040長(zhǎng)跳轉(zhuǎn)直接向PC寄存器寫(xiě)入目標(biāo)地址值,可以實(shí)現(xiàn)4GB地址空間中的任意跳轉(zhuǎn)。示例:以下的兩條指令實(shí)現(xiàn)了4GB地址空間中的子程序調(diào)用。MOVLR,PC ;保存返回地址MOVR15,#0x00110000 ;無(wú)條件轉(zhuǎn)向絕對(duì)地址0x110000 ;此32位立即數(shù)地址應(yīng)滿足單字節(jié)循環(huán)右移偶數(shù)次41(二)

Load/Store指令Load/Store指令用于在存儲(chǔ)器和處理器之間傳輸數(shù)據(jù)。Load用于把內(nèi)存中的數(shù)據(jù)裝載到寄存器,Store指令用于把寄存器中的數(shù)據(jù)存入內(nèi)存。共有3種類型的Load/Store指令:?jiǎn)渭拇嫫鱾鬏斨噶疃嗉拇嫫鱾鬏斨噶罱粨Q指令42單寄存器傳送指令助記碼操作指令描述LDR把一個(gè)字裝入一個(gè)寄存器Rd←mem32[address]STR從一個(gè)寄存器保存一個(gè)字Rd→mem32[address]LDRB把一個(gè)字節(jié)裝入一個(gè)寄存器Rd←mem8[address]STRB從一個(gè)寄存器保存一個(gè)字節(jié)Rd→mem8[address]LDRH把一個(gè)半字裝入一個(gè)寄存器Rd←mem16[address]STRH從一個(gè)寄存器保存一個(gè)半字Rd→mem16[address]LDRSB把一個(gè)有符號(hào)字節(jié)裝入寄存器Rd←符號(hào)擴(kuò)展(mem8[address])LDRSH把一個(gè)有符號(hào)半字裝入寄存器Rd←符號(hào)擴(kuò)展(mem16[address])43Load/Store指令變址模式變址模式有四種:零偏移、前變址、后變址、回寫(xiě)前變址。變址模式數(shù)據(jù)基址寄存器指令舉例零偏移mem[base]直接基址寄存器尋址LDRr0,[r1]回寫(xiě)前變址mem[base+offset]基址寄存器加偏移量LDRr0,[r1,#4]!前變址mem[base+offset]不變LDRr0,[r1,#4]后變址mem[base]基址寄存器加偏移量LDRr0,[r1],#444單寄存器傳送指令舉例LDRR2,[R3,#0x0C]

讀取R3+0x0C地址上的一個(gè)字?jǐn)?shù)據(jù)內(nèi)容,放入R2。屬前變址。STRR1,[R0,#-4]! [R0-4]←[R1],R0=R0-4,符號(hào)“!”表明指令在完成數(shù)據(jù)傳送后應(yīng)該更新基址寄存器,否則不更新;屬回寫(xiě)前變址。LDRR1,[R0,R3,LSL#1]

將R0+R3×2地址上的存儲(chǔ)單元的內(nèi)容讀出,存入R1。45交換指令SWP操作圖解SWPRd,Rm,[Rn]

46數(shù)據(jù)處理指令A(yù)RM數(shù)據(jù)處理指令大致分為以下6種類型。數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令邏輯運(yùn)算指令比較指令測(cè)試指令乘法指令47(三)ARM數(shù)據(jù)處理指令A(yù)RM數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令(如MOV、MVN);算術(shù)邏輯運(yùn)算指令(如ADD、SUB、AND);比較指令(如CMP、TST)。參見(jiàn)下面的表格數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以影響狀態(tài)標(biāo)志。比較指令CMP、CMN、TST和TEQ不需要后綴S,它們會(huì)直接影響狀態(tài)標(biāo)志。48ARM數(shù)據(jù)處理指令集助記符說(shuō)明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送指令Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送指令Rd←(~operand2)MVN{cond}{S}ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法指令Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}49ARM數(shù)據(jù)處理指令集(續(xù))助記符說(shuō)明操作條件碼位置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}CMPRn,operand2比較指令標(biāo)志N,Z,C,V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N,Z,C,V←Rn+operand2CMN{cond}TSTRn,operand2位測(cè)試指令標(biāo)志N,Z,C,V←Rn&operand2TST{cond}TEQRn,operand2相等測(cè)試指令標(biāo)志N,Z,C,V←Rn^operand2TEQ{cond}50乘法指令A(yù)RM7TDMI(-S)具有32×32乘法指令、32×32乘加指令,32×32結(jié)果為64位的乘/乘加指令。ARM乘法指令如下表所列。助記符說(shuō)明操作條件碼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位無(wú)符號(hào)乘法指令(RdLo,RdHi)←Rm×RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無(wú)符號(hào)乘加指令(RdLo,RdHi←Rm×Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號(hào)乘法指令(RdLo,RdHi)←Rm×RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號(hào)乘加指令(RdLo,RdHi←Rm×Rs+(RdLo,RdHi)SMLAL{cond}{S}51(四)

程序狀態(tài)寄存器指令讀狀態(tài)寄存器指令MRS寫(xiě)狀態(tài)寄存器指令MSR指令舉例開(kāi)中斷與關(guān)中斷52讀狀態(tài)寄存器指令MRS在ARM處理器中,只有MRS指令可以將狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中。指令格式如下:MRS{cond}Rd,psr其中:Rd目標(biāo)寄存器。Rd不允許為R15。psrCPSR或SPSR。指令舉例如下:MRSR1,CPSR;將CPSR狀態(tài)寄存器讀取,保存到R1中。MRSR2,SPSR;將SPSR狀態(tài)寄存器讀取,保存到R2中。53寫(xiě)狀態(tài)寄存器指令MSR在ARM處理器中,只有MSR指令可以直接設(shè)置狀態(tài)寄存器CPSR或SPSR。指令格式如下:MSR{cond}psr_fields,#immed_8rMSR{cond}psr_fields,Rm其中:psr CPSR或SPSR。fields 指定傳送的區(qū)域。54寫(xiě)狀態(tài)寄存器指令MSR(續(xù))fields可以是以下的一種或多種;(字母必須為小寫(xiě));

c

控制域屏蔽字節(jié)(psr[7…0]);

x

擴(kuò)展域屏蔽字節(jié)(psr[15…8]);

s

狀態(tài)域屏蔽字節(jié)(psr[23…16]);

f

標(biāo)志域屏蔽字節(jié)(psr[31…24])。immed_8r 要傳送到狀態(tài)寄存器指定域的立即數(shù),8位。Rm

要傳送到狀態(tài)寄存器指定域的數(shù)據(jù)的源寄存器。55MSR指令舉例MSR指令舉例如下:

MSRCPSR_c,#0xD3

;CPSR[7…0]=0xD3,即切換到管理模式,0b11010011 MSRCPSR_cxsf,R3

;CPSR=R356使能IRQ中斷(開(kāi)中斷)ENABLE_IRQ MRS R0,CPSR BIC R0,R0,#0x80 MSR CPSR_c,R0 MOV PC,LRI位=0

開(kāi)中斷57禁能IRQ中斷(關(guān)中斷)DISABLE_IRQ MRSR0CPSR ORRR0,R0,#0x80 MSRCPSR_c,R0 MOVPC,LRI位=1

關(guān)中斷58MSR指令說(shuō)明程序中不能通過(guò)MSR指令直接修改CPSR中的T控制位來(lái)實(shí)現(xiàn)ARM狀態(tài)/Thumb狀態(tài)的切換,必須使用BX指令完成處理器狀態(tài)的切換(因?yàn)锽X指令屬分支指令,它會(huì)打斷流水線狀態(tài),實(shí)現(xiàn)處理器狀態(tài)切換)。MRS與MSR配合使用,實(shí)現(xiàn)CPSR或SPSR寄存器的讀一修改一寫(xiě)操作,可用來(lái)進(jìn)行處理器模式切換、允許/禁止IRQ/FIQ中斷等設(shè)置,如下面的程序清單所示。59堆棧指令初始化INITSTACKMOVR0,LR;保存返回地址MSRCPSR_c,#0xD3LDRSP,StackSvc;設(shè)置管理模式堆棧,M[4:0]=0b10011MSRCPSR_c,#0xD2LDRSP,StackIrq;設(shè)置中斷模式堆棧,M[4:0]=0b10010MOVPC,R060(五)

ARM協(xié)處理器指令A(yù)RM支持協(xié)處理器操作。協(xié)處理器控制通過(guò)協(xié)處理器命令實(shí)現(xiàn)。助記符說(shuō)明操作條件碼CDPcoproc,opcode1,CRd,CRn,CRm{,opcode2}協(xié)處理器數(shù)據(jù)操作指令取決于協(xié)處理器CDP{cond}LDC{1}coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)讀取指令取決于協(xié)處理器LDC{cond}{L}STC{1}coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)寫(xiě)入指令取決于協(xié)處理器STC{cond}{L}61ARM協(xié)處理器指令(續(xù))助記符說(shuō)明操作條件碼MCRcoproc,opcode1,Rd,CRn,CRm{,opcode2}ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令取決于協(xié)處理器MCR{cond}MRCcoproc,opcode1,Rd,CRn,CRm{,opcode2)協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令取決于協(xié)處理器MRC{cond}62(六)軟中斷指令SWISWI指令用于產(chǎn)生軟中斷,從而實(shí)現(xiàn)從用戶模式變換到管理模式,CPSR保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。在其它模式下也可使用SWI指令,處理器同樣地切換到管理模式。指令格式如下:SWI{cond}immed_24//Thumb指令是immed_8其中:immed_24是24位立即數(shù),值為0~16,777,215之間的整數(shù)。立即數(shù)用于指定指令請(qǐng)求的具體SWI服務(wù)。指令舉例如下:SWI 0 ;軟中斷,中斷立即數(shù)為0SWI 0x123456 ;軟中斷,中斷立即數(shù)為0x12345663獲得SWI指令的立即數(shù)在SWI異常中斷處理程序中,取出SWI立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過(guò)對(duì)SPSR訪問(wèn)得到;然后取得該SWI指令的地址,這可通過(guò)訪問(wèn)LR寄存器得到;接著讀出指令,分解出立即數(shù)。程序清單如下所示。64獲得SWI指令的立即數(shù)(續(xù))T_bit EQU 0x20SWI_Handler STMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場(chǎng)保護(hù)

MRSR0,SPSR ;讀取SPSR STMFDSP!,{R0} ;保存SPSR TST R0,#T_bit ;測(cè)試T標(biāo)志位,CPSR第M5位

;T=1表明執(zhí)行Thumb指令

LDREQHR0,[LR,#-2] ;若是Thumb指令,則讀取指令碼(16位) BICEQR0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)

LDRNER0,[LR,#-4] ;若是ARM指令,則讀取指令碼(32位) BICNE

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論