




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章ARM指令集
ARM指令集結(jié)構(gòu)(ISA)發(fā)展到今天,已經(jīng)形成一個(gè)比較龐大的家族,有多個(gè)功能各異的版本。由于A(yíng)RMv1、ARMv2和ARMv3已經(jīng)淘汰,而ARMv4T又是后續(xù)幾個(gè)版本的基礎(chǔ),因此本章主要介紹ARMv4T指令系統(tǒng)。ARMv4T共49條指令,分為6類(lèi),即分支指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器傳送指令、Load/Store指令、協(xié)處理器指令和異常產(chǎn)生指令。本章按指令系統(tǒng)的基本分類(lèi)方法,分三大部分(即運(yùn)算、傳送和控制)分別介紹各條指令的基本功能和使用方法。
目錄7.1條件執(zhí)行7.2操作數(shù)預(yù)處理7.3運(yùn)算類(lèi)指令7.4控制類(lèi)指令7.5傳送類(lèi)指令7.6Thumb指令集概述習(xí)題
7.1條件執(zhí)行所有的ARM指令都可以條件執(zhí)行,也就是根據(jù)CPSR寄存器中N、Z、C、V等標(biāo)志位決定是否執(zhí)行該指令。
條件碼(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沒(méi)有上溢出V=01000HI無(wú)符號(hào)數(shù)大于(higher)C=1且Z=01001LS無(wú)符號(hào)數(shù)小于/等于C=0或Z=11010GE帶符號(hào)數(shù)大于/等于N=1且V=1或N=0且V=01011LT帶符號(hào)數(shù)小于N=1且V=0或N=0且V=11100GT帶符號(hào)數(shù)大于Z=0且N=V1101LE帶符號(hào)數(shù)小于/等于Z=1或N!=V1110AL無(wú)條件執(zhí)行1111NV未定義7.1條件執(zhí)行例如求最大公約數(shù)的不采用條件執(zhí)行的ARM匯編代碼為:gcd CMP R1,R2 BEQ complete BLT lessthan SUB R1,R1,R2 B gcdlessthan SUB R2,R2,R1 B gcdcomplete而采用條件執(zhí)行的ARM匯編代碼為:gcd CMP R1,R2 SUBGT R1,R1,R2 SUBLT R2,R2,R1 BNE gcd7.2操作數(shù)預(yù)處理
ARM處理器一個(gè)顯著的特征就是在操作數(shù)進(jìn)入ALU之前,先對(duì)其中一個(gè)操作數(shù)進(jìn)行指定位數(shù)的左移或右移處理。這種功能增強(qiáng)了許多數(shù)據(jù)處理操作的靈活性。
1.立即數(shù)的預(yù)處理在運(yùn)算類(lèi)指令中,ARM允許立即數(shù)尋址,立即數(shù)位于指令格式中第0~11位。ARM利用預(yù)處理功能,使得在指令格式中留給立即數(shù)只有12位的情況下,能夠生成一個(gè)32位的立即數(shù)Imm_32。具體方法是把指令格式中第0~11位再分成兩部分,其中第0~7位用來(lái)存放一個(gè)8位的立即數(shù)Imm_8,第8~11位存放一個(gè)4位的數(shù)值rotate_imm。真正的立即數(shù)Imm_32通過(guò)把Imm_8循環(huán)右移rotate_imm×2次來(lái)生成。由于rotate_imm只有4位,最大表示值為15,不能把Imm_8移位成32位,因此,ARM規(guī)定循環(huán)右移次數(shù)為rotate_imm×2。7.2操作數(shù)預(yù)處理例如指令:MOVR8,#0x04000000在A(yíng)DS1.2中對(duì)應(yīng)的機(jī)器碼為:0xE3A08640其中第0~11位為0x640,當(dāng)把0x40(Imm_8)看成高位為0的32位數(shù),將其循環(huán)右移0x6(rotate_imm)×2次后,結(jié)果為0x04000000。即立即數(shù)0x04000000的指令編碼為0x640。用戶(hù)不需要計(jì)算某個(gè)立即數(shù)的12位機(jī)器編碼是多少,這由ARM匯編編譯器來(lái)做。也就是說(shuō),匯編指令中的立即數(shù)Imm_32由匯編編譯器將其分解成能通過(guò)上述方法生成Imm_32的Imm_8(8位)和rotate_imm(4位)。
7.2操作數(shù)預(yù)處理2.寄存器數(shù)的預(yù)處理
在運(yùn)算類(lèi)指令和傳送類(lèi)指令中,ARM允許對(duì)某個(gè)寄存器的值在運(yùn)算之前進(jìn)行預(yù)處理,即做某種類(lèi)型的移位操作。ARM共規(guī)定了5種類(lèi)型的移位操作,它們分別是算術(shù)右移(ASR)、邏輯右移(LSR)、邏輯左移(LSL)、循環(huán)右移(ROR)和擴(kuò)展循環(huán)右移(RRX)。
0邏輯左移(LSL):0邏輯右移LSR):算術(shù)右移(ASR):循環(huán)右移(ROR):擴(kuò)展循環(huán)右移(RRX):C7.2操作數(shù)預(yù)處理移位的次數(shù)可以由立即數(shù)或另一個(gè)寄存器給出。由于擴(kuò)展循環(huán)右移(RRX)只移動(dòng)1位,因此,寄存器數(shù)的預(yù)處理有9種情況,它們對(duì)應(yīng)的匯編格式如下。<Rm>,LSL#<shift_imm><Rm>,LSL<Rs><Rm>,LSR#<shift_imm><Rm>,LSR<Rs><Rm>,ASR#<shift_imm><Rm>,ASR<Rs><Rm>,ROR#<shift_imm><Rm>,ROR<Rs><Rm>,RRX其中,Rm是需要進(jìn)行移位操作的寄存器;#<shift_imm>是需要移位的位數(shù),在A(yíng)RM指令格式中所占的位數(shù)為5位;Rs是包含移位位數(shù)的寄存器。7.2操作數(shù)預(yù)處理(1)<Rm>,LSL#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯左移shift_imm位。這里shift_imm的范圍為0~31。如果shift_imm為0,則shifter_operand的值就是Rm的值,循環(huán)器的進(jìn)位值(Carry-out)為CPSR中的C標(biāo)志位;如果shift_imm不為零,則shifter_operand的值為Rm中值邏輯左移shift_imm位后的值,循環(huán)器的進(jìn)位值為Rm寄存器中最后被移出的位Rm[32-shift_imm]的值。舉例如下:MOVR3,#30MOVR4,R3,LSL#0x12則寄存器R4的值為30×218=7864320=0x00780000。
7.2操作數(shù)預(yù)處理(2)<Rm>,LSL<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯左移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當(dāng)Rs[7:0]=0時(shí),shifter_operand的值就是Rm的值,循環(huán)器的進(jìn)位值(Carry-out)為CPSR中的C標(biāo)志位;當(dāng)0<Rs[7:0]<32時(shí),shifter_operand的值為Rm中值邏輯左移Rs[7:0]位后的值,循環(huán)器的進(jìn)位值為Rm寄存器中最后被移出的位Rm[32-Rs[7:0]]的值;當(dāng)Rs[7:0]=32時(shí),shifter_operand的值為0,循環(huán)器的進(jìn)位值為Rm[0];當(dāng)Rs[7:0]>32時(shí),shifter_operand的值為0,循環(huán)器的進(jìn)位值為0。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSLR3則寄存器R4的值為0x00038000,即將#0xF000000E邏輯左移14位。
7.2操作數(shù)預(yù)處理(3)<Rm>,LSR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯右移#<shift_imm>位。這里shift_imm的范圍為1~32,當(dāng)shift_imm=32時(shí)在指令中被編碼為0。進(jìn)行移位操作后,空出的位置0。當(dāng)shift_imm=32時(shí),操作數(shù)shifter_operand的值為0,循環(huán)器的進(jìn)位值為Rm的最高位Rm[31];其他情況下,操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值邏輯右移shift_imm位,循環(huán)器的進(jìn)位值為Rm最后被移出位的值。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSR#32則R4的值為0。若執(zhí)行MOVR3,#0x30MOVR4,R3,LSR#0x5則R4的值為1。
7.2操作數(shù)預(yù)處理(4)<Rm>,LSR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當(dāng)Rs[7:0]=0時(shí),shifter_operand的值就是Rm的值,循環(huán)器的進(jìn)位值(Carry-out)為CPSR中的C標(biāo)志位;當(dāng)0<Rs[7:0]<32時(shí),shifter_operand的值為Rm中值邏輯右移Rs[7:0]位后的值,循環(huán)器的進(jìn)位值為Rm寄存器中最后被移出的位Rm[Rs[7:0]-1]的值;當(dāng)Rs[7:0]=32時(shí),shifter_operand的值為0,循環(huán)器的進(jìn)位值為Rm[31];當(dāng)Rs[7:0]>32時(shí),shifter_operand的值為0,循環(huán)器的進(jìn)位值為0。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSRR3則寄存器R4的值為0x0003C000,即將#0xF000000E邏輯右移14位。7.2操作數(shù)預(yù)處理(5)<Rm>,ASR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值算術(shù)右移#<shift_imm>位。這里shift_imm的范圍為1~32,當(dāng)shift_imm=32時(shí)在指令中被編碼為0。進(jìn)行移位操作后,空出的位置Rm的最高位值Rm[31]。當(dāng)shift_imm=32時(shí),將進(jìn)行32次算術(shù)右移操作,這時(shí)若Rm[31]=0,則操作數(shù)shifter_operand的值為0,循環(huán)器的進(jìn)位值為Rm的最高位Rm[31],也為0;若Rm[31]=1,則操作數(shù)shifter_operand的值為0xFFFFFFFF,循環(huán)器的進(jìn)位值為Rm的最高位Rm[31],也為1。其他情況下,操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值算術(shù)右移shift_imm位,循環(huán)器的進(jìn)位值為Rm最后被移出位的值。舉例如下:MOVR3,#0xF000000EMOVR4,R3,ASR#32則R4的值為0xFFFFFFFF。若執(zhí)行MOVR3,#0x30MOVR4,R3,ASR#32則R4的值為0。7.2操作數(shù)預(yù)處理(6)<Rm>,ASR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值算術(shù)右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當(dāng)Rs[7:0]=0時(shí),shifter_operand的值就是Rm的值,循環(huán)器的進(jìn)位值(Carry-out)為CPSR中的C標(biāo)志位;當(dāng)0<Rs[7:0]<32時(shí),shifter_operand的值為Rm中值算術(shù)右移Rs[7:0]位后的值,循環(huán)器的進(jìn)位值為Rm寄存器中最后被移出的位Rm[Rs[7:0]-1]的值;當(dāng)Rs[7:0]≥32時(shí),將進(jìn)行32次算術(shù)右移操作,這時(shí)若Rm[31]=0,則shifter_operand的值為0,循環(huán)器的進(jìn)位值為Rm的最高位Rm[31],也就是為0;若Rm[31]=1,則shifter_operand的值為0xFFFFFFFF,循環(huán)器的進(jìn)位值為Rm的最高位Rm[31],也就是為1。舉例如下:MOVR3,#0xF000000EMOVR4,R3,ASRR3則寄存器R4的值為0xFFFFC000,即將#0xF000000E算術(shù)右移14位。
7.2操作數(shù)預(yù)處理(7)<Rm>,ROR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值循環(huán)右移#<shift_imm>位。這里shift_imm的范圍為1~31。進(jìn)行移位操作后,從寄存器右端移出的位又插入到寄存器左端空出的位。則操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值循環(huán)右移shift_imm位,循環(huán)器的進(jìn)位值為Rm最后被移出位的值。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,ROR#10則寄存器R4的值為0xFC000003。7.2操作數(shù)預(yù)處理(8)<Rm>,ROR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值循環(huán)右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當(dāng)Rs[7:0]=0時(shí),shifter_operand的值就是Rm的值,循環(huán)器的進(jìn)位值(Carry-out)為CPSR中的C標(biāo)志位;當(dāng)Rs[4:0]=0時(shí),shifter_operand的值為Rm的值,循環(huán)器的進(jìn)位值為Rm[31];當(dāng)Rs[4:0]>0時(shí),shifter_operand的值為寄存器Rm的數(shù)值循環(huán)右移Rs[4:0]位,循環(huán)器的進(jìn)位值為Rm最后被移出的位Rm[Rs[4:0]-1]。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,RORR3則寄存器R4的值為0x0FF00000。7.2操作數(shù)預(yù)處理(9)<Rm>,RRX指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值右移一位,并用CPSR中的C標(biāo)志位填補(bǔ)空出的位,CPSR中的C位則用移出的位代替。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,RRX則寄存器R4的值為0x000007F8。
7.3運(yùn)算類(lèi)指令
ARM的運(yùn)算類(lèi)指令主要包括數(shù)據(jù)處理指令和乘法指令,ARMv4T共有16條數(shù)據(jù)處理指令和6條乘法指令,如下表所示。指令助記符指令功能指令助記符指令功能MOV數(shù)據(jù)傳送指令MVN數(shù)據(jù)求反傳送指令CMP比較指令CMN基于相反數(shù)的比較指令TST位測(cè)試指令TEQ相等測(cè)試指令A(yù)DD加法指令A(yù)DC帶進(jìn)位加法指令SUB減法指令SBC帶借位減法指令RSB逆向減法指令RSC帶借位逆向減法指令A(yù)ND邏輯與操作指令ORR邏輯或操作指令EOR邏輯異或操作指令BIC位清除指令MUL32位乘法指令MLA32位帶加數(shù)的乘法指令SMULL64位有符號(hào)數(shù)乘法指令SMLAL64位帶加數(shù)有符號(hào)數(shù)乘法指令UMULL64位無(wú)符號(hào)數(shù)乘法指令UMLAL64位帶加數(shù)無(wú)符號(hào)數(shù)乘法指令7.3運(yùn)算類(lèi)指令
1.MOV(傳送指令)MOV指令將<shifter_operand>表示的數(shù)值傳送到目標(biāo)寄存器<Rd>中,并根據(jù)操作的結(jié)果有條件地更新CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:MOV{<cond>}{S}<Rd>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標(biāo)寄存器;<shifter_operand>為向目標(biāo)寄存器傳送的數(shù)據(jù),其尋址方式是立即數(shù)或寄存器。使用舉例如下:將數(shù)據(jù)從一個(gè)寄存器傳送到另一個(gè)寄存器中。MOVR4,R5;將一個(gè)立即數(shù)傳送到一個(gè)寄存器中。MOVEQR4,#300
;若前一條指令的結(jié)果為0,則R4=3007.3運(yùn)算類(lèi)指令
2.MVN(相反數(shù)傳送指令)MVN指令將<shifter_operand>表示的數(shù)值的反碼傳送到目標(biāo)寄存器<Rd>中,并根據(jù)操作的結(jié)果有條件地更新CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:MVN{<cond>}{S}<Rd>,<shifter_operand>
其中各參數(shù)的用法與MOV指令相同。使用舉例如下:如果需要給寄存器R4傳送-300,則指令如下:MVNMIR4,#299
;若前一條指令的結(jié)果為負(fù),則R4=-300
生成位掩碼:MVNR4,#0x01
求一個(gè)數(shù)的反碼:MVNR4,R47.3運(yùn)算類(lèi)指令
3.ADD(加法指令)ADD指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>中的值相加,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:ADD{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼,;<Rd>為目標(biāo)寄存器;<Rn>為第一個(gè)源操作數(shù)所在的寄存器;<shifter_operand>為向目標(biāo)寄存器傳送的數(shù)據(jù),其尋址方式是立即數(shù)或寄存器。使用舉例如下:一個(gè)寄存器中值和一個(gè)立即數(shù)相加:ADDR4,R5,#300一個(gè)寄存器中值和另一個(gè)寄存器中中值經(jīng)過(guò)預(yù)處理之后相加:ADDR4,R5,R6,LSL#37.3運(yùn)算類(lèi)指令
4.ADC(帶進(jìn)位加法指令)ADC指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>中的值相加,再加上CPSR中C條件標(biāo)志位的值,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:ADC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。使用舉例如下:ADC指令和ADD指令聯(lián)合可以實(shí)現(xiàn)兩個(gè)64位二進(jìn)制數(shù)相加,比如要計(jì)算兩個(gè)64位二進(jìn)制數(shù)0x2345678912345678和0x4567890134567890的和,則對(duì)應(yīng)的匯編程序代碼如下。LDRR0,=0x12345678LDRR1,=0x23456789LDRR2,=0x34567890LDRR3,=0x45678901ADDSR4,R0,R2ADCR5,R1,R37.3運(yùn)算類(lèi)指令
5.SUB(減法指令)SUB指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:SUB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。使用舉例如下:一個(gè)寄存器中值減去一個(gè)立即數(shù),并影響CPSR。SUBSR4,R5,#300下面代碼段執(zhí)行后,R8寄存器的值為0x11111111。LDRR0,=0xa0000000LDRR1,=0xb0000000LDRR2,=0x12345678LDRR3,=0x23456789ADDSR4,R0,R1SUBVSSR8,R3,R27.3運(yùn)算類(lèi)指令
6.SBC(帶借位減法指令)SBC指令從<Rn>中減去<shifter_operand>表示的數(shù)值,再減去CPSR中C條件標(biāo)志位的反碼,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:SBC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。SBC指令和SUB指令聯(lián)合可以實(shí)現(xiàn)兩個(gè)64位二進(jìn)制數(shù)相減。如果寄存器R0和R1中存放一個(gè)64位二進(jìn)制數(shù),其中R0存放低32位,R1存放高32位。R2和R3中存放另一個(gè)64位二進(jìn)制數(shù),R2存放低32位,R3存放高32位。使用舉例如下:下面的指令序列實(shí)現(xiàn)了兩個(gè)64位二進(jìn)制數(shù)的減法操作。
SUBSR4,R0,R2SBCR5,R1,R3
7.3運(yùn)算類(lèi)指令
7.RSB(逆向減法指令)RSB指令從<shifter_operand>表示的數(shù)值中減去寄存器<Rn>的值,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:RSB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<shifter_operand>為第1個(gè)源操作數(shù);<Rn>為第2個(gè)源操作數(shù);其他各參數(shù)用法同ADD指令。使用舉例如下:求一個(gè)寄存器值的反碼,并影響CPSR。RSBSR4,R5,#0
;R4=-R5求一個(gè)寄存器值的2n-1。RSBEQR4,R5,R5,LSL#n
;條件執(zhí)行,R4=R5×(2n-1)7.3運(yùn)算類(lèi)指令
8.RSC(帶借位逆向減法指令)RSC指令從<shifter_operand>表示的數(shù)值中減去寄存器<Rn>的值,再減去CPSR中C標(biāo)志位的反碼,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:RSC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同RSB指令。使用舉例如下:RSC指令的典型用法為求一個(gè)64位二進(jìn)制數(shù)的負(fù)數(shù)。RSBSR2,R0,#0RSCR3,R1,#07.3運(yùn)算類(lèi)指令
9.AND(邏輯與指令)AND指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進(jìn)行與運(yùn)算,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:AND{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<Rn>為第1個(gè)源操作數(shù)所在的寄存器;<shifter_operand>為第2個(gè)源操作數(shù);其他各參數(shù)用法同MOV指令。AND指令可用于提取寄存器中某些位的值,具體做法是設(shè)置一個(gè)掩碼值,將該值中對(duì)應(yīng)于寄存器中欲提取的位設(shè)為1,其他的位設(shè)為0。將寄存器的值與該掩碼做與操作,即可得想提取的位的值。使用舉例如下:MOVR2,#0x80000000ANDR3,R3,R2
;提取R3寄存器的最高位
7.3運(yùn)算類(lèi)指令
10.ORR(邏輯或指令)ORR指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進(jìn)行或運(yùn)算,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:ORR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同AND指令。使用舉例如下:下面的匯編代碼將R2寄存器中的高8位數(shù)據(jù)傳送到R3的低8位中。MOVR0,R2,LSR#24
;將R2的高8位數(shù)據(jù)傳送到R0中,R0的高24位設(shè)置為0ORRR3,R0,R3,LSL#8;將R3中數(shù)據(jù)邏輯左移8位,這時(shí)R3的低8位為0,ORR操作將R0(高24位為0)中低8位數(shù)據(jù)傳送到寄存器R3中。7.3運(yùn)算類(lèi)指令
11.EOR(邏輯異或指令)EOR指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進(jìn)行異或運(yùn)算,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:EOR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同AND指令。EOR指令可用于將寄存器中某些位的值取反。將某一位值與0做異或操作,該位值不變;將某一位值與1做異或操作,該位值將被求反。使用舉例如下:下面的代碼將R2中高16位值取反。LDRR1,=0xFFFF0000EORR3,R2,R17.3運(yùn)算類(lèi)指令
12.BIC(位清除指令)BIC指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值的反碼按位進(jìn)行邏輯與運(yùn)算,并把結(jié)果保存到目標(biāo)寄存器<Rd>中,同時(shí)根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:BIC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同AND指令。BIC指令可用于將寄存器中某些位的值設(shè)置成0。將某一位值與1做BIC操作,該位值被設(shè)置成0;將某一位值與0做BIC操作,該位值保持不變。使用舉例如下:下面的代碼將R2中高16位值設(shè)置成0。LDRR1,=0xFFFF0000BICR3,R2,R17.3運(yùn)算類(lèi)指令
13.CMP(比較指令)CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,后面的指令就可以根據(jù)CPSR中相應(yīng)的條件位來(lái)判斷是否執(zhí)行。指令的語(yǔ)法格式為:CMP{<cond>}<Rn>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼,當(dāng)<cond>忽略時(shí)指令為無(wú)條件執(zhí)行;<Rn>為第1個(gè)操作數(shù)所在的寄存器;<shifter_operand>為第2個(gè)操作數(shù),其尋址方式是立即數(shù)或寄存器。CMP指令類(lèi)似于SUBS指令,只是CMP指令不保存結(jié)果,而SUBS指令需要保存結(jié)果,并且CMP指令總是影響CPSR中相應(yīng)位。使用舉例如下:CMPR2,R3
7.3運(yùn)算類(lèi)指令
14.CMN(基于相反數(shù)的比較指令)CMN指令將寄存器<Rn>中的值加上<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,后面的指令就可以根據(jù)CPSR中相應(yīng)的條件位來(lái)判斷是否執(zhí)行。指令的語(yǔ)法格式為:CMN{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。CMN指令通過(guò)給第1個(gè)操作數(shù)<Rn>加上第2個(gè)操作數(shù)<shifter_operand>的值來(lái)表示比較第1個(gè)操作數(shù)<Rn>和第2個(gè)操作數(shù)<shifter_operand>的負(fù)數(shù)。加上第2個(gè)操作數(shù)與減去第2個(gè)操作數(shù)的負(fù)數(shù)對(duì)CPSR中條件標(biāo)志位的影響有細(xì)微的差別。當(dāng)?shù)?個(gè)操作數(shù)為0或者0x80000000時(shí)二者結(jié)果不同。使用舉例如下:CMPR2,#0;C=1CMNR2,#0;C=07.3運(yùn)算類(lèi)指令
15.TST(位測(cè)試指令)TST指令將寄存器<Rn>中的值與<shifter_operand>表示的數(shù)值按位做邏輯與操作,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:TST{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。TST指令通常用于測(cè)試寄存器中某些(個(gè))位是0還是1。使用舉例如下:TSTR3,#01
;測(cè)試R3寄存器中最低位是0還是17.3運(yùn)算類(lèi)指令
16.TEQ(相等測(cè)試指令)TEQ指令將寄存器<Rn>中的值與<shifter_operand>表示的數(shù)值按位做邏輯異或操作,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令的語(yǔ)法格式為:TEQ{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。TEQ指令通常用于比較兩個(gè)數(shù)是否相等,這種比較操作不影響CPSR中的V位和C位(影響Z位)。TEQ指令也可用于比較兩個(gè)操作數(shù)符號(hào)是否相同,該指令執(zhí)行后,CPSR中的N位為兩個(gè)操作數(shù)符號(hào)異或操作的結(jié)果。使用舉例如下:TEQR3,#01
7.3運(yùn)算類(lèi)指令
17.MUL(32位乘法指令)MUL指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無(wú)符號(hào)數(shù),也可為有符號(hào)數(shù))的乘積,并將結(jié)果的低32位存放到一個(gè)32位寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>其中,<cond>為指令執(zhí)行的條件碼;<Rd>寄存器為目標(biāo)寄存器;<Rm>寄存器為第1個(gè)乘數(shù)所在的寄存器;<Rs>寄存器為第2個(gè)乘數(shù)所在的寄存器。使用舉例如下:LDRR0,=0x1234MOVR1,#16MULR2,R0,R1則R2中值為0x12340。7.3運(yùn)算類(lèi)指令
18.MLA(32位帶加數(shù)乘法指令)MLA指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無(wú)符號(hào)數(shù),也可為有符號(hào)數(shù))的乘積,再將乘積加上第3個(gè)操作數(shù),并將結(jié)果的低32位存放到一個(gè)32位寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>其中,<Rn>為第3個(gè)操作數(shù)所在的寄存器,該操作數(shù)是一個(gè)加數(shù),其余參數(shù)的使用方法與MUL指令相同。除了將乘積再加上第3個(gè)操作數(shù)之外,MLA指令同MUL指令相同。使用舉例如下:LDRR0,=0x1234MOVR1,#16MOVR2,#5MLAR3,R0,R1,R2則R2中值為0x12345。7.3運(yùn)算類(lèi)指令
19.SMULL(64位有符號(hào)數(shù)乘法指令)SMULL指令實(shí)現(xiàn)兩個(gè)32位的有符號(hào)數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器<RdHi>中,乘積結(jié)果的低32位存放到一個(gè)32位寄存器<RdLo>中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,<RdHi>寄存器存放乘積結(jié)果的高32位數(shù)據(jù);<RdLo>寄存器存放乘積結(jié)果的低32位數(shù)據(jù);其余參數(shù)的使用方法與MUL指令相同。SMULL是最常用的32位符號(hào)數(shù)的乘法指令。使用舉例如下:MVNR0,#15;R0=-16MVNR1,#63;R1=-64SMULLR2,R3,R0,R1則R3=0x00000000,R2=0x00000400。7.3運(yùn)算類(lèi)指令
20.SMLAL(64位帶加數(shù)的有符號(hào)數(shù)乘法指令)SMLAL指令將兩個(gè)32位有符號(hào)數(shù)的64位乘積結(jié)果與<RdHi>和<RdLo>中的64位二進(jìn)制數(shù)相加,加法結(jié)果的高32位存放到一個(gè)32位的寄存器<RdHi>中,加法結(jié)果的低32位存放到一個(gè)32位寄存器<RdLo>中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,<RdHi>寄存器在指令執(zhí)行前存放64位加數(shù)的高32位數(shù)據(jù),指令執(zhí)行后存放加法結(jié)果的高32位數(shù)據(jù);<RdLo>寄存器在指令執(zhí)行前存放64位加數(shù)的低32位數(shù)據(jù),指令執(zhí)行后存放加法結(jié)果的低32位數(shù)據(jù);其余參數(shù)的使用方法與SMULL指令相同。使用舉例如下:MVNR0,#15;R0=-16MVNR1,#63;R1=-64LDRR2,=0x400MOVR3,#0x20SMLALR2,R3,R0,R1則R3=0x00000020,R2=0x00000800。
7.3運(yùn)算類(lèi)指令
21.UMULL(64位無(wú)符號(hào)數(shù)乘法指令)UMULL指令實(shí)現(xiàn)兩個(gè)32位的無(wú)符號(hào)數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器<RdHi>中,乘積結(jié)果的低32位存放到一個(gè)32位寄存器<RdLo>中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,參數(shù)的使用方法與SMULL指令相同。當(dāng)<Rm>、<Rn>、<RdHi>、<RdLo>、<Rs>為R15時(shí),指令執(zhí)行的結(jié)果不可預(yù)測(cè)。另外<RdHi>、<RdLo>和<Rm>必須是3個(gè)不同的寄存器,否則指令執(zhí)行的結(jié)果不可預(yù)測(cè)。UMULLS指令不影響CPSR中的C標(biāo)志位和V標(biāo)志位。使用舉例如下:LDRR0,=12345678LDRR1,=23456789UMULLR2,R3,R0,R1則R3=0x00010761,R2=0x6AEDE366。7.3運(yùn)算類(lèi)指令
22.UMLAL(64位帶加數(shù)無(wú)符號(hào)數(shù)乘法指令)UMLAL指令將兩個(gè)32位無(wú)符號(hào)數(shù)的64位乘積結(jié)果與<RdHi>和<RdLo>中的64位二進(jìn)制數(shù)相加,加法結(jié)果的高32位存放到一個(gè)32位的寄存器<RdHi>中,加法結(jié)果的低32位存放到一個(gè)32位寄存器<RdLo>中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。指令的語(yǔ)法格式為:UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,參數(shù)的使用方法與SMLAL指令相同。使用舉例如下:MOVR0,#16MOVR1,#64MOVR2,0x40000MOVR3,0x20UMLALR2,R3,R0,R1則R3=0x00000020,R2=0x00040400。7.4控制類(lèi)指令
ARM的控制類(lèi)指令主要包括分支指令、CPSR訪(fǎng)問(wèn)指令、信號(hào)量指令、異常處理指令和協(xié)處理器指令,ARMv4T共有13條控制類(lèi)指令。指令助記符指令功能B跳轉(zhuǎn)指令BL帶返回的跳轉(zhuǎn)指令BX帶狀態(tài)切換的跳轉(zhuǎn)指令MSR通用寄存器到狀態(tài)寄存器的傳送指令MRS狀態(tài)寄存器到通用寄存器的傳送指令SWP字交換指令SWPB字節(jié)交換指令SWI軟中斷指令CDP協(xié)處理器數(shù)據(jù)操作指令LDC協(xié)處理器數(shù)據(jù)讀取指令STC協(xié)處理器數(shù)據(jù)寫(xiě)入指令MCRARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令MRC協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令7.4控制類(lèi)指令
1.B(跳轉(zhuǎn)指令)B指令將<target_address>表示的目標(biāo)地址通過(guò)計(jì)算傳送到PC中,從而改變程序的執(zhí)行流程,這種改變可以是有條件的,也可以是無(wú)條件的。指令的語(yǔ)法格式為:B{<cond>}<target_address>其中,<cond>為指令執(zhí)行的條件碼;<target_address>為指令跳轉(zhuǎn)的目標(biāo)地址。B指令跳轉(zhuǎn)的目標(biāo)地址采用相對(duì)尋址方式,即指令中的目標(biāo)地址<target_address>是真正目標(biāo)地址相對(duì)于當(dāng)前指令的地址(由PC指出)的偏移量。B指令主要的應(yīng)用還在于條件跳轉(zhuǎn)。由于有15個(gè)條件碼,因此在實(shí)際應(yīng)用中可以有15條不同的條件跳轉(zhuǎn)指令。使用舉例如下:BEQ complete
;條件跳轉(zhuǎn)BLT lessthan
;條件跳轉(zhuǎn)B gcd
;無(wú)條件跳轉(zhuǎn)7.4控制類(lèi)指令
2.BL(帶返回的跳轉(zhuǎn)指令)BL將<target_address>表示的目標(biāo)地址通過(guò)計(jì)算傳送到PC中,同時(shí)將當(dāng)前指令的下一條指令的地址保存在寄存器LR中,從而實(shí)現(xiàn)子程序的調(diào)用。指令的語(yǔ)法格式為:BL{<cond>}<target_address>其中,各參數(shù)的使用方法與B指令相同。BL指令的目標(biāo)地址的計(jì)算方法與B指令相同。使用舉例如下:下面的程序段是一個(gè)子程序調(diào)用的簡(jiǎn)單例子。BL subroutineexit……subroutineMOV R9,#100MOVR10,#90ADD R11,R9,R10MOV PC,LR7.4控制類(lèi)指令
3.BX(帶狀態(tài)切換的跳轉(zhuǎn)指令)BX也是一條跳轉(zhuǎn)指令,但目標(biāo)地址采用寄存器尋址。BX指令主要用于從ARM代碼區(qū)跳轉(zhuǎn)到Thumb代碼區(qū)。當(dāng)從Thumb空間返回ARM空間時(shí),也要用BX指令。指令的語(yǔ)法格式為:BX{<cond>}<Rm>其中,<cond>為指令執(zhí)行的條件碼;<Rm>為跳轉(zhuǎn)的目標(biāo)地址。使用舉例如下:
CODE32LDRR0,=thumbcode+1MOVLR,PCBX R0……CODE16thumbcodeADDR7,#1BX LR7.4控制類(lèi)指令
4.MSR(通用寄存器到狀態(tài)寄存器傳送指令)MSR指令用于將某通用寄存器的內(nèi)容或一個(gè)立即數(shù)傳送到狀態(tài)寄存器中。指令的語(yǔ)法格式為:MSR{<cond>}CPSR_<fields>,#<immediate>MSR{<cond>}CPSR_<fields>,#<Rm>MSR{<cond>}SPSR_<fields>,#<immediate>MSR{<cond>}SPSR_<fields>,#<Rm>其中,<fields>設(shè)置狀態(tài)寄存器中需要操作的位。<immediate>為將要傳送到狀態(tài)寄存器中的立即數(shù)。<Rm>寄存器包含將要傳送到狀態(tài)寄存器中的數(shù)據(jù)。使用舉例如下:下面的程序代碼將處理器模式切換到特權(quán)模式。MRS R0,CPSRBIC R0,R0,#0x1FORR R0,R0,#00x13MSRCPSR_C,R07.4控制類(lèi)指令
5.MRS(狀態(tài)寄存器到通用寄存器傳送指令)MRS指令用于將狀態(tài)寄存器的內(nèi)容傳送到某通用寄存器中。指令的語(yǔ)法格式為:MRS{<cond>}<Rd>,CPSRMRS{<cond>}<Rd>,SPSR其中,<cond>為指令執(zhí)行的條件碼,忽略條件碼時(shí)指令無(wú)條件執(zhí)行;<Rd>寄存器為目標(biāo)寄存器。MRS指令主要用于以下三種場(chǎng)合:通常通過(guò)“讀取-修改-寫(xiě)回”操作序列修改狀態(tài)寄存器的內(nèi)容時(shí),MRS指令用于將CPSR的內(nèi)容讀到通用寄存器中;當(dāng)異常中斷允許嵌套時(shí),需要在進(jìn)入異常中斷之后,嵌套中斷發(fā)生之前保存當(dāng)前處理器模式對(duì)應(yīng)的SPSR。這時(shí)需要先通過(guò)MRS指令讀出SPSR的值,再用其它指令將SPSR的值保存起來(lái);在進(jìn)程切換時(shí)也需要保存當(dāng)前狀態(tài)寄存器的值。使用舉例如下:下面的指令讀取SPSR中值到寄存器R10中。MRS R10,SPSR7.4控制類(lèi)指令
6.SWP(字交換指令)SWP指令用于將一個(gè)內(nèi)存字單元(該單元地址放在寄存器<Rn>中)的內(nèi)容讀取到一個(gè)寄存器<Rd>中,同時(shí)將另一個(gè)寄存器<Rm>的內(nèi)容寫(xiě)入到該內(nèi)存單元中。當(dāng)<Rd>和<Rm>為同一個(gè)寄存器時(shí),指令交換該寄存器和內(nèi)存單元的內(nèi)容。指令的語(yǔ)法格式為:SWP{<cond>}<Rd>,<Rm>,<Rn>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標(biāo)寄存器;<Rm>包含將要保存到內(nèi)存中的數(shù)值;<Rn>包含將要訪(fǎng)問(wèn)的內(nèi)存單元的地址。本指令主要用于實(shí)現(xiàn)信號(hào)量操作。使用舉例如下:SWPR1,R2,[R3] ;將內(nèi)存單元[R3]中字?jǐn)?shù)據(jù)讀取到寄存器R1中,同時(shí)將R2寄存器的數(shù)據(jù)寫(xiě)入到內(nèi)存單元[R3]中。SWPR1,R1,[R2]
;將R1寄存器的內(nèi)容和內(nèi)存單元[R2]的內(nèi)容交換。7.4控制類(lèi)指令
7.SWPB(字節(jié)交換指令)SWPB指令用于將一個(gè)內(nèi)存字節(jié)單元(該單元地址放在寄存器<Rn>中)的內(nèi)容讀取到一個(gè)寄存器<Rd>中,寄存器<Rd>的高24位設(shè)置為0,同時(shí)將另一個(gè)寄存器<Rm>的低8位數(shù)值寫(xiě)入到該內(nèi)存單元中。當(dāng)<Rd>和<Rm>為同一個(gè)寄存器時(shí),指令交換該寄存器低8位和內(nèi)存字節(jié)單元的內(nèi)容。指令的語(yǔ)法格式為:SWPB{<cond>}<Rd>,<Rm>,<Rn>其中,各參數(shù)用法同SWP指令相同。本指令主要用于實(shí)現(xiàn)信號(hào)量操作。使用舉例如下:SWPBR1,R2,[R3]
;將內(nèi)存單元[R3]中字節(jié)數(shù)據(jù)讀取到寄存器R1中,R1的高24位設(shè)置為0,同時(shí)將R2寄存器的低8位數(shù)據(jù)寫(xiě)入到內(nèi)存單元[R3]中。7.4控制類(lèi)指令
8.SWI(軟中斷指令)SWI指令用于產(chǎn)生軟中斷,ARM通過(guò)這種機(jī)制實(shí)現(xiàn)在用戶(hù)模式對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用。指令的語(yǔ)法格式為:SWI{<cond>}<immed_24>其中,<cond>為指令執(zhí)行的條件碼;<immed_24>為24位的立即數(shù)。SWI指令執(zhí)行時(shí),首先將該指令的下一條指令的地址保存在R14_svc寄存器中,將CPSR保存在SPSR_svc寄存器中。然后設(shè)置處理器模式為特權(quán)模式,并設(shè)置運(yùn)行在A(yíng)RM環(huán)境(而不是Thumb環(huán)境)。接著禁止一般中斷,最后將PC值設(shè)置為0x00000008或0xFFFF0008。本指令主要用于用戶(hù)程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。。使用舉例如下:下面的代碼段使程序正常返回系統(tǒng)。MOV R0,#0x18LDR R1,=0x20026SWI0x123456
;注意這里立即數(shù)沒(méi)有符號(hào)“#”7.4控制類(lèi)指令
9.CDP(協(xié)處理器數(shù)據(jù)操作指令)CDP指令用于A(yíng)RM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,該操作由協(xié)處理器完成。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。利用這個(gè)特點(diǎn),可以通過(guò)軟件模擬該協(xié)處理器操作。指令的語(yǔ)法格式為:CDP{<cond>}<coproc>,<opcode_1>,<CRd>,<CRn>,<CRm>,<opcode_2>其中,<cond>為指令執(zhí)行的條件碼;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<opcode_1>為協(xié)處理器即將執(zhí)行的操作碼1;<CRd>作為目標(biāo)寄存器的協(xié)處理器寄存器;<CRn>為存放第1個(gè)操作數(shù)的協(xié)處理器寄存器;<CRm>為存放第2個(gè)操作數(shù)的協(xié)處理器寄存器;<opcode_2>為協(xié)處理器即將執(zhí)行的操作碼2。當(dāng)一個(gè)協(xié)處理器硬件不能執(zhí)行屬于它的協(xié)處理器指令時(shí),將產(chǎn)生未定義指令異常中斷。利用這個(gè)特點(diǎn),可以通過(guò)軟件來(lái)模擬該協(xié)處理器的硬件操作,只要用該軟件來(lái)替換指令異常中斷處理程序即可。7.4控制類(lèi)指令
10.LDC(協(xié)處理器數(shù)據(jù)讀取指令)LDC指令從一系列連續(xù)的內(nèi)存單元將數(shù)據(jù)讀取到協(xié)處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語(yǔ)法格式為:LDC{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼,當(dāng)<cond>忽略時(shí)指令為無(wú)條件執(zhí)行;L指示指令為長(zhǎng)讀取操作,比如用于雙精度的數(shù)據(jù)傳送;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<CRd>作為目標(biāo)寄存器的協(xié)處理器寄存器;<address_mode>為指令的尋址方式,指出內(nèi)存單元的地址,共有4種地址的計(jì)算方法。7.4控制類(lèi)指令
11.STC(協(xié)處理器數(shù)據(jù)寫(xiě)入指令)STC指令將協(xié)處理器的寄存器中的數(shù)據(jù)寫(xiě)入到一系列連續(xù)的內(nèi)存單元中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語(yǔ)法格式為:STC{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼,當(dāng)<cond>忽略時(shí)指令為無(wú)條件執(zhí)行;L指示指令為長(zhǎng)讀取操作,比如用于雙精度的數(shù)據(jù)傳送;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<CRd>作為源寄存器的協(xié)處理器寄存器;<address_mode>為指令的尋址方式,指出內(nèi)存單元的地址。7.4控制類(lèi)指令
12.MCR(ARM寄存器到協(xié)處理器寄存器傳送指令)MCR指令將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語(yǔ)法格式為:MCR{<cond>}<coproc>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<cond>為指令執(zhí)行的條件碼,當(dāng)<cond>忽略時(shí)指令為無(wú)條件執(zhí)行;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<opcode_1>為協(xié)處理器即將執(zhí)行的操作碼1;<Rd>為ARM寄存器,其值將被傳送到協(xié)處理器寄存器中;<CRn>為目標(biāo)寄存器的協(xié)處理器寄存器;<CRm>為附加的目標(biāo)寄存器或者源寄存器的協(xié)處理器寄存器;<opcode_2>可選的協(xié)處理器即將執(zhí)行的操作碼2。7.4控制類(lèi)指令
13.MRC(協(xié)處理器寄存器到ARM寄存器傳送指令)MRC指令將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語(yǔ)法格式為:MRC{<cond>}<coproc>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<Rd>為目標(biāo)寄存器的ARM寄存器;<CRn>為源寄存器的協(xié)處理器寄存器;<CRm>為附加的目標(biāo)寄存器或者源寄存器的協(xié)處理器寄存器;其它參數(shù)同MCR指令相同。7.5傳送類(lèi)指令A(yù)RM的傳送類(lèi)指令主要包括Load/Store指令和多Load/Store指令。ARMv4T共有12條Load/Store指令和2條多Load/Store指令。指令助記符指令功能指令助記符指令功能LDR字?jǐn)?shù)據(jù)讀取指令LDRB字節(jié)數(shù)據(jù)讀取指令LDRBT用戶(hù)模式字節(jié)數(shù)據(jù)讀取指令LDRH半字?jǐn)?shù)據(jù)讀取指令LDRSB有符號(hào)字節(jié)數(shù)據(jù)讀取指令LDRSH有符號(hào)的半字?jǐn)?shù)據(jù)讀取指令LDRT用戶(hù)模式字?jǐn)?shù)據(jù)讀取指令STR字?jǐn)?shù)據(jù)寫(xiě)入指令STRB字節(jié)數(shù)據(jù)寫(xiě)入指令STRBT用戶(hù)模式字節(jié)數(shù)據(jù)寫(xiě)入指令STRH半字?jǐn)?shù)據(jù)寫(xiě)入指令STRT用戶(hù)模式字?jǐn)?shù)據(jù)寫(xiě)入指令LDM批量字?jǐn)?shù)據(jù)讀取指令STM批量字?jǐn)?shù)據(jù)寫(xiě)入指令7.5傳送類(lèi)指令
1.LDR(字?jǐn)?shù)據(jù)讀取指令)LDR指令用于從內(nèi)存中將一個(gè)32位的字?jǐn)?shù)據(jù)讀取到指令中的目標(biāo)寄存器中。指令的語(yǔ)法格式為:LDR{<cond>} <Rd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標(biāo)寄存器;<addressing_mode>為源操作數(shù)的地址。使用舉例如下:LDR R4,[R5]
;R5的值所指的內(nèi)存字單元的數(shù)據(jù)取到R4LDRR4,[R5,#-4]
;R5的值減去4所指的內(nèi)存字單元的數(shù)據(jù)取到R4LDR R4,[R5,R6]
;R5的值加上R6的值所指的內(nèi)存字單元的數(shù)據(jù)取到R47.5傳送類(lèi)指令
2.LDRB(字節(jié)數(shù)據(jù)讀取指令)LDRB指令用于從內(nèi)存中將一個(gè)8位的字節(jié)數(shù)據(jù)讀取到指令中的目標(biāo)寄存器中。并將目標(biāo)寄存器的高24位清零。指令的語(yǔ)法格式為:LDR{<cond>}B<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:假設(shè)內(nèi)存地址0開(kāi)始的連續(xù)4個(gè)字節(jié)單元的值為0x10、0x00、0xFF、0xE7,且R5寄存器的值為0,則:LDRB R4,[R5,#0]
;R4=0x00000010LDRB R4,[R5,#1]
;R4=0x00000000LDRBR4,[R5,#2]
;R4=0x000000FFLDRBR4,[R5,#3]
;R4=0x000000E77.5傳送類(lèi)指令
3.LDRBT(用戶(hù)模式的字節(jié)數(shù)據(jù)讀取指令)LDRBT指令用于從內(nèi)存中將一個(gè)8位的字節(jié)數(shù)據(jù)讀取到指令中的目標(biāo)寄存器中,并將目標(biāo)寄存器的高24位清零。當(dāng)在特權(quán)級(jí)的處理器模式下使用本指令時(shí),內(nèi)存系統(tǒng)將該操作當(dāng)作一般用戶(hù)模式下的內(nèi)存訪(fǎng)問(wèn)操作。指令的語(yǔ)法格式為:LDR{<cond>}BT<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。異常中斷程序是在特權(quán)級(jí)的處理器模式下執(zhí)行的,這時(shí)如果需要按照用戶(hù)模式的權(quán)限訪(fǎng)問(wèn)內(nèi)存,就可以使用LDRBT指令。使用舉例如下:LDRBT R4,[R5]7.5傳送類(lèi)指令
4.LDRH(半字?jǐn)?shù)據(jù)讀取指令)LDRH指令用于從內(nèi)存中將一個(gè)16位的半字?jǐn)?shù)據(jù)讀取到指令中的目標(biāo)寄存器中,并將目標(biāo)寄存器的高16位清零。如果指令中的內(nèi)存地址不是半字對(duì)齊的,指令會(huì)產(chǎn)生不可預(yù)知的結(jié)果。指令的語(yǔ)法格式為:LDR{<cond>}H<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRHR4,[R5]
;將內(nèi)存單元[R5]中的半字讀取到R4中,R4中高16位設(shè)置為07.5傳送類(lèi)指令
5.LDRSB(有符號(hào)的字節(jié)數(shù)據(jù)讀取指令)LDRSB指令用于從內(nèi)存中將一個(gè)8位的字節(jié)數(shù)據(jù)讀取到指令中的目標(biāo)寄存器中。并將目標(biāo)寄存器的高24位設(shè)置成該字節(jié)數(shù)據(jù)的符號(hào)位的值(即將該字節(jié)數(shù)據(jù)進(jìn)行符號(hào)位擴(kuò)展,生成32位數(shù)據(jù))。指令的語(yǔ)法格式為:LDR{<cond>}SB<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRSBR4,[R5,#-4]!;將內(nèi)存單元[R5]-4中的字節(jié)讀取到R4中,R4中高24位設(shè)置為該字節(jié)數(shù)據(jù)的符號(hào)位,同時(shí)R5=R5-47.5傳送類(lèi)指令
6.LDRSH(有符號(hào)的半字?jǐn)?shù)據(jù)讀取指令)LDRSH指令用于從內(nèi)存中將一個(gè)16位的半字?jǐn)?shù)據(jù)讀取到指令中的目標(biāo)寄存器中,并將目標(biāo)寄存器的高16位設(shè)置成該半字?jǐn)?shù)據(jù)的符號(hào)位的值(即將該半字?jǐn)?shù)據(jù)進(jìn)行符號(hào)位擴(kuò)展,生成32位數(shù)據(jù))。如果指令中的內(nèi)存地址不是半字對(duì)齊的,指令會(huì)產(chǎn)生不可預(yù)知的結(jié)果。指令的語(yǔ)法格式為:LDR{<cond>}SH<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRSHR4,[R5],#4
;將內(nèi)存單元[R5]中的半字?jǐn)?shù)據(jù)讀取到R4中,R4中高16位設(shè)置為該半字?jǐn)?shù)據(jù)的符號(hào)位,然后R5=R5+47.5傳送類(lèi)指令
7.LDRT(用戶(hù)模式的字?jǐn)?shù)據(jù)讀取指令)LDRT指令用于從內(nèi)存中將一個(gè)32位的字?jǐn)?shù)據(jù)讀取到指令中的目標(biāo)寄存器中。當(dāng)在特權(quán)級(jí)的處理器模式下使用本指令時(shí),內(nèi)存系統(tǒng)將該操作當(dāng)作一般用戶(hù)模式下的內(nèi)存訪(fǎng)問(wèn)操作。指令的語(yǔ)法格式為:LDR{<cond>}T<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。異常中斷程序是在特權(quán)級(jí)的處理器模式下執(zhí)行的,這時(shí)如果需要按照用戶(hù)模式的權(quán)限訪(fǎng)問(wèn)內(nèi)存,就可以使用LDRT指令。使用舉例如下:LDRT R4,[R5,#1]7.5傳送類(lèi)指令
8.STR(字?jǐn)?shù)據(jù)寫(xiě)入指令)STR指令用于將一個(gè)32位的字?jǐn)?shù)據(jù)寫(xiě)入到指令中指定的內(nèi)存單元。指令的語(yǔ)法格式為:STR{<cond>}<Rd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為源寄存器;<addressing_mode>描述目標(biāo)操作數(shù)的尋址方式,具體算法同LDR指令。STR指令用于將一個(gè)32位的字?jǐn)?shù)據(jù)寫(xiě)入指令中指定的內(nèi)存單元。使用
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)硅膠燙印輪市場(chǎng)調(diào)查研究報(bào)告
- 2025年度車(chē)間出租與信息化建設(shè)服務(wù)合同
- 2025年度高新技術(shù)產(chǎn)業(yè)借款連帶擔(dān)保協(xié)議
- 科室護(hù)理半年總結(jié)
- 2025年度設(shè)備拆除與安全應(yīng)急預(yù)案合同
- 二零二五年度綠色辣椒種植與農(nóng)產(chǎn)品收購(gòu)合作協(xié)議
- 二零二五年度消防設(shè)備生產(chǎn)許可證申請(qǐng)與審批合同
- 二零二五年度企業(yè)員工社保權(quán)益自愿放棄合同范本
- 二零二五年度電梯緊急救援與維護(hù)服務(wù)合同
- 二零二五年度水利工程變更及進(jìn)度管理合同
- 新蘇教版三年級(jí)科學(xué)下冊(cè)知識(shí)點(diǎn)歸納復(fù)習(xí)資料
- 航天集團(tuán)人才隊(duì)伍建設(shè)經(jīng)驗(yàn)介紹
- 牙周炎-侵襲性牙周炎
- 心理委員工作記錄表
- 新教科版五下科學(xué)1-5《當(dāng)環(huán)境改變了》公開(kāi)課課件
- 教師的十大轉(zhuǎn)變課件
- 焦化廠(chǎng)生產(chǎn)工序及工藝流程圖
- 可下載打印的公司章程
- 中藥熏洗法課件
- 本特利探頭應(yīng)用
- QMR-110-00員工手部、接觸面等微生物檢驗(yàn)記錄記錄
評(píng)論
0/150
提交評(píng)論