嵌入式系統(tǒng)概論第七章_第1頁
嵌入式系統(tǒng)概論第七章_第2頁
嵌入式系統(tǒng)概論第七章_第3頁
嵌入式系統(tǒng)概論第七章_第4頁
嵌入式系統(tǒng)概論第七章_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章ARM指令集

ARM指令集結(jié)構(gòu)(ISA)發(fā)展到今天,已經(jīng)形成一個比較龐大的家族,有多個功能各異的版本。由于ARMv1、ARMv2和ARMv3已經(jīng)淘汰,而ARMv4T又是后續(xù)幾個版本的基礎,因此本章主要介紹ARMv4T指令系統(tǒng)。ARMv4T共49條指令,分為6類,即分支指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器傳送指令、Load/Store指令、協(xié)處理器指令和異常產(chǎn)生指令。本章按指令系統(tǒng)的基本分類方法,分三大部分(即運算、傳送和控制)分別介紹各條指令的基本功能和使用方法。

目錄7.1條件執(zhí)行7.2操作數(shù)預處理7.3運算類指令7.4控制類指令7.5傳送類指令7.6Thumb指令集概述習題

7.1條件執(zhí)行所有的ARM指令都可以條件執(zhí)行,也就是根據(jù)CPSR寄存器中N、Z、C、V等標志位決定是否執(zhí)行該指令。

條件碼(cond)條件碼助記符含義CPSR中條件標志位值0000EQ相等Z=10001NE不相等Z=00010CS/HS無符號數(shù)大于/等于C=10011CC/LO無符號數(shù)小于C=00100MI負數(shù)N=10101PL非負數(shù)N=00110VS上溢出V=10111VC沒有上溢出V=01000HI無符號數(shù)大于(higher)C=1且Z=01001LS無符號數(shù)小于/等于C=0或Z=11010GE帶符號數(shù)大于/等于N=1且V=1或N=0且V=01011LT帶符號數(shù)小于N=1且V=0或N=0且V=11100GT帶符號數(shù)大于Z=0且N=V1101LE帶符號數(shù)小于/等于Z=1或N!=V1110AL無條件執(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ù)預處理

ARM處理器一個顯著的特征就是在操作數(shù)進入ALU之前,先對其中一個操作數(shù)進行指定位數(shù)的左移或右移處理。這種功能增強了許多數(shù)據(jù)處理操作的靈活性。

1.立即數(shù)的預處理在運算類指令中,ARM允許立即數(shù)尋址,立即數(shù)位于指令格式中第0~11位。ARM利用預處理功能,使得在指令格式中留給立即數(shù)只有12位的情況下,能夠生成一個32位的立即數(shù)Imm_32。具體方法是把指令格式中第0~11位再分成兩部分,其中第0~7位用來存放一個8位的立即數(shù)Imm_8,第8~11位存放一個4位的數(shù)值rotate_imm。真正的立即數(shù)Imm_32通過把Imm_8循環(huán)右移rotate_imm×2次來生成。由于rotate_imm只有4位,最大表示值為15,不能把Imm_8移位成32位,因此,ARM規(guī)定循環(huán)右移次數(shù)為rotate_imm×2。7.2操作數(shù)預處理例如指令:MOVR8,#0x04000000在ADS1.2中對應的機器碼為:0xE3A08640其中第0~11位為0x640,當把0x40(Imm_8)看成高位為0的32位數(shù),將其循環(huán)右移0x6(rotate_imm)×2次后,結(jié)果為0x04000000。即立即數(shù)0x04000000的指令編碼為0x640。用戶不需要計算某個立即數(shù)的12位機器編碼是多少,這由ARM匯編編譯器來做。也就是說,匯編指令中的立即數(shù)Imm_32由匯編編譯器將其分解成能通過上述方法生成Imm_32的Imm_8(8位)和rotate_imm(4位)。

7.2操作數(shù)預處理2.寄存器數(shù)的預處理

在運算類指令和傳送類指令中,ARM允許對某個寄存器的值在運算之前進行預處理,即做某種類型的移位操作。ARM共規(guī)定了5種類型的移位操作,它們分別是算術右移(ASR)、邏輯右移(LSR)、邏輯左移(LSL)、循環(huán)右移(ROR)和擴展循環(huán)右移(RRX)。

0邏輯左移(LSL):0邏輯右移LSR):算術右移(ASR):循環(huán)右移(ROR):擴展循環(huán)右移(RRX):C7.2操作數(shù)預處理移位的次數(shù)可以由立即數(shù)或另一個寄存器給出。由于擴展循環(huán)右移(RRX)只移動1位,因此,寄存器數(shù)的預處理有9種情況,它們對應的匯編格式如下。<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是需要進行移位操作的寄存器;#<shift_imm>是需要移位的位數(shù),在ARM指令格式中所占的位數(shù)為5位;Rs是包含移位位數(shù)的寄存器。7.2操作數(shù)預處理(1)<Rm>,LSL#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯左移shift_imm位。這里shift_imm的范圍為0~31。如果shift_imm為0,則shifter_operand的值就是Rm的值,循環(huán)器的進位值(Carry-out)為CPSR中的C標志位;如果shift_imm不為零,則shifter_operand的值為Rm中值邏輯左移shift_imm位后的值,循環(huán)器的進位值為Rm寄存器中最后被移出的位Rm[32-shift_imm]的值。舉例如下:MOVR3,#30MOVR4,R3,LSL#0x12則寄存器R4的值為30×218=7864320=0x00780000。

