版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章ARM指令表3.1ARM指令學(xué)習(xí)程序框架3.2ARM指令格式3.3ARM指令尋址方式3.4ARM指令匯總本章小結(jié)3.1ARM指令學(xué)習(xí)程序框架
按照1.3.2小節(jié)中的方法,建立工程文件ex3_1.mcp,其中,源文件名為InstAn.s。在圖1-16中,指定ROBase為0x30000000(對(duì)于UP-NETARM2410實(shí)驗(yàn)箱出廠設(shè)置)或者0x40000000(對(duì)于SBC2440出廠設(shè)置)。需要說(shuō)明的是,如果用戶(hù)更新了實(shí)驗(yàn)箱上的FLASH內(nèi)容,則需要按照第五章的內(nèi)容進(jìn)行ARM匯編語(yǔ)言程序設(shè)計(jì),即需要添加初始化S3C2410芯片的程序段。
InstAn.s的代碼如下:
1
AREAInstAn,CODE,READONLY
2
ENTRY
3START
4
;<InstructionstobeAnalyzed>
5
;<ResultswillbeshowninRegisters>
6
;<EntertheRealViewDebuggerthenPress
Menu
“View|Registers”>
7;HereisanexamplewhichshowstheusageofMOV:
8MOVR0,#0x78
9MOVR2,R0
10STOP
11
BL STOP
12END上面的程序段中分號(hào)后面的為注釋?zhuān)琒TART標(biāo)號(hào)要頂格寫(xiě),START標(biāo)號(hào)后面書(shū)寫(xiě)需要分析的ARM指令,分析結(jié)果要在RealViewDebugger調(diào)試器的寄存器中查看(本書(shū)中不會(huì)出現(xiàn)printf等輸出信息到控制臺(tái)的語(yǔ)句,而很多與ARM相關(guān)的書(shū)里面都有類(lèi)似的語(yǔ)句。本書(shū)程序的輸出結(jié)果通過(guò)四種方式查看,即寄存器、存儲(chǔ)器、顯示屏等硬件輸出設(shè)備或計(jì)算機(jī)串行終端顯示)。上述程序演示了MOV指令的部分功能,其中,“MOVR0,#0x78”執(zhí)行后,R0寄存器的值為0x78,“MOVR2,R0”執(zhí)行后,寄存器R2的值為0x78。程序最后要有一個(gè)循環(huán)語(yǔ)句。3.2ARM指令格式
全部ARM指令的字長(zhǎng)均為32位,按字對(duì)齊方式存儲(chǔ)(一個(gè)字等于4個(gè)字節(jié)),如果第一條ARM指令的地址為0x00000000,則其下一條指令的地址為0x00000004,依次類(lèi)推,即存儲(chǔ)器中ARM指令的地址的最低兩位總為0。
ARM指令的匯編語(yǔ)言語(yǔ)法格式為
<opcode>{<cond>}{S}<Rd>,<Rn>{,<shifter_operand>}
其中:<>為必需項(xiàng),{}為可選項(xiàng)。
opcode表示ARM指令匯編語(yǔ)言助記符,如ADC、ADD等,針對(duì)ARM920T(即ARMv4T)而言,具體內(nèi)容參見(jiàn)表3-1。表3-1基于ARMv4T架構(gòu)的ARM指令助記符序號(hào)助記符序號(hào)助記符序號(hào)助記符序號(hào)助記符1ADC14LDR27MUL40STRH2ADD15LDRB28MVN41STRT3AND16LDRBT29ORR42SUB4B17LDRH30RSB43SWI5BIC18LDRSB31RSC44SWP6BL19LDRSH32SBC45SWPB7BX20LDRT33SMLAL46TEQ8CDP21MCR34SMULL47TST9CMN22MLA35STC48UMLAL10CMP23MOV36STM49UMULL11EOR24MRC37STR12LDC25MRS38STRB13LDM26MSR39STRBT
cond表示指令執(zhí)行的條件碼助記符。所有ARM指令都是條件執(zhí)行的:當(dāng)條件滿(mǎn)足時(shí),指令執(zhí)行;當(dāng)條件不滿(mǎn)足時(shí),指令不執(zhí)行。條件碼位于指令機(jī)器編碼的高4位,如圖3-1所示,即第31~28位,共有24=16種條件碼,其含義和助記符如表3-2所示。
S表示如果指令中有S后綴,則指令執(zhí)行將影響CPSR的值,否則不影響。
Rd表示目的寄存器。
Rn表示第一個(gè)源操作數(shù)寄存器。
shifter_operand表示第二個(gè)源操作數(shù)。圖3-1ARM指令機(jī)器碼匯總表3-2指令條件碼助記符及其含義條件碼[31:28]條件碼助記符<cond>含義CPSR中條件標(biāo)志位值0000EQ相等Z=10001NE不相等Z=00010CS/HS無(wú)符號(hào)數(shù)大于或等于C=10011CC/LO無(wú)符號(hào)數(shù)小于C=00100MI負(fù)數(shù)N=10101PL非負(fù)數(shù)N=00110VS上溢出V=10111VC未溢出V=01000HI無(wú)符號(hào)數(shù)大于C=1且Z=01001LS無(wú)符號(hào)數(shù)小于或等于C=0且Z=11010GE有符號(hào)數(shù)大于或等于(N=1且V=1)或(N=0且V=0),即N=V1011LT有符號(hào)數(shù)小于(N=1且V=0)或(N=0且V=1),即N≠V1100GT有符號(hào)數(shù)大于Z=0且N=V1101LE有符號(hào)數(shù)小于或等于Z=1且N≠V1110AL無(wú)條件執(zhí)行-1111---
一般地,一條ARM匯編語(yǔ)言指令編譯后對(duì)應(yīng)于一條可執(zhí)行的32位ARM機(jī)器碼指令,ARM機(jī)器碼指令如圖3-1所示,其中第31~28位為條件碼,從圖3-1中可以分析出各操作數(shù)所占的位數(shù)及可能的取值范圍。例如,Rn、Rd、Rs和Rm用于表示寄存器R0~R15中的某個(gè),故均占有4位。
3.3ARM指令尋址方式
ARM指令尋址方式本質(zhì)上是ARM匯編指令的編碼規(guī)則,熟悉ARM指令尋址方式,有助于寫(xiě)出正確的ARM指令。在學(xué)習(xí)復(fù)雜的匯編語(yǔ)言指令集時(shí),指令尋址方式顯得尤為重要;盡管基于RISC指令集的ARM指令數(shù)量較少,但是了解ARM指令的尋址方式,可以更深入地掌握ARM匯編指令集。按照指令操作數(shù)類(lèi)型,ARM指令集分為五種尋址方式,依次為數(shù)據(jù)處理操作數(shù)尋址、字與無(wú)符號(hào)字節(jié)存儲(chǔ)/裝入尋址、雙字與半字及有符號(hào)字節(jié)存儲(chǔ)/裝入尋址、寄存器批量存儲(chǔ)/裝入尋址、協(xié)處理器存儲(chǔ)/裝入尋址。3.3.1數(shù)據(jù)處理操作數(shù)尋址
數(shù)據(jù)處理操作數(shù)尋址方式的指令語(yǔ)法為:
<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>
其中,<shifter_operand>有11種形式,如下所述。
模式1:立即數(shù)
機(jī)器碼:如圖3-2所示。圖3-2形式1的ARM指令編碼語(yǔ)法:#<immediate>
這里,immediate為以圖3-2中8位immed_8為低8位、高24位補(bǔ)0后的32位數(shù)循環(huán)右移2×rotate_imm位得到的立即數(shù)。因此,并非所有32位的數(shù)都能充當(dāng)立即數(shù),同時(shí),規(guī)定當(dāng)立即數(shù)小于0xFF時(shí),immed_8=immediate,rotate_imm=0;當(dāng)立即數(shù)大于0xFF時(shí),選擇使rotate_imm數(shù)值最小的編碼形式。容易推算,0xFF1和0x102等是不合法的立即數(shù),而0xFF0和0x104等則是合法的立即數(shù)。立即數(shù)0x3F0滿(mǎn)足編碼方式:
(1)?immed_8=0x3F,rotate_imm=0xE;
(2)?immed_8=0xFC,rotate_imm=0xF。此時(shí),采用(1)方式編碼,因?yàn)榉绞?1)下rotate_imm較小。如果在編程時(shí)寫(xiě)錯(cuò)了立即數(shù),編譯時(shí)會(huì)報(bào)錯(cuò)!
示例:MOVR0,#0x03
ADDR3,R3,#1
模式2:寄存器
機(jī)器碼:如圖3-3所示。圖3-3形式2的ARM指令編碼語(yǔ)法:<Rm>
這里,Rm為操作數(shù)的值;如果Rm或Rn指定為R15,則使用當(dāng)前指令地址值加上8后的值。
示例:
ADDR3,R3,R0
ADDR3,R3,R15
;注:如果該指令地址為0x30000010,其運(yùn)算為:
;
R3=R3+0x30000010+8
模式3:寄存器邏輯左移立即數(shù)
機(jī)器碼:如圖3-4所示。圖3-4形式3的ARM指令編碼語(yǔ)法:<Rm>,LSL#<shift_imm>這里,操作數(shù)等于Rm的值邏輯左移shift_imm位。如果Rm或Rn指定為15,則操作數(shù)使用當(dāng)前指令地址值加上8后的值。示例:MOVR1,R0,LSL#2模式4:寄存器邏輯左移寄存器
機(jī)器碼:如圖3-5所示。圖3-5形式4的ARM指令編碼語(yǔ)法:<Rm>,LSL<Rs>這里,操作數(shù)為Rm的值邏輯左移Rs[7:0]位。因此,當(dāng)Rs[7:0]大于等于32時(shí),操作數(shù)將為0。R15不能用作Rn、Rd、Rs或Rm。示例:MOVR2,R0,LSLR1模式5:寄存器邏輯右移立即數(shù)
機(jī)器碼:如圖3-6所示。圖3-6形式5的ARM指令編碼語(yǔ)法:<Rm>,LSR#<shift_imm>這里,操作數(shù)為寄存器Rm的值右移shift_imm位。如果Rm或Rn指定R15,則操作數(shù)使用當(dāng)前指令地址值加上8后的值。示例:MOVR2,R0,LSR#1模式6:寄存器邏輯右移寄存器
機(jī)器碼:如圖3-7所示。圖3-7形式6的ARM指令編碼語(yǔ)法:<Rm>,LSR<Rs>這里,操作數(shù)為Rm的值右移Rs[7:0]位。R15不能用作Rd、Rs、Rm或Rn。示例:MOVR2,R0,LSRR1模式7:寄存器算術(shù)右移立即數(shù)
機(jī)器碼:如圖3-8所示。圖3-8形式7的ARM指令編碼語(yǔ)法:<Rm>,ASR#<shift_imm>這里,操作數(shù)為Rm算術(shù)右移shift_imm位(要求:1≤shift_imm≤32),按Rm[31]進(jìn)行符號(hào)擴(kuò)展,即如果Rm[31]=0,則左邊補(bǔ)0;如果Rm[31]=1,則左邊補(bǔ)1。因此,當(dāng)shift_imm=32時(shí),操作數(shù)等于0(Rm[31]=0)或等于0xFFFFFFFF(Rm[31]=1)。如果Rm或Rn指定為R15,則操作數(shù)使用當(dāng)前指令地址值加上8后的值。
示例:MOVR2,R1,ASR#4
模式8:寄存器算術(shù)右移寄存器
機(jī)器碼:如圖3-9所示。圖3-9形式8的ARM指令編碼語(yǔ)法:<Rm>,ASR<Rs>
這里,操作數(shù)為Rm的值算術(shù)右移Rs[7:0]位。當(dāng)Rs[7:0]=0時(shí),相當(dāng)于不移位;當(dāng)Rs[7:0]≥32時(shí),操作數(shù)為00(Rm[31]=0)或等于0xFFFFFFFF(Rm[31]=1)。R15不能用作Rn、Rd、Rs或Rm。
示例:MOVR2,R1,ASRR0
模式9:寄存器循環(huán)右移立即數(shù)
機(jī)器碼:如圖3-10所示。圖3-10形式9的ARM指令編碼語(yǔ)法:<Rm>,ROR#<shift_imm>
這里,操作數(shù)循環(huán)右移shift_imm位(要求:1≤shift_imm≤31)。如果Rm或Rn指定為R15,則操作數(shù)使用當(dāng)前指令地址值加上8后的值。
示例:MOVR2,R1,ROR#4
模式10:寄存器循環(huán)右移寄存器
機(jī)器碼:如圖3-11所示。圖3-11形式10的ARM指令編碼語(yǔ)法:<Rm>,ROR<Rs>
這里,操作數(shù)為Rm的值循環(huán)右移<Rs[4:0]>。R15不能用作Rn、Rd、Rs或Rm。
示例:MOVR2,R1,RORR0
模式11:寄存器擴(kuò)展循環(huán)右移
機(jī)器碼:如圖3-12所示。圖3-12形式11的ARM指令編碼語(yǔ)法:<Rm>,RRX
這里,操作數(shù)為Rm的值邏輯右移一位(該位放入Shifter_
carry_out),CPSR的C標(biāo)志位填充Rm的最高位空位。如果Rm或Rn指定R15,則操作數(shù)使用當(dāng)前指令地址值加上8后的值。
示例:MOVR2,R1,RRX
備注:在上述移位操作中,無(wú)論是左移還是右移,最后移出的位的值均存放在Shifter_carry_out中。3.3.2字與無(wú)符號(hào)字節(jié)存儲(chǔ)/裝入尋址
字與無(wú)符號(hào)字節(jié)存儲(chǔ)/裝入尋址方式的指令語(yǔ)法為:
LDR?|?STR{<cond>}{B}{T}<Rd>,<addressing_mode>
其中,{<cond>}、{B}和{T}的位置可調(diào)換;<addressing_
mode>有9種模式(均適用于LDR、LDRB、STR和STRB;只有最后3種模式適用于LDRBT、LDRT、STRBT和STRT),如下所述。
模式1:立即數(shù)偏置
機(jī)器碼:如圖3-13所示。圖3-13模式1的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_12>]這里,操作數(shù)地址為Rn加上或減去12位的立即數(shù)值。U=1時(shí)為加;U=0時(shí)為減。B=0時(shí)為字操作;B=1時(shí)為無(wú)符號(hào)字節(jié)操作。L=0時(shí)為裝入操作;L=1時(shí)為存儲(chǔ)操作。R15為Rn時(shí),使用當(dāng)前指令地址加上8后的值。示例:
LDRR1,[R0,#0x04];將內(nèi)存地址R0+0x4處的值裝入R1中
LDRR1,[R15,#0x04];將內(nèi)存地址PC+8+0x4處的值裝入R1中
備注:要考慮小端或大端存儲(chǔ)模式,例如:在小端模式下,對(duì)于字訪問(wèn)來(lái)說(shuō),地址0x30000000處的字是指0x30000003至0x30000000四個(gè)字節(jié)地址里的字節(jié)從高地址至低地址連接起來(lái)的32位字;地址0x30000001處的字也是指x30000003至0x30000000四個(gè)字節(jié)地址里的字節(jié)從高地址至低地址連接起來(lái)的字,只是最高字節(jié)處于0x30000000處,依次為0x30000003和0x30000002,最低字節(jié)地址為0x30000001。地址0x30000002處的字仍然是指x30000003至0x30000000四個(gè)字節(jié)地址里的字節(jié)連接起來(lái)的字,這時(shí)最高字節(jié)處于0x30000001地址處,依次為0x30000000和0x30000003,最低字節(jié)地址為0x30000002;同理,地址0x30000003處的字仍然是指x30000003至0x30000000四個(gè)字節(jié)地址里的字節(jié)連接起來(lái)的字,這時(shí)最高字節(jié)處于0x30000002地址處,依次為0x30000001和0x30000000,最低字節(jié)地址為0x30000003。大端模式下的排序模式正好相反。
盡管如上所述,作者建議,在進(jìn)行字訪問(wèn)時(shí),12位的立即數(shù)的最后兩位應(yīng)為0b00,即能被4整除。注意:STR表示的操作是向右賦值的。
模式2:寄存器偏置
機(jī)器碼:如圖3-14所示。圖3-14模式2的ARM指令編碼語(yǔ)法:[<Rn>,+/-Rm]這里,操作數(shù)地址為Rn(在此稱(chēng)為基址寄存器)的值加上或減去Rm(在此稱(chēng)為變址寄存器)的值。R15不能用作Rn。示例:LDRBR1,[R0,R2] ;將內(nèi)存地址R0+R2處的字
節(jié)裝入R1中
模式3:尺度寄存器偏置
機(jī)器碼:如圖3-15所示。圖3-15模式3的ARM指令編碼語(yǔ)法:有如下五種:
[<Rn>,+/-<Rm>,LSL#<shift_imm>]
[<Rn>,+/-<Rm>,LSR#<shift_imm>]
[<Rn>,+/-<Rm>,ASR#<shift_imm>]
[<Rn>,+/-<Rm>,ROR#<shift_imm>]
[<Rn>,+/-<Rm>,RRX]
這里,操作數(shù)地址為Rn加上或減去Rm的移位值。對(duì)于LSL,移位立即數(shù)shift_imm為0~31;對(duì)于LSR和ASR,shift_imm為1~32;對(duì)于ROR,shift_imm為1~31。R15不能用作Rm;R15用作Rn時(shí),使用當(dāng)前指令地址加上8后的值。
示例:LDRBR1,[R0,R2,LSL#1]?;將內(nèi)存地址R0+R2<<1
處的字節(jié)值裝入R1中
模式4:立即數(shù)預(yù)索引
機(jī)器碼:如圖3-16所示。圖3-16模式4的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_12]!這里,操作數(shù)地址為Rn的值加上或減去12位的立即數(shù)偏移量后的值,同時(shí),這個(gè)值寫(xiě)入到Rn中。語(yǔ)法中的“!”號(hào)將設(shè)置機(jī)器碼中的W位(即第21位),表示Rn加上或減去立即數(shù)后的值回賦給Rn。R15不能用作Rn。示例:LDRR1,[R0,#0x04]!模式5:寄存器預(yù)索引
機(jī)器碼:如圖3-17所示。圖3-17模式5的ARM指令編碼語(yǔ)法:[<Rn>,+/-<Rm>]!這里,操作數(shù)地址為Rn的值加上或減去Rm的值,這個(gè)地址值回賦給Rn。R15不能用作Rm和Rn。示例:LDRR1,[R0,R2]!;內(nèi)存地址R0+R2處的值賦
;給R1,R0=R0+R2
模式6:尺度寄存器預(yù)索引
機(jī)器碼:如圖3-18所示。圖3-18模式6的ARM指令編碼語(yǔ)法:有如下五種:
[<Rn>,+/-<Rm>,LSL#<shift_imm>]!
[<Rn>,+/-<Rm>,LSR#<shift_imm>]!
[<Rn>,+/-<Rm>,ASR#<shift_imm>]!
[<Rn>,+/-<Rm>,ROR#<shift_imm>]!
[<Rn>,+/-<Rm>,RRX]!
該模式是在模式3操作的基礎(chǔ)上,即操作數(shù)地址為Rn的值加上或減去Rm移位后的值,增加了寫(xiě)回操作,即地址值回賦給Rn。
示例:LDRBR1,[R0,R2,LSL#1]!
;內(nèi)存地址R0+R2<<1處的值裝入R1,
R0=R0+R2<<1
模式7:立即數(shù)后索引
機(jī)器碼:如圖3-19所示。圖3-19模式7的ARM指令編碼語(yǔ)法:[<Rn>],#+/-<offset_12>這里,操作數(shù)地址為Rn的值,如果指令條件滿(mǎn)足,則Rn加上或減去12位立即數(shù)后的值賦給Rn。R15不能用作Rn。示例:LDRR1,[R0],#0x4;內(nèi)存地址R0處的值賦給R1,R0=R0+4模式8:寄存器后索引
機(jī)器碼:如圖3-20所示。圖3-20模式8的ARM指令編碼語(yǔ)法:[<Rn>],+/-<Rm>這里,操作數(shù)地址為Rn的值,指令條件滿(mǎn)足時(shí),Rn加上或減去Rm的值賦給Rn。R15不能用作Rm和Rn。示例:LDRR1,[R0],R2;內(nèi)存地址R0處的值賦給R1,R0=R0+R2模式9:尺度寄存器后索引
機(jī)器碼:如圖3-21所示。圖3-21模式9的ARM指令編碼語(yǔ)法:有如下五種:
[<Rn>],+/-<Rm>,LSL#<shift_imm>
[<Rn>],+/-<Rm>,LSR#<shift_imm>
[<Rn>],+/-<Rm>,ASR#<shift_imm>
[<Rn>],+/-<Rm>,ROR#<shift_imm>
[<Rn>],+/-<Rm>,RRX
這里操作數(shù)地址為Rn的值,Rn加上或減去Rm的移位值后的值賦給Rn。R15不能用作Rm或Rn。
示例:LDRR1,[R0],R2,LSL#0x01;內(nèi)存地址R0處的值賦給R1,R0=R0+R2<<13.3.3雙字與半字及有符號(hào)字節(jié)存儲(chǔ)/裝入尋址
雙字與半字及有符號(hào)字節(jié)存儲(chǔ)/裝入尋址方式的指令語(yǔ)法為:
LDR?|?STR{<cond>}H?|?SH?|?SB?|?D<Rd>,
<addressing_mode>
其中,指令中H、SH、SB或D必有其一,條件<cond>可以放在指令助記符后面,例如,LDRHLS和LDRLSH均合法;<addressing_mode>有如下所述6種模式。
模式1:立即數(shù)偏置
機(jī)器碼:如圖3-22所示。圖3-22模式1下的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_8>]這里,操作數(shù)地址為Rn的值加上或減去8位立即數(shù)偏移量,其中,8位立即數(shù)的高四位為immedH,低四位為immedL。
STR開(kāi)頭的存儲(chǔ)操作為自左向右,LDR開(kāi)頭的裝入操作是自右向左的。圖3-22至圖3-27中,L、S和H的意義為:當(dāng)LSH=0b001時(shí)為存儲(chǔ)半字;當(dāng)LSH=0b010時(shí)為裝入雙字;當(dāng)LSH=0b011時(shí)為存儲(chǔ)雙字;當(dāng)LSH=0b101時(shí)為裝入無(wú)符號(hào)半字;當(dāng)LSH=0b110時(shí)為裝入有符號(hào)字節(jié);當(dāng)LSH=0b111時(shí)為裝入有符號(hào)半字。R15用作Rn時(shí),Rn為當(dāng)前指令地址加上8的值。
注意:對(duì)于半字操作,建議立即數(shù)的最低位為0(實(shí)際上要求的是Rn加上或減去立即數(shù)的值的最低位為0),在小端存儲(chǔ)模式下,返回的半字的高字節(jié)為操作數(shù)地址加1處的值,半字的低字節(jié)為該地址處的值;對(duì)于雙字操作,細(xì)心的讀者可能已經(jīng)從表3-1中查證了,ARMv4T并不支持。如果編程時(shí)寫(xiě)了不支持的ARM指令,在RVDS中編譯時(shí),會(huì)提示“InstructionnotsupportedontargetCPU”(目標(biāo)CPU不支持此指令)。
示例:
LDRHR1,[R0,#0x4] ;內(nèi)存地址R0+4處的半字裝入R1中
;實(shí)際上裝入的是R0+5和R0+4兩處
;的字節(jié)合并值
;要求:R0+4的最低位為0
模式2:寄存器偏置
機(jī)器碼:如圖3-23所示。圖3-23模式2下的ARM指令編碼語(yǔ)法:[<Rn>,+/-<Rm>]這里,操作數(shù)地址為Rn加上或減去Rm的值。R15不能用作Rm;R15用作Rn時(shí),Rn的值取當(dāng)前指令地址加上8。示例:LDRHR1,[R0,R2] ;內(nèi)存地址R0+R2處的半字
;裝入R1中模式3:立即數(shù)預(yù)索引
機(jī)器碼:如圖3-24所示。圖3-24模式3下的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_8>]!這里,操作數(shù)地址為Rn加上或減去8位立即數(shù)的值,同時(shí),該操作數(shù)地址裝入Rn中。8位立即數(shù)的高四位為immedH,低四位為immedL。示例:LDRHR1,[R0,#0x02]!;內(nèi)存地址R0+0x02處的
;半字裝入R1,R0=R0+2
模式4:寄存器預(yù)索引
機(jī)器碼:如圖3-25所示。圖3-25模式4下的ARM指令編碼語(yǔ)法:[<Rn>,+/-<Rm>]!
這里,操作數(shù)地址為Rn加上或減去Rm的值,同時(shí),該操作數(shù)地址裝入Rn中。
示例:LDRHR1,[R0,R2]!;內(nèi)存地址R0+R2處的半字
;裝入R1,R0=R0+R2
模式5:立即數(shù)后索引
機(jī)器碼:如圖3-26所示。圖3-26模式5下的ARM指令編碼語(yǔ)法:[<Rn>],#+/-<offset_8>
這里,操作數(shù)地址為Rn的值,當(dāng)指令執(zhí)行條件滿(mǎn)足時(shí),Rn加上或減去立即數(shù)offset_8的值賦給Rn。立即數(shù)offset_8的高四位為immedH,低四位為immedL。R15不能用作Rn。
示例:LDRHR1,[R0],#0x02;內(nèi)存地址R0處的值裝入
;R1,R0=R0+2
模式6:寄存器后索引
機(jī)器碼:如圖3-27所示。圖3-27模式6下的ARM指令編碼語(yǔ)法:[<Rn>],+/-<Rm>
這里,操作數(shù)地址為Rn的值,當(dāng)指令條件滿(mǎn)足時(shí),Rn加上或減去Rm的值賦給Rn。圖3-27中的SBZ(ShouldBeZero)為0。R15不能用作Rm或Rn。
示例:LDRHR1,[R0],R2 ;內(nèi)存地址R0處的值裝入R1,
;R0=R0+R23.3.4寄存器批量存儲(chǔ)/裝入尋址
寄存器批量存儲(chǔ)/裝入尋址方式的指令語(yǔ)法為:
LDM?|?STM{<cond>}<addressing_mode><Rn>{!},<registers>{^}
其中,<addressing_mode>有如下五種模式。
模式1:事后增加(IA=IncrementAfter)
機(jī)器碼:如圖3-28所示。圖3-28模式1下的ARM指令編碼語(yǔ)法:IA
圖3-28至圖3-31中,對(duì)于LDM指令,當(dāng)PC位于register_list中時(shí),S為1表示SPSR裝入CPSR中;對(duì)于不使用PC的LDM指令和全部STM類(lèi)指令,S為1表示使用用戶(hù)模式下的寄存器組,而非當(dāng)前模式下的寄存器。用戶(hù)模式和系統(tǒng)模式下不能設(shè)置S位為1。W位表示操作完成后基址寄存器的值是否變化,如果W為1,則基址寄存器的值在操作完成后將增加或減少4乘以寄存器列表中包含的寄存器個(gè)數(shù)的值,是增加還是減少,視第23位的值而定,第23位(即U位)為1時(shí)增加,為0時(shí)減少。
L位為1時(shí)表示裝入,為0時(shí)表示存儲(chǔ)。16位長(zhǎng)的寄存器列表register_list,每一位對(duì)應(yīng)于一個(gè)寄存器,即第0位對(duì)應(yīng)于R0,第1位對(duì)應(yīng)于R1,依次類(lèi)推,第15位對(duì)應(yīng)于R15(即PC),列表中至少應(yīng)包含一個(gè)寄存器,多個(gè)寄存器間用逗號(hào)分隔,連續(xù)的寄存器可以用“-”連接,如“R1-R4”表示“R1,R2,R3,R4”,列表用“{}”包括??梢?jiàn),S是指指令語(yǔ)法中的“^”是否存在;W是指指令語(yǔ)法中的“!”是否存在;L是指指令語(yǔ)法中使用LDM還是STM。這里,定義操作數(shù)首地址start_address為基址寄存器Rn的值;操作數(shù)尾地址end_address為Rn與4乘以寄存器列表中寄存器個(gè)數(shù)的和,再減去4的差,即
start_address=Rn,end_address=Rn+4
×(register_list各位中置1的個(gè)數(shù))–4
如果是LDM操作,操作是自左向右的(與LDR等相反),即首地址至尾地址各個(gè)字地址內(nèi)的值對(duì)應(yīng)裝入寄存器列表中;如果是STM操作,操作是自右向左的(與STR等相反),即寄存器列表中各個(gè)寄存器的值存入自首地址至尾地址相對(duì)應(yīng)的地址處。如果指令中使用“!”,則尾地址end_address加上4的值賦給Rn,即
Rn=Rn+4×(register_list各位中置1的個(gè)數(shù))
示例:
STMIAR0,{R1-R4};[0]賦給R1,[R0+4]賦給R2,[R0+8]
;賦給R3,[R0+12]賦給R4
STMIAR0!,{R1-R4};?[R0]賦給R1,[R0+4]賦給R2,
;[R0+8]賦給R3,[R0+12]賦給R4,
;R0=R0+16
說(shuō)明:細(xì)心的讀者調(diào)試指令時(shí)可能會(huì)發(fā)現(xiàn),上述兩個(gè)指令中,不帶有“IA”結(jié)果是一樣的,例如,第一條指令等同于STMR0,{R1-R4},道理是顯然的。模式2:預(yù)先增加(IB=IncrementBefore)
機(jī)器碼:如圖3-29所示。圖3-29模式2下的ARM指令編碼語(yǔ)法:IB這里,首地址為start_address=Rn+4,尾地址為end_address=Rn+4×(register_list各位中置1的個(gè)數(shù)),當(dāng)指令中出現(xiàn)“!”時(shí),Rn=Rn+4×(register_list各位中置1的個(gè)數(shù))。示例:
STMIBR0,{R1-R3} ;?[R0+4]賦給R1,[R0+8]賦給R2,
;[R0+12]賦給R3
STMIBR0!,{R1-R3} ;?[R0+4]賦給R1,[R0+8]賦給R2,
;[R0+12]賦給R3,R0=R0+12
模式3:事后減少(DA=DecrementAfter)
機(jī)器碼:如圖3-30所示。圖3-30模式3下的ARM指令編碼語(yǔ)法:DA
這里,首地址為start_address=Rn-4×(register_list各位中置1的個(gè)數(shù))+4,尾地址為end_address=Rn,當(dāng)指令中出現(xiàn)“!”時(shí),Rn=Rn-4×(register_list各位中置1的個(gè)數(shù))。
示例:
STMDAR0,{R1-R3};[R0-8]賦給R1,[R0-4]賦給R2,
;[R0]賦給R3
STMDAR0!,{R1-R3};[R0-8]賦給R1,[R0-4]賦給R2,
;[R0]賦給R3,R0=R0–12
模式4:預(yù)先減少(DB=DecrementBefore)
機(jī)器碼:如圖3-31所示。圖3-31模式4下的ARM指令編碼語(yǔ)法:DB這里,首地址為start_address=Rn-4×(register_list各位中置1的個(gè)數(shù)),尾地址為end_address=Rn-4,當(dāng)指令中出現(xiàn)“!”時(shí),Rn=Rn-4×(register_list各位中置1的個(gè)數(shù))。示例:
STMDBR0,{R1-R3} ;[R0-12]賦給R1,[R0-8]賦給R2,
;[R0-4]賦給R3
STMDBR0!,{R1-R3};[R0-12]賦給R1,[R0-8]賦給R2,;[R0-4]賦給R3,R0=R0-12模式5:堆棧操作
堆??捎糜诒4婕拇嫫鞯闹担ㄟ^(guò)壓棧(或稱(chēng)入棧)將寄存器的值壓入棧中保存,通過(guò)出棧操作恢復(fù)寄存器中的數(shù)值。盡管堆棧本質(zhì)上是一段連續(xù)的內(nèi)存空間,但是,有其專(zhuān)用的堆棧操作,根據(jù)堆棧指令位置及其移動(dòng)方向,分為四種方式:即FD、ED、FA和EA。其中,F(xiàn)表示Fullstacks,即堆棧指針位置指向棧頂數(shù)據(jù)(如果有壓棧操作,堆棧指針必須首先移動(dòng)到棧頂前面的一個(gè)字空間,因此壓棧(STM)時(shí),F(xiàn)相當(dāng)于Before;如果有出棧操作,由于堆棧指針指向棧頂數(shù)據(jù),只需直接取數(shù)據(jù)即可,因此,出棧(LDM)時(shí),F(xiàn)相當(dāng)于After)。
E表示Emptystacks,即堆棧指針位置指向棧頂數(shù)據(jù)前面的一個(gè)地址空間,如果有一個(gè)壓棧操作,該地址空間將保存數(shù)據(jù)而成為棧頂數(shù)據(jù)(同樣道理,壓棧(STM)時(shí),E相當(dāng)于After;出棧(LDM)時(shí),E相當(dāng)于Before)。F和E表示堆棧指針位置,而D和A表示堆棧指針移動(dòng)方向。D為Descendingstacks,即堆棧指針移動(dòng)方向?yàn)閮?nèi)存地址減少的方向。A為Ascendingstacks,表示堆棧指針移動(dòng)方向?yàn)閮?nèi)存地址增大的方向。因此,有類(lèi)似的8種操作,即LDMFA、LDMFD、LDMEA、LDMED和STMFA、STMFD、STMEA、STMED,對(duì)應(yīng)于機(jī)器碼中L(第20位)、P(第24位)、U(第23位)的值依次為:0b100、0b101、0b110、0b111和0b011、0b0b0、0b001、0b000。出于協(xié)處理對(duì)堆棧訪問(wèn)的支持,建議使用FD或EA方式。
示例程序StackOp.s
1 AREAINIT,CODE,READONLY
2 ENTRY
3START
4 MOV R2,#0x12 ;(1)
5 MOV R3,#0x55 ;(2)
6 MOV R4,#0xAA ;(3)
7
8 MOV R0,#0x30000000 ;(4)
9 MOV R1,#0x800 ;(5)
10 ADD R0,R0,R1 ;(6)
11 MOV SP,R0
;(7)
12
13 STMFD SP!,{R2,R3,R4} ;(8)
14 MOV R4,#0x88 ;(9)
15
16 LDMFD SP!,{R2-R4} ;(10)
17STOP
18 BL STOP
19 END
程序中各標(biāo)號(hào)的解釋如下:
(1)?R2=0x12;
(2)?R3=0x55;
(3)?R4=0xAA;
(4)?R0=0x30000000;
(5)?R1=0x800;
(6)?R0=R0+R1=0x30000800;
(7)?SP=0x30000800;
(8)?[0x300007F4]=0x12,[0x300007F8]=0x55,[0x3000
07FC]=0xAA,
SP=0x300007F4;
(9)?R4=0x88;
(10)?R2=0x12,R3=0x55,R4=0xAA,SP=0x30000800。
請(qǐng)注意SP的值的變化情況。3.3.5協(xié)處理器存儲(chǔ)/裝入尋址
這里討論協(xié)處理器存儲(chǔ)/裝入尋址方式的編碼和語(yǔ)法,第3.4節(jié)中將針對(duì)ARM920T微處理器具體討論協(xié)處理器指令(約5個(gè))的應(yīng)用及示例。
協(xié)處理器存儲(chǔ)/裝入尋址方式的指令語(yǔ)法為:
<opcode>{<cond>}{L}<coproc>,<CRd>,
<addressing_mode>
其中,<addressing_mode>有下述四種模式。
模式1:立即數(shù)偏置
機(jī)器碼:如圖3-32所示。圖3-32模式1下的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_8>*4]圖3-32至圖3-35中,U=1表示加;U=0表示減。N位是協(xié)處理器無(wú)關(guān)的標(biāo)識(shí)位,用于區(qū)分不同長(zhǎng)度的傳遞值。W位(第21位)表示指令中有無(wú)“!”,W=1表示內(nèi)存地址寫(xiě)回寄存器,W=0則不寫(xiě)回。L=1表示裝入,L=0表示存儲(chǔ)。如果指令執(zhí)行條件滿(mǎn)足,那么首地址start_address=Rn+/-offset_8×4(U=1時(shí)取加號(hào),U=0時(shí)取減號(hào)),尾地址end_address=start_address+4×(協(xié)處理器的數(shù)目cp_num)。
R15用作Rn時(shí),Rn的值為當(dāng)前指令地址加上8。
模式2:立即數(shù)預(yù)索引
機(jī)器碼:如圖3-33所示。圖3-33模式2下的ARM指令編碼語(yǔ)法:[<Rn>,#+/-<offset_8>*4]!
如果指令執(zhí)行條件滿(mǎn)足,那么首地址start_address=Rn+/-offset_8×4(U=1時(shí)取加號(hào),U=0時(shí)取減號(hào)),尾地址end_address=start_address+4×(協(xié)處理器的數(shù)目cp_num)。首地址賦給Rn。
R15不能用作Rn。
模式3:立即數(shù)后索引
機(jī)器碼:如圖3-34所示。圖3-34模式3下的ARM指令編碼語(yǔ)法:[<Rn>],#+/-<offset_8>*4
如果指令執(zhí)行條件滿(mǎn)足,那么首地址start_address=Rn,尾地址end_address=start_address+4×(協(xié)處理器的數(shù)目cp_num)。Rn=Rn+/-offset_8×4(U=1時(shí)取加號(hào)U=0時(shí)取減號(hào))。
R15不能用作Rn。
模式4:無(wú)索引
機(jī)器碼:如圖3.35所示。圖3-35模式4下的ARM指令編碼語(yǔ)法:[<Rn>],<option>如果指令執(zhí)行條件滿(mǎn)足,那么首地址start_address=Rn,尾地址end_address=start_address+4×(協(xié)處理器的數(shù)目cp_num)。<option>指定協(xié)處理器額外的指令參數(shù),取值為0~255的整數(shù),用“{}”包括。
R15用作Rn時(shí),Rn的值為當(dāng)前指令地址加上8。
3.4ARM指令匯總
ARMv6指令集版本具有114條ARM指令,但是ARMv4T僅支持其中的49條指令,如表3-1所示。出于節(jié)省篇幅和增強(qiáng)針對(duì)性,這里僅介紹表3-1所示的ARM指令(當(dāng)然,記憶指令是需要時(shí)間和方法的),將這些指令分為九類(lèi),即賦值指令2條、算術(shù)運(yùn)算指令12條、跳轉(zhuǎn)指令3條、比較指令2條、邏輯運(yùn)算指令6條、CPSR訪問(wèn)指令2條、內(nèi)存訪問(wèn)指令16條、軟件中斷指令1條以及協(xié)處理器指令5條,共計(jì)49條。此外,本節(jié)還將介紹4條ARM偽指令。3.4.1賦值指令
賦值指令有2條,即MOV和MVN,如下所述。
MOV指令(賦值)
語(yǔ)法:MOV{<cond>}{S}<Rd>,<Oprand2>
解釋?zhuān)?/p>
cond表示指令執(zhí)行條件,如表3-2所示,只有滿(mǎn)足條件時(shí)指令才能被執(zhí)行。如果cond被忽略,則表示使用了條件碼AL,即該指令總被執(zhí)行。
S出現(xiàn)在指令中時(shí),將設(shè)置指令的S位(第20位)為1,表示指令的執(zhí)行將影響和刷新CPSR寄存器的某些位。
Rd寄存器為目的操作數(shù)。
Oprand2為第二個(gè)操作數(shù),可以為立即數(shù)(是8位整數(shù)左邊擴(kuò)展24個(gè)0后的32位數(shù)循環(huán)右移32以?xún)?nèi)的偶數(shù)位得到的)、寄存器、寄存器移位立即數(shù)和寄存器移位寄存器。移位方式有邏輯左移(LSL)、邏輯右移(LSR)、算術(shù)右移(ASR)、循環(huán)右移(ROR)、帶擴(kuò)展位的循環(huán)右移(RRX)。
用“{}”括起來(lái)的為可選項(xiàng),用“<>”括起來(lái)的為必選項(xiàng)。
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Oprand2如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=最后移出的位(注意:這種說(shuō)法稍欠準(zhǔn)確)
V不受影響用途:
將某個(gè)特定值的立即數(shù)裝入寄存器;將一個(gè)寄存器的值賦給另一個(gè)寄存器;移位操作;左移n位實(shí)現(xiàn)操作數(shù)乘以2n的運(yùn)算;指令“MOVPC,LR”可以實(shí)現(xiàn)跳轉(zhuǎn);當(dāng)PC為目的操作數(shù),且S出現(xiàn)在指令中時(shí),例如,“MOVSPC,LR”執(zhí)行跳轉(zhuǎn)的同時(shí),還將SPSR的值賦給CPSR。
示例:
MOVR1,#0x01 ;?R1=0x1
MOVR2,R1
;?R2=R1=0x1
MOVR3,R2,LSL#0x2 ;?R3=R2<<2=4
MOVR4,R3,LSRR1 ;?R4=R3>>R1=2
MVN指令(取反賦值)
語(yǔ)法:MVN{<cond>}{S}<Rd>,<Oprand2>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Oprand2的取反
如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=最后移出的位
V不受影響
用途:
用作某些位的屏蔽;計(jì)算一個(gè)數(shù)值的二進(jìn)制補(bǔ)碼。
示例:
MVNR4,R3,LSRR1;R4=~(R3>>R1)3.4.2算術(shù)運(yùn)算指令
算術(shù)運(yùn)算指令有12條,即ADD、ADC、MLA、MUL、RSB、RSC、SBC、SMLAL、SMULL、SUB、UMLAL以及UMULL,如下所述。
ADD指令(加法)
語(yǔ)法:ADD{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)?/p>
Rd寄存器為目的操作數(shù)。
Rn寄存器為第一個(gè)源操作數(shù)。
Oprand2為第二個(gè)源操作數(shù),可以為立即數(shù)(是8位整數(shù)左邊擴(kuò)展24個(gè)0后的32位數(shù)循環(huán)右移32以?xún)?nèi)的偶數(shù)位得到的)、寄存器、寄存器移位立即數(shù)和寄存器移位寄存器。移位方式有邏輯左移(LSL)、邏輯右移(LSR)、算術(shù)右移(ASR)、循環(huán)右移(ROR)、帶擴(kuò)展位的循環(huán)右移(RRX)。
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Rn+Oprand2
如果S=1且Rd=R15,那么如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的進(jìn)位
V=結(jié)果的溢出位用途:
實(shí)現(xiàn)兩個(gè)數(shù)值的加法運(yùn)算;使用形如“ADDRx,Rx,#1”實(shí)現(xiàn)累加運(yùn)算;使用形如“ADDRd,Rx,Rx,LSL#n”實(shí)現(xiàn)Rx的(2n+1)倍運(yùn)算;使用形如“ADDRd,PC,#offset”獲得一個(gè)基于PC的相對(duì)地址(此處,PC的值為當(dāng)前指令地址加上8)。
示例:
ADDR2,R1,#2;R2=R1+2
ADDR3,R1,R2;R3=R1+R2
ADDR4,R4,R3,LSL#1;R4=R4+R3<<1
ADC指令(帶進(jìn)位加法)
語(yǔ)法:ADC{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Rn+Oprand2+CPSR的C標(biāo)志位
如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的進(jìn)位
V=結(jié)果的溢出位
用途:
在實(shí)現(xiàn)64位的加法操作時(shí),ADC用于兩個(gè)加數(shù)的高32位數(shù)相加,例如,R1和R0以及R3和R2存入兩個(gè)64位數(shù),其中,R0和R2存放低32位,R1和R3存放高32位,這兩個(gè)64位數(shù)相加的結(jié)果存放在R5和R4中,其中,R4存放結(jié)果的低32位,R5存放結(jié)果的高32位,則指令為
ADDSR4,R0,R2;注意,ADDS要帶有S
ADCR5,R1,R3;如果使用ADCS,則結(jié)果影響CPSR
此外,可以用例如“ADCSR0,R0,R0”實(shí)現(xiàn)帶擴(kuò)展位的逐位循環(huán)移位操作。
示例:略
SUB指令(減法)
語(yǔ)法:SUB{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Rn-Oprand2如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的借位取反
V=結(jié)果的溢出位(這里是指被減數(shù)小于減數(shù)的情況)用途:
實(shí)現(xiàn)數(shù)值的減1操作,形如“SUBRi,Ri,#1”;SUBS由于影響CPSR,在循環(huán)控制中經(jīng)常被用到;SUBS也常用于中斷(或異常)返回中,形如“SUBSPC,R15,#4”。
示例:略
SBC指令(帶借位減法)
語(yǔ)法:SBC{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Rn-Oprand2–NOT(C標(biāo)志位)
如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的借位取反
V=結(jié)果的溢出位用途:
用于實(shí)現(xiàn)兩個(gè)64位數(shù)的減法,如果寄存器對(duì)R1、R0和R3、R2存放64位數(shù),其中R0和R2存放低32位,R1和R3存放高32位,運(yùn)算結(jié)果存入R5、R4中(R4存放低32位,R5存放高32位),則指令為:
SUBSR4,R0,R2
SBCR5,R1,R3
示例:略
RSB指令(逆向減法)
語(yǔ)法:RSB{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)郝?/p>
操作:如果執(zhí)行條件滿(mǎn)足,那么
Rd=Oprand2-Rn
如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的借位取反
V=結(jié)果的溢出位用途:
產(chǎn)生負(fù)數(shù)(二進(jìn)制補(bǔ)碼表示),指令形如“RSBRd,Rx,#0”;產(chǎn)生一個(gè)數(shù)的2n–1倍,指令形式如“RSBRd,Rx,Rx,LSL#n”。
示例:略
RSC指令(帶借位逆向減法)
語(yǔ)法:RSC{<cond>}{S}<Rd>,<Rn>,<Oprand2>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=Oprand2–Rn–NOT(C標(biāo)志位)如果S=1且Rd=R15,那么
如果當(dāng)前工作模式有SPSR,那么
CPSR=SPSR
否則,執(zhí)行結(jié)果不可預(yù)見(jiàn)
如果S=1但Rd≠R15,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C=結(jié)果的借位取反
V=結(jié)果的溢出位用途:
用于實(shí)現(xiàn)64位的減法運(yùn)算,例如,0減去一個(gè)64位的數(shù),存放在R1、R0中(R0存放32位,R1存放高32位),結(jié)果存放在R3、R2中(R2存放低32位,R3存放高32位),指令如下:
RSBSR2,R0,#0
RSBR3,R1,#0
示例:略
MUL指令(乘法)
語(yǔ)法:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>
解釋?zhuān)?/p>
Rd寄存器為目的操作數(shù),存放乘積。
Rm寄存器為第一個(gè)源操作數(shù),存放被乘數(shù)。
Rs寄存器為第二個(gè)源操作數(shù),存放乘數(shù)。
操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=(Rm*Rs)[31:0]
如果S=1,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C無(wú)意義或不受影響
V不受影響用途:
實(shí)現(xiàn)兩個(gè)數(shù)的乘法操作,由于乘積結(jié)果取低32位,因此,對(duì)于無(wú)符號(hào)數(shù)和有符號(hào)數(shù)來(lái)說(shuō),結(jié)果是一樣的。這個(gè)指令多用于乘積結(jié)果不超過(guò)32位的乘法操作,實(shí)際中要慎用!
示例:
MULR3,R2,R1;R3=R2*R1結(jié)果的低32位
MLA指令(乘加)
語(yǔ)法:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>
解釋?zhuān)?/p>
Rn寄存器為第三個(gè)源操作數(shù),存儲(chǔ)的值被加到Rm*Rs的積上。操作:
如果執(zhí)行條件滿(mǎn)足,那么
Rd=(Rm*Rs+Rn)[31:0]
如果S=1,那么
CPSR的標(biāo)志位賦值如下:
N=Rd[31]
Z=1(Rd為0)或0(Rd不為0)
C無(wú)意義或不受影響
V不受影響用途:
實(shí)現(xiàn)32位數(shù)的乘加運(yùn)算,Rd不能與Rm相同(ARMv6除外),由于乘法運(yùn)算和加法運(yùn)算結(jié)果均取低32位,所以,該指令主要用于結(jié)果不超過(guò)32位的乘加操作,實(shí)際中要慎用!
示例:略
SMULL指令(32位有符號(hào)乘法)
語(yǔ)法:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>
解釋?zhuān)?/p>
RdLo寄存器為第一個(gè)目的操作數(shù),存儲(chǔ)乘積的低32位。
RdHi寄存器為第二個(gè)目的操作數(shù),存儲(chǔ)乘積的高32位。操作:
如果執(zhí)行條件滿(mǎn)足,那么
RdHi=(Rm*Rs)[63:32]
RdLo=(Rm*Rs)[31:0]
如果S=1,那么
CPSR的標(biāo)志位賦值如下:
N=RdHi[31]
Z=1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0)
C不受影響
V不受影響用途:
該指令是真正意義下的乘法指令。不能使用R15,RdHi和RdLo不能相同。
示例:略
SMLAL指令(32位有符號(hào)乘加)
語(yǔ)法:SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
RdLo=(Rm*Rs)[31:0]+RdLo(原先的值)
RdHi=(Rm*Rs)[63:32]+RdHi+“(Rm*Rs)[31:0]+RdLo(原先的值)”的進(jìn)位
如果S=1,那么
CPSR的標(biāo)志位賦值如下:
N=RdHi[31]
Z=1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0)
C不受影響
V不受影響
用途:
該指令是真正意義上的乘加運(yùn)算。不用使用R15,RdHi和RdLo不能相同。
示例:略
UMULL指令(無(wú)符號(hào)32位乘法指令)
語(yǔ)法:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>
解釋?zhuān)郝?/p>
操作:
如果執(zhí)行條件滿(mǎn)足,那么
RdHi=(Rm*Rs)[63:32];無(wú)符號(hào)數(shù)
RdLo=(Rm*Rs)[31:0]
如果S=1,那么
CPSR的標(biāo)志位賦值如下:
N=RdHi[31]
Z=1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度企業(yè)培訓(xùn)中心新生入學(xué)服務(wù)協(xié)議書(shū)3篇
- 2024-2030年中國(guó)家庭食物垃圾處理器行業(yè)運(yùn)行動(dòng)態(tài)與發(fā)展戰(zhàn)略分析報(bào)告
- 2024年度工廠總經(jīng)理績(jī)效考核合同2篇
- 2024年某市區(qū)居民區(qū)垃圾清運(yùn)服務(wù)定制合同
- 2024安置房買(mǎi)賣(mài)協(xié)議樣本3篇
- 2024年物流合作共識(shí):貨車(chē)租賃合同模板
- 綜合項(xiàng)目-畢業(yè)紀(jì)念冊(cè)實(shí)訓(xùn)項(xiàng)目指導(dǎo)書(shū)
- 2024全新商務(wù)辦公樓使用權(quán)出售協(xié)議下載3篇
- 2024年度櫥柜定制與綠色建材采購(gòu)合同3篇
- 2024年度加盟商合作合同5篇
- GB 19517-2004國(guó)家電氣設(shè)備安全技術(shù)規(guī)范
- 模具定期保養(yǎng)點(diǎn)檢表
- 山西省太原市市藥品零售藥店企業(yè)藥房名單目錄
- 工程部長(zhǎng)橋梁工程施工技術(shù)(PPT116)
- 全面設(shè)備保養(yǎng)TPM培訓(xùn)教材課件
- 茶葉企業(yè)營(yíng)銷(xiāo)課件
- 高爐無(wú)料鐘爐頂設(shè)備安裝與調(diào)試技術(shù)
- 初中語(yǔ)文人教九年級(jí)上冊(cè)如何分析環(huán)境描寫(xiě)的作用 教案
- 壓力容器壁厚快速計(jì)算
- 抗菌藥物供應(yīng)目錄備案表
- 關(guān)于轉(zhuǎn)包及違規(guī)分包的關(guān)系(特別詳細(xì))
評(píng)論
0/150
提交評(píng)論