《ARM原理與C程序設(shè)計(jì)》課件第三章_第1頁(yè)
《ARM原理與C程序設(shè)計(jì)》課件第三章_第2頁(yè)
《ARM原理與C程序設(shè)計(jì)》課件第三章_第3頁(yè)
《ARM原理與C程序設(shè)計(jì)》課件第三章_第4頁(yè)
《ARM原理與C程序設(shè)計(jì)》課件第三章_第5頁(yè)
已閱讀5頁(yè),還剩174頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論