7.2操作數(shù)預處理(2)<Rm>,LSL<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯左移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當Rs[7:0]=0時,shifter_operand的值就是Rm的值,循環(huán)器的進位值(Carry-out)為CPSR中的C標志位;當0<Rs[7:0]<32時,shifter_operand的值為Rm中值邏輯左移Rs[7:0]位后的值,循環(huán)器的進位值為Rm寄存器中最后被移出的位Rm[32-Rs[7:0]]的值;當Rs[7:0]=32時,shifter_operand的值為0,循環(huán)器的進位值為Rm[0];當Rs[7:0]>32時,shifter_operand的值為0,循環(huán)器的進位值為0。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSLR3則寄存器R4的值為0x00038000,即將#0xF000000E邏輯左移14位。

7.2操作數(shù)預處理(3)<Rm>,LSR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯右移#<shift_imm>位。這里shift_imm的范圍為1~32,當shift_imm=32時在指令中被編碼為0。進行移位操作后,空出的位置0。當shift_imm=32時,操作數(shù)shifter_operand的值為0,循環(huán)器的進位值為Rm的最高位Rm[31];其他情況下,操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值邏輯右移shift_imm位,循環(huán)器的進位值為Rm最后被移出位的值。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSR#32則R4的值為0。若執(zhí)行MOVR3,#0x30MOVR4,R3,LSR#0x5則R4的值為1。

7.2操作數(shù)預處理(4)<Rm>,LSR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值邏輯右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當Rs[7:0]=0時,shifter_operand的值就是Rm的值,循環(huán)器的進位值(Carry-out)為CPSR中的C標志位;當0<Rs[7:0]<32時,shifter_operand的值為Rm中值邏輯右移Rs[7:0]位后的值,循環(huán)器的進位值為Rm寄存器中最后被移出的位Rm[Rs[7:0]-1]的值;當Rs[7:0]=32時,shifter_operand的值為0,循環(huán)器的進位值為Rm[31];當Rs[7:0]>32時,shifter_operand的值為0,循環(huán)器的進位值為0。舉例如下:MOVR3,#0xF000000EMOVR4,R3,LSRR3則寄存器R4的值為0x0003C000,即將#0xF000000E邏輯右移14位。7.2操作數(shù)預處理(5)<Rm>,ASR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值算術右移#<shift_imm>位。這里shift_imm的范圍為1~32,當shift_imm=32時在指令中被編碼為0。進行移位操作后,空出的位置Rm的最高位值Rm[31]。當shift_imm=32時,將進行32次算術右移操作,這時若Rm[31]=0,則操作數(shù)shifter_operand的值為0,循環(huán)器的進位值為Rm的最高位Rm[31],也為0;若Rm[31]=1,則操作數(shù)shifter_operand的值為0xFFFFFFFF,循環(huán)器的進位值為Rm的最高位Rm[31],也為1。其他情況下,操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值算術右移shift_imm位,循環(huán)器的進位值為Rm最后被移出位的值。舉例如下:MOVR3,#0xF000000EMOVR4,R3,ASR#32則R4的值為0xFFFFFFFF。若執(zhí)行MOVR3,#0x30MOVR4,R3,ASR#32則R4的值為0。7.2操作數(shù)預處理(6)<Rm>,ASR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值算術右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當Rs[7:0]=0時,shifter_operand的值就是Rm的值,循環(huán)器的進位值(Carry-out)為CPSR中的C標志位;當0<Rs[7:0]<32時,shifter_operand的值為Rm中值算術右移Rs[7:0]位后的值,循環(huán)器的進位值為Rm寄存器中最后被移出的位Rm[Rs[7:0]-1]的值;當Rs[7:0]≥32時,將進行32次算術右移操作,這時若Rm[31]=0,則shifter_operand的值為0,循環(huán)器的進位值為Rm的最高位Rm[31],也就是為0;若Rm[31]=1,則shifter_operand的值為0xFFFFFFFF,循環(huán)器的進位值為Rm的最高位Rm[31],也就是為1。舉例如下:MOVR3,#0xF000000EMOVR4,R3,ASRR3則寄存器R4的值為0xFFFFC000,即將#0xF000000E算術右移14位。

7.2操作數(shù)預處理(7)<Rm>,ROR#<shift_imm>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值循環(huán)右移#<shift_imm>位。這里shift_imm的范圍為1~31。進行移位操作后,從寄存器右端移出的位又插入到寄存器左端空出的位。則操作數(shù)shifter_operand的值為寄存器Rm的數(shù)值循環(huán)右移shift_imm位,循環(huán)器的進位值為Rm最后被移出位的值。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,ROR#10則寄存器R4的值為0xFC000003。7.2操作數(shù)預處理(8)<Rm>,ROR<Rs>指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值循環(huán)右移一定位數(shù)的值,移位的位數(shù)由Rs寄存器的最低8位Rs[7:0]決定。當Rs[7:0]=0時,shifter_operand的值就是Rm的值,循環(huán)器的進位值(Carry-out)為CPSR中的C標志位;當Rs[4:0]=0時,shifter_operand的值為Rm的值,循環(huán)器的進位值為Rm[31];當Rs[4:0]>0時,shifter_operand的值為寄存器Rm的數(shù)值循環(huán)右移Rs[4:0]位,循環(huán)器的進位值為Rm最后被移出的位Rm[Rs[4:0]-1]。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,RORR3則寄存器R4的值為0x0FF00000。7.2操作數(shù)預處理(9)<Rm>,RRX指令的操作數(shù)shifter_operand為寄存器Rm的數(shù)值右移一位,并用CPSR中的C標志位填補空出的位,CPSR中的C位則用移出的位代替。舉例如下:MOVR3,#0x00000FF0MOVR4,R3,RRX則寄存器R4的值為0x000007F8。

7.3運算類指令

ARM的運算類指令主要包括數(shù)據(jù)處理指令和乘法指令,ARMv4T共有16條數(shù)據(jù)處理指令和6條乘法指令,如下表所示。指令助記符指令功能指令助記符指令功能MOV數(shù)據(jù)傳送指令MVN數(shù)據(jù)求反傳送指令CMP比較指令CMN基于相反數(shù)的比較指令TST位測試指令TEQ相等測試指令ADD加法指令ADC帶進位加法指令SUB減法指令SBC帶借位減法指令RSB逆向減法指令RSC帶借位逆向減法指令AND邏輯與操作指令ORR邏輯或操作指令EOR邏輯異或操作指令BIC位清除指令MUL32位乘法指令MLA32位帶加數(shù)的乘法指令SMULL64位有符號數(shù)乘法指令SMLAL64位帶加數(shù)有符號數(shù)乘法指令UMULL64位無符號數(shù)乘法指令UMLAL64位帶加數(shù)無符號數(shù)乘法指令7.3運算類指令

1.MOV(傳送指令)MOV指令將<shifter_operand>表示的數(shù)值傳送到目標寄存器<Rd>中,并根據(jù)操作的結(jié)果有條件地更新CPSR中相應的標志位。指令的語法格式為:MOV{<cond>}{S}<Rd>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標寄存器;<shifter_operand>為向目標寄存器傳送的數(shù)據(jù),其尋址方式是立即數(shù)或寄存器。使用舉例如下:將數(shù)據(jù)從一個寄存器傳送到另一個寄存器中。MOVR4,R5;將一個立即數(shù)傳送到一個寄存器中。MOVEQR4,#300

;若前一條指令的結(jié)果為0,則R4=3007.3運算類指令

2.MVN(相反數(shù)傳送指令)MVN指令將<shifter_operand>表示的數(shù)值的反碼傳送到目標寄存器<Rd>中,并根據(jù)操作的結(jié)果有條件地更新CPSR中相應的標志位。指令的語法格式為:MVN{<cond>}{S}<Rd>,<shifter_operand>

其中各參數(shù)的用法與MOV指令相同。使用舉例如下:如果需要給寄存器R4傳送-300,則指令如下:MVNMIR4,#299

;若前一條指令的結(jié)果為負,則R4=-300

生成位掩碼:MVNR4,#0x01

求一個數(shù)的反碼:MVNR4,R47.3運算類指令

3.ADD(加法指令)ADD指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>中的值相加,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:ADD{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼,;<Rd>為目標寄存器;<Rn>為第一個源操作數(shù)所在的寄存器;<shifter_operand>為向目標寄存器傳送的數(shù)據(jù),其尋址方式是立即數(shù)或寄存器。使用舉例如下:一個寄存器中值和一個立即數(shù)相加:ADDR4,R5,#300一個寄存器中值和另一個寄存器中中值經(jīng)過預處理之后相加:ADDR4,R5,R6,LSL#37.3運算類指令

4.ADC(帶進位加法指令)ADC指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>中的值相加,再加上CPSR中C條件標志位的值,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:ADC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。使用舉例如下:ADC指令和ADD指令聯(lián)合可以實現(xiàn)兩個64位二進制數(shù)相加,比如要計算兩個64位二進制數(shù)0x2345678912345678和0x4567890134567890的和,則對應的匯編程序代碼如下。LDRR0,=0x12345678LDRR1,=0x23456789LDRR2,=0x34567890LDRR3,=0x45678901ADDSR4,R0,R2ADCR5,R1,R37.3運算類指令

5.SUB(減法指令)SUB指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:SUB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。使用舉例如下:一個寄存器中值減去一個立即數(shù),并影響CPSR。SUBSR4,R5,#300下面代碼段執(zhí)行后,R8寄存器的值為0x11111111。LDRR0,=0xa0000000LDRR1,=0xb0000000LDRR2,=0x12345678LDRR3,=0x23456789ADDSR4,R0,R1SUBVSSR8,R3,R27.3運算類指令

6.SBC(帶借位減法指令)SBC指令從<Rn>中減去<shifter_operand>表示的數(shù)值,再減去CPSR中C條件標志位的反碼,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:SBC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同ADD指令。SBC指令和SUB指令聯(lián)合可以實現(xiàn)兩個64位二進制數(shù)相減。如果寄存器R0和R1中存放一個64位二進制數(shù),其中R0存放低32位,R1存放高32位。R2和R3中存放另一個64位二進制數(shù),R2存放低32位,R3存放高32位。使用舉例如下:下面的指令序列實現(xiàn)了兩個64位二進制數(shù)的減法操作。

SUBSR4,R0,R2SBCR5,R1,R3

7.3運算類指令

7.RSB(逆向減法指令)RSB指令從<shifter_operand>表示的數(shù)值中減去寄存器<Rn>的值,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:RSB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<shifter_operand>為第1個源操作數(shù);<Rn>為第2個源操作數(shù);其他各參數(shù)用法同ADD指令。使用舉例如下:求一個寄存器值的反碼,并影響CPSR。RSBSR4,R5,#0

;R4=-R5求一個寄存器值的2n-1。RSBEQR4,R5,R5,LSL#n

;條件執(zhí)行,R4=R5×(2n-1)7.3運算類指令

8.RSC(帶借位逆向減法指令)RSC指令從<shifter_operand>表示的數(shù)值中減去寄存器<Rn>的值,再減去CPSR中C標志位的反碼,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:RSC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同RSB指令。使用舉例如下:RSC指令的典型用法為求一個64位二進制數(shù)的負數(shù)。RSBSR2,R0,#0RSCR3,R1,#07.3運算類指令

9.AND(邏輯與指令)AND指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進行與運算,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:AND{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<Rn>為第1個源操作數(shù)所在的寄存器;<shifter_operand>為第2個源操作數(shù);其他各參數(shù)用法同MOV指令。AND指令可用于提取寄存器中某些位的值,具體做法是設置一個掩碼值,將該值中對應于寄存器中欲提取的位設為1,其他的位設為0。將寄存器的值與該掩碼做與操作,即可得想提取的位的值。使用舉例如下:MOVR2,#0x80000000ANDR3,R3,R2

;提取R3寄存器的最高位

7.3運算類指令

10.ORR(邏輯或指令)ORR指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進行或運算,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為: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位設置為0ORRR3,R0,R3,LSL#8;將R3中數(shù)據(jù)邏輯左移8位,這時R3的低8位為0,ORR操作將R0(高24位為0)中低8位數(shù)據(jù)傳送到寄存器R3中。7.3運算類指令

11.EOR(邏輯異或指令)EOR指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值按位進行異或運算,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:EOR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同AND指令。EOR指令可用于將寄存器中某些位的值取反。將某一位值與0做異或操作,該位值不變;將某一位值與1做異或操作,該位值將被求反。使用舉例如下:下面的代碼將R2中高16位值取反。LDRR1,=0xFFFF0000EORR3,R2,R17.3運算類指令

12.BIC(位清除指令)BIC指令將<shifter_operand>表示的數(shù)值與寄存器<Rn>的值的反碼按位進行邏輯與運算,并把結(jié)果保存到目標寄存器<Rd>中,同時根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:BIC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,各參數(shù)用法同AND指令。BIC指令可用于將寄存器中某些位的值設置成0。將某一位值與1做BIC操作,該位值被設置成0;將某一位值與0做BIC操作,該位值保持不變。使用舉例如下:下面的代碼將R2中高16位值設置成0。LDRR1,=0xFFFF0000BICR3,R2,R17.3運算類指令

13.CMP(比較指令)CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位,后面的指令就可以根據(jù)CPSR中相應的條件位來判斷是否執(zhí)行。指令的語法格式為:CMP{<cond>}<Rn>,<shifter_operand>其中,<cond>為指令執(zhí)行的條件碼,當<cond>忽略時指令為無條件執(zhí)行;<Rn>為第1個操作數(shù)所在的寄存器;<shifter_operand>為第2個操作數(shù),其尋址方式是立即數(shù)或寄存器。CMP指令類似于SUBS指令,只是CMP指令不保存結(jié)果,而SUBS指令需要保存結(jié)果,并且CMP指令總是影響CPSR中相應位。使用舉例如下:CMPR2,R3

7.3運算類指令

14.CMN(基于相反數(shù)的比較指令)CMN指令將寄存器<Rn>中的值加上<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位,后面的指令就可以根據(jù)CPSR中相應的條件位來判斷是否執(zhí)行。指令的語法格式為:CMN{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。CMN指令通過給第1個操作數(shù)<Rn>加上第2個操作數(shù)<shifter_operand>的值來表示比較第1個操作數(shù)<Rn>和第2個操作數(shù)<shifter_operand>的負數(shù)。加上第2個操作數(shù)與減去第2個操作數(shù)的負數(shù)對CPSR中條件標志位的影響有細微的差別。當?shù)?個操作數(shù)為0或者0x80000000時二者結(jié)果不同。使用舉例如下:CMPR2,#0;C=1CMNR2,#0;C=07.3運算類指令

15.TST(位測試指令)TST指令將寄存器<Rn>中的值與<shifter_operand>表示的數(shù)值按位做邏輯與操作,根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:TST{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。TST指令通常用于測試寄存器中某些(個)位是0還是1。使用舉例如下:TSTR3,#01

;測試R3寄存器中最低位是0還是17.3運算類指令

16.TEQ(相等測試指令)TEQ指令將寄存器<Rn>中的值與<shifter_operand>表示的數(shù)值按位做邏輯異或操作,根據(jù)操作的結(jié)果更新CPSR中相應的條件標志位。指令的語法格式為:TEQ{<cond>}<Rn>,<shifter_operand>其中,各參數(shù)的使用方法與CMP指令相同。TEQ指令通常用于比較兩個數(shù)是否相等,這種比較操作不影響CPSR中的V位和C位(影響Z位)。TEQ指令也可用于比較兩個操作數(shù)符號是否相同,該指令執(zhí)行后,CPSR中的N位為兩個操作數(shù)符號異或操作的結(jié)果。使用舉例如下:TEQR3,#01

7.3運算類指令

17.MUL(32位乘法指令)MUL指令實現(xiàn)兩個32位的數(shù)(可以為無符號數(shù),也可為有符號數(shù))的乘積,并將結(jié)果的低32位存放到一個32位寄存器中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>其中,<cond>為指令執(zhí)行的條件碼;<Rd>寄存器為目標寄存器;<Rm>寄存器為第1個乘數(shù)所在的寄存器;<Rs>寄存器為第2個乘數(shù)所在的寄存器。使用舉例如下:LDRR0,=0x1234MOVR1,#16MULR2,R0,R1則R2中值為0x12340。7.3運算類指令

18.MLA(32位帶加數(shù)乘法指令)MLA指令實現(xiàn)兩個32位的數(shù)(可以為無符號數(shù),也可為有符號數(shù))的乘積,再將乘積加上第3個操作數(shù),并將結(jié)果的低32位存放到一個32位寄存器中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>其中,<Rn>為第3個操作數(shù)所在的寄存器,該操作數(shù)是一個加數(shù),其余參數(shù)的使用方法與MUL指令相同。除了將乘積再加上第3個操作數(shù)之外,MLA指令同MUL指令相同。使用舉例如下:LDRR0,=0x1234MOVR1,#16MOVR2,#5MLAR3,R0,R1,R2則R2中值為0x12345。7.3運算類指令

19.SMULL(64位有符號數(shù)乘法指令)SMULL指令實現(xiàn)兩個32位的有符號數(shù)的乘積,乘積結(jié)果的高32位存放到一個32位的寄存器<RdHi>中,乘積結(jié)果的低32位存放到一個32位寄存器<RdLo>中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,<RdHi>寄存器存放乘積結(jié)果的高32位數(shù)據(jù);<RdLo>寄存器存放乘積結(jié)果的低32位數(shù)據(jù);其余參數(shù)的使用方法與MUL指令相同。SMULL是最常用的32位符號數(shù)的乘法指令。使用舉例如下:MVNR0,#15;R0=-16MVNR1,#63;R1=-64SMULLR2,R3,R0,R1則R3=0x00000000,R2=0x00000400。7.3運算類指令

20.SMLAL(64位帶加數(shù)的有符號數(shù)乘法指令)SMLAL指令將兩個32位有符號數(shù)的64位乘積結(jié)果與<RdHi>和<RdLo>中的64位二進制數(shù)相加,加法結(jié)果的高32位存放到一個32位的寄存器<RdHi>中,加法結(jié)果的低32位存放到一個32位寄存器<RdLo>中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為: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運算類指令

21.UMULL(64位無符號數(shù)乘法指令)UMULL指令實現(xiàn)兩個32位的無符號數(shù)的乘積,乘積結(jié)果的高32位存放到一個32位的寄存器<RdHi>中,乘積結(jié)果的低32位存放到一個32位寄存器<RdLo>中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,參數(shù)的使用方法與SMULL指令相同。當<Rm>、<Rn>、<RdHi>、<RdLo>、<Rs>為R15時,指令執(zhí)行的結(jié)果不可預測。另外<RdHi>、<RdLo>和<Rm>必須是3個不同的寄存器,否則指令執(zhí)行的結(jié)果不可預測。UMULLS指令不影響CPSR中的C標志位和V標志位。使用舉例如下:LDRR0,=12345678LDRR1,=23456789UMULLR2,R3,R0,R1則R3=0x00010761,R2=0x6AEDE366。7.3運算類指令

22.UMLAL(64位帶加數(shù)無符號數(shù)乘法指令)UMLAL指令將兩個32位無符號數(shù)的64位乘積結(jié)果與<RdHi>和<RdLo>中的64位二進制數(shù)相加,加法結(jié)果的高32位存放到一個32位的寄存器<RdHi>中,加法結(jié)果的低32位存放到一個32位寄存器<RdLo>中,同時可以根據(jù)運算結(jié)果設置CPSR中相應的標志位。指令的語法格式為:UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中,參數(shù)的使用方法與SMLAL指令相同。使用舉例如下:MOVR0,#16MOVR1,#64MOVR2,0x40000MOVR3,0x20UMLALR2,R3,R0,R1則R3=0x00000020,R2=0x00040400。7.4控制類指令

ARM的控制類指令主要包括分支指令、CPSR訪問指令、信號量指令、異常處理指令和協(xié)處理器指令,ARMv4T共有13條控制類指令。指令助記符指令功能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ù)寫入指令MCRARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令MRC協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令7.4控制類指令

1.B(跳轉(zhuǎn)指令)B指令將<target_address>表示的目標地址通過計算傳送到PC中,從而改變程序的執(zhí)行流程,這種改變可以是有條件的,也可以是無條件的。指令的語法格式為:B{<cond>}<target_address>其中,<cond>為指令執(zhí)行的條件碼;<target_address>為指令跳轉(zhuǎn)的目標地址。B指令跳轉(zhuǎn)的目標地址采用相對尋址方式,即指令中的目標地址<target_address>是真正目標地址相對于當前指令的地址(由PC指出)的偏移量。B指令主要的應用還在于條件跳轉(zhuǎn)。由于有15個條件碼,因此在實際應用中可以有15條不同的條件跳轉(zhuǎn)指令。使用舉例如下:BEQ complete

;條件跳轉(zhuǎn)BLT lessthan

;條件跳轉(zhuǎn)B gcd

;無條件跳轉(zhuǎn)7.4控制類指令

2.BL(帶返回的跳轉(zhuǎn)指令)BL將<target_address>表示的目標地址通過計算傳送到PC中,同時將當前指令的下一條指令的地址保存在寄存器LR中,從而實現(xiàn)子程序的調(diào)用。指令的語法格式為:BL{<cond>}<target_address>其中,各參數(shù)的使用方法與B指令相同。BL指令的目標地址的計算方法與B指令相同。使用舉例如下:下面的程序段是一個子程序調(diào)用的簡單例子。BL subroutineexit……subroutineMOV R9,#100MOVR10,#90ADD R11,R9,R10MOV PC,LR7.4控制類指令

3.BX(帶狀態(tài)切換的跳轉(zhuǎn)指令)BX也是一條跳轉(zhuǎn)指令,但目標地址采用寄存器尋址。BX指令主要用于從ARM代碼區(qū)跳轉(zhuǎn)到Thumb代碼區(qū)。當從Thumb空間返回ARM空間時,也要用BX指令。指令的語法格式為:BX{<cond>}<Rm>其中,<cond>為指令執(zhí)行的條件碼;<Rm>為跳轉(zhuǎn)的目標地址。使用舉例如下:

CODE32LDRR0,=thumbcode+1MOVLR,PCBX R0……CODE16thumbcodeADDR7,#1BX LR7.4控制類指令

4.MSR(通用寄存器到狀態(tài)寄存器傳送指令)MSR指令用于將某通用寄存器的內(nèi)容或一個立即數(shù)傳送到狀態(tài)寄存器中。指令的語法格式為:MSR{<cond>}CPSR_<fields>,#<immediate>MSR{<cond>}CPSR_<fields>,#<Rm>MSR{<cond>}SPSR_<fields>,#<immediate>MSR{<cond>}SPSR_<fields>,#<Rm>其中,<fields>設置狀態(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控制類指令

5.MRS(狀態(tài)寄存器到通用寄存器傳送指令)MRS指令用于將狀態(tài)寄存器的內(nèi)容傳送到某通用寄存器中。指令的語法格式為:MRS{<cond>}<Rd>,CPSRMRS{<cond>}<Rd>,SPSR其中,<cond>為指令執(zhí)行的條件碼,忽略條件碼時指令無條件執(zhí)行;<Rd>寄存器為目標寄存器。MRS指令主要用于以下三種場合:通常通過“讀取-修改-寫回”操作序列修改狀態(tài)寄存器的內(nèi)容時,MRS指令用于將CPSR的內(nèi)容讀到通用寄存器中;當異常中斷允許嵌套時,需要在進入異常中斷之后,嵌套中斷發(fā)生之前保存當前處理器模式對應的SPSR。這時需要先通過MRS指令讀出SPSR的值,再用其它指令將SPSR的值保存起來;在進程切換時也需要保存當前狀態(tài)寄存器的值。使用舉例如下:下面的指令讀取SPSR中值到寄存器R10中。MRS R10,SPSR7.4控制類指令

6.SWP(字交換指令)SWP指令用于將一個內(nèi)存字單元(該單元地址放在寄存器<Rn>中)的內(nèi)容讀取到一個寄存器<Rd>中,同時將另一個寄存器<Rm>的內(nèi)容寫入到該內(nèi)存單元中。當<Rd>和<Rm>為同一個寄存器時,指令交換該寄存器和內(nèi)存單元的內(nèi)容。指令的語法格式為:SWP{<cond>}<Rd>,<Rm>,<Rn>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標寄存器;<Rm>包含將要保存到內(nèi)存中的數(shù)值;<Rn>包含將要訪問的內(nèi)存單元的地址。本指令主要用于實現(xiàn)信號量操作。使用舉例如下:SWPR1,R2,[R3] ;將內(nèi)存單元[R3]中字數(shù)據(jù)讀取到寄存器R1中,同時將R2寄存器的數(shù)據(jù)寫入到內(nèi)存單元[R3]中。SWPR1,R1,[R2]

;將R1寄存器的內(nèi)容和內(nèi)存單元[R2]的內(nèi)容交換。7.4控制類指令

7.SWPB(字節(jié)交換指令)SWPB指令用于將一個內(nèi)存字節(jié)單元(該單元地址放在寄存器<Rn>中)的內(nèi)容讀取到一個寄存器<Rd>中,寄存器<Rd>的高24位設置為0,同時將另一個寄存器<Rm>的低8位數(shù)值寫入到該內(nèi)存單元中。當<Rd>和<Rm>為同一個寄存器時,指令交換該寄存器低8位和內(nèi)存字節(jié)單元的內(nèi)容。指令的語法格式為:SWPB{<cond>}<Rd>,<Rm>,<Rn>其中,各參數(shù)用法同SWP指令相同。本指令主要用于實現(xiàn)信號量操作。使用舉例如下:SWPBR1,R2,[R3]

;將內(nèi)存單元[R3]中字節(jié)數(shù)據(jù)讀取到寄存器R1中,R1的高24位設置為0,同時將R2寄存器的低8位數(shù)據(jù)寫入到內(nèi)存單元[R3]中。7.4控制類指令

8.SWI(軟中斷指令)SWI指令用于產(chǎn)生軟中斷,ARM通過這種機制實現(xiàn)在用戶模式對操作系統(tǒng)中特權(quán)模式的程序的調(diào)用。指令的語法格式為:SWI{<cond>}<immed_24>其中,<cond>為指令執(zhí)行的條件碼;<immed_24>為24位的立即數(shù)。SWI指令執(zhí)行時,首先將該指令的下一條指令的地址保存在R14_svc寄存器中,將CPSR保存在SPSR_svc寄存器中。然后設置處理器模式為特權(quán)模式,并設置運行在ARM環(huán)境(而不是Thumb環(huán)境)。接著禁止一般中斷,最后將PC值設置為0x00000008或0xFFFF0008。本指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務。。使用舉例如下:下面的代碼段使程序正常返回系統(tǒng)。MOV R0,#0x18LDR R1,=0x20026SWI0x123456

;注意這里立即數(shù)沒有符號“#”7.4控制類指令

9.CDP(協(xié)處理器數(shù)據(jù)操作指令)CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,該操作由協(xié)處理器完成。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。利用這個特點,可以通過軟件模擬該協(xié)處理器操作。指令的語法格式為:CDP{<cond>}<coproc>,<opcode_1>,<CRd>,<CRn>,<CRm>,<opcode_2>其中,<cond>為指令執(zhí)行的條件碼;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<opcode_1>為協(xié)處理器即將執(zhí)行的操作碼1;<CRd>作為目標寄存器的協(xié)處理器寄存器;<CRn>為存放第1個操作數(shù)的協(xié)處理器寄存器;<CRm>為存放第2個操作數(shù)的協(xié)處理器寄存器;<opcode_2>為協(xié)處理器即將執(zhí)行的操作碼2。當一個協(xié)處理器硬件不能執(zhí)行屬于它的協(xié)處理器指令時,將產(chǎn)生未定義指令異常中斷。利用這個特點,可以通過軟件來模擬該協(xié)處理器的硬件操作,只要用該軟件來替換指令異常中斷處理程序即可。7.4控制類指令

10.LDC(協(xié)處理器數(shù)據(jù)讀取指令)LDC指令從一系列連續(xù)的內(nèi)存單元將數(shù)據(jù)讀取到協(xié)處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語法格式為:LDC{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼,當<cond>忽略時指令為無條件執(zhí)行;L指示指令為長讀取操作,比如用于雙精度的數(shù)據(jù)傳送;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<CRd>作為目標寄存器的協(xié)處理器寄存器;<address_mode>為指令的尋址方式,指出內(nèi)存單元的地址,共有4種地址的計算方法。7.4控制類指令

11.STC(協(xié)處理器數(shù)據(jù)寫入指令)STC指令將協(xié)處理器的寄存器中的數(shù)據(jù)寫入到一系列連續(xù)的內(nèi)存單元中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語法格式為:STC{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼,當<cond>忽略時指令為無條件執(zhí)行;L指示指令為長讀取操作,比如用于雙精度的數(shù)據(jù)傳送;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<CRd>作為源寄存器的協(xié)處理器寄存器;<address_mode>為指令的尋址方式,指出內(nèi)存單元的地址。7.4控制類指令

12.MCR(ARM寄存器到協(xié)處理器寄存器傳送指令)MCR指令將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語法格式為:MCR{<cond>}<coproc>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<cond>為指令執(zhí)行的條件碼,當<cond>忽略時指令為無條件執(zhí)行;<coproc>為協(xié)處理器的編碼,可以是P0~P15;<opcode_1>為協(xié)處理器即將執(zhí)行的操作碼1;<Rd>為ARM寄存器,其值將被傳送到協(xié)處理器寄存器中;<CRn>為目標寄存器的協(xié)處理器寄存器;<CRm>為附加的目標寄存器或者源寄存器的協(xié)處理器寄存器;<opcode_2>可選的協(xié)處理器即將執(zhí)行的操作碼2。7.4控制類指令

13.MRC(協(xié)處理器寄存器到ARM寄存器傳送指令)MRC指令將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義的指令異常中斷。指令的語法格式為:MRC{<cond>}<coproc>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<Rd>為目標寄存器的ARM寄存器;<CRn>為源寄存器的協(xié)處理器寄存器;<CRm>為附加的目標寄存器或者源寄存器的協(xié)處理器寄存器;其它參數(shù)同MCR指令相同。7.5傳送類指令ARM的傳送類指令主要包括Load/Store指令和多Load/Store指令。ARMv4T共有12條Load/Store指令和2條多Load/Store指令。指令助記符指令功能指令助記符指令功能LDR字數(shù)據(jù)讀取指令LDRB字節(jié)數(shù)據(jù)讀取指令LDRBT用戶模式字節(jié)數(shù)據(jù)讀取指令LDRH半字數(shù)據(jù)讀取指令LDRSB有符號字節(jié)數(shù)據(jù)讀取指令LDRSH有符號的半字數(shù)據(jù)讀取指令LDRT用戶模式字數(shù)據(jù)讀取指令STR字數(shù)據(jù)寫入指令STRB字節(jié)數(shù)據(jù)寫入指令STRBT用戶模式字節(jié)數(shù)據(jù)寫入指令STRH半字數(shù)據(jù)寫入指令STRT用戶模式字數(shù)據(jù)寫入指令LDM批量字數(shù)據(jù)讀取指令STM批量字數(shù)據(jù)寫入指令7.5傳送類指令

1.LDR(字數(shù)據(jù)讀取指令)LDR指令用于從內(nèi)存中將一個32位的字數(shù)據(jù)讀取到指令中的目標寄存器中。指令的語法格式為:LDR{<cond>} <Rd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為目標寄存器;<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傳送類指令

2.LDRB(字節(jié)數(shù)據(jù)讀取指令)LDRB指令用于從內(nèi)存中將一個8位的字節(jié)數(shù)據(jù)讀取到指令中的目標寄存器中。并將目標寄存器的高24位清零。指令的語法格式為:LDR{<cond>}B<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:假設內(nèi)存地址0開始的連續(xù)4個字節(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傳送類指令

3.LDRBT(用戶模式的字節(jié)數(shù)據(jù)讀取指令)LDRBT指令用于從內(nèi)存中將一個8位的字節(jié)數(shù)據(jù)讀取到指令中的目標寄存器中,并將目標寄存器的高24位清零。當在特權(quán)級的處理器模式下使用本指令時,內(nèi)存系統(tǒng)將該操作當作一般用戶模式下的內(nèi)存訪問操作。指令的語法格式為:LDR{<cond>}BT<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。異常中斷程序是在特權(quán)級的處理器模式下執(zhí)行的,這時如果需要按照用戶模式的權(quán)限訪問內(nèi)存,就可以使用LDRBT指令。使用舉例如下:LDRBT R4,[R5]7.5傳送類指令

4.LDRH(半字數(shù)據(jù)讀取指令)LDRH指令用于從內(nèi)存中將一個16位的半字數(shù)據(jù)讀取到指令中的目標寄存器中,并將目標寄存器的高16位清零。如果指令中的內(nèi)存地址不是半字對齊的,指令會產(chǎn)生不可預知的結(jié)果。指令的語法格式為:LDR{<cond>}H<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRHR4,[R5]

;將內(nèi)存單元[R5]中的半字讀取到R4中,R4中高16位設置為07.5傳送類指令

5.LDRSB(有符號的字節(jié)數(shù)據(jù)讀取指令)LDRSB指令用于從內(nèi)存中將一個8位的字節(jié)數(shù)據(jù)讀取到指令中的目標寄存器中。并將目標寄存器的高24位設置成該字節(jié)數(shù)據(jù)的符號位的值(即將該字節(jié)數(shù)據(jù)進行符號位擴展,生成32位數(shù)據(jù))。指令的語法格式為:LDR{<cond>}SB<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRSBR4,[R5,#-4]!;將內(nèi)存單元[R5]-4中的字節(jié)讀取到R4中,R4中高24位設置為該字節(jié)數(shù)據(jù)的符號位,同時R5=R5-47.5傳送類指令

6.LDRSH(有符號的半字數(shù)據(jù)讀取指令)LDRSH指令用于從內(nèi)存中將一個16位的半字數(shù)據(jù)讀取到指令中的目標寄存器中,并將目標寄存器的高16位設置成該半字數(shù)據(jù)的符號位的值(即將該半字數(shù)據(jù)進行符號位擴展,生成32位數(shù)據(jù))。如果指令中的內(nèi)存地址不是半字對齊的,指令會產(chǎn)生不可預知的結(jié)果。指令的語法格式為:LDR{<cond>}SH<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。使用舉例如下:LDRSHR4,[R5],#4

;將內(nèi)存單元[R5]中的半字數(shù)據(jù)讀取到R4中,R4中高16位設置為該半字數(shù)據(jù)的符號位,然后R5=R5+47.5傳送類指令

7.LDRT(用戶模式的字數(shù)據(jù)讀取指令)LDRT指令用于從內(nèi)存中將一個32位的字數(shù)據(jù)讀取到指令中的目標寄存器中。當在特權(quán)級的處理器模式下使用本指令時,內(nèi)存系統(tǒng)將該操作當作一般用戶模式下的內(nèi)存訪問操作。指令的語法格式為:LDR{<cond>}T<Rd>,<addressing_mode>其中,各參數(shù)的用法同LDR指令。異常中斷程序是在特權(quán)級的處理器模式下執(zhí)行的,這時如果需要按照用戶模式的權(quán)限訪問內(nèi)存,就可以使用LDRT指令。使用舉例如下:LDRT R4,[R5,#1]7.5傳送類指令

8.STR(字數(shù)據(jù)寫入指令)STR指令用于將一個32位的字數(shù)據(jù)寫入到指令中指定的內(nèi)存單元。指令的語法格式為:STR{<cond>}<Rd>,<addressing_mode>其中,<cond>為指令執(zhí)行的條件碼;<Rd>為源寄存器;<addressing_mode>描述目標操作數(shù)的尋址方式,具體算法同LDR指令。STR指令用于將一個32位的字數(shù)據(jù)寫入指令中指定的內(nèi)存單元。使用

溫馨提示

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

評論

0/150

提交評論