arm原理與c程序設(shè)計 第三章_第1頁
arm原理與c程序設(shè)計 第三章_第2頁
arm原理與c程序設(shè)計 第三章_第3頁
arm原理與c程序設(shè)計 第三章_第4頁
arm原理與c程序設(shè)計 第三章_第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章ARM 指令表3.1 ARM指令學(xué)習程序框架3.2 ARM指令格式3.3 ARM指令尋址方式 3.4 ARM指令匯總本章小結(jié) 3.1 ARM指令學(xué)習程序框架按照小節(jié)中的方法,建立工程文件,其中,源文件名為。在圖1-16中,指定RO Base為0 x3000 0000(對于UP-NETARM2410實驗箱出廠設(shè)置)或者0 x4000 0000(對于SBC2440出廠設(shè)置)。需要說明的是,如果用戶更新了實驗箱上的FLASH內(nèi)容,那么需要按照第五章的內(nèi)容進行ARM匯編語言程序設(shè)計,即需要添加初始化S3C2410芯片的程序段。的代碼如下:1AREA InstAn, CODE, READONLY2

2、ENTRY3 START4;5;6;7 ;Here is an example which shows the usage of MOV:8 MOV R0, #0 x789 MOV R2, R010 STOP 11BLSTOP12 END上面的程序段中分號后面的為注釋,START標號要頂格寫,START標號后面書寫需要分析的ARM指令,分析結(jié)果要在RealView Debugger調(diào)試器的存放器中查看(本書中不會出現(xiàn)printf等輸出信息到控制臺的語句,而很多與ARM相關(guān)的書里面都有類似的語句。本書程序的輸出結(jié)果通過四種方式查看,即存放器、存儲器、顯示屏等硬件輸出設(shè)備或計算機串行終端顯示)。上

3、述程序演示了MOV指令的局部功能,其中,“MOV R0, #0 x78執(zhí)行后,R0存放器的值為0 x78,“MOV R2, R0執(zhí)行后,存放器R2的值為0 x78。程序最后要有一個循環(huán)語句。 3.2 ARM指令格式全部ARM指令的字長均為32位,按字對齊方式存儲(一個字等于4個字節(jié)),如果第一條ARM指令的地址為0 x0000 0000,那么其下一條指令的地址為0 x0000 0004,依次類推,即存儲器中ARM指令的地址的最低兩位總為0。ARM指令的匯編語言語法格式為S , ,其中:為必需項, 為可選項。opcode表示ARM指令匯編語言助記符,如ADC、ADD等,針對ARM920T(即AR

4、Mv4T)而言,具體內(nèi)容參見表3-1。表3-1 基于ARMv4T架構(gòu)的ARM指令助記符序號助記符序號助記符序號助記符序號助記符1ADC14LDR27MUL40STRH2ADD15LDRB28MVN41STRT3AND16LDRBT29ORR42SUB4B17LDRH30RSB43SWI5BIC18LDRSB31RSC44SWP6BL19LDRSH32SBC45SWPB7BX20LDRT33SMLAL46TEQ8CDP21MCR34SMULL47TST9CMN22MLA35STC48UMLAL10CMP23MOV36STM49UMULL11EOR24MRC37STR12LDC25MRS38STR

5、B13LDM26MSR39STRBTcond表示指令執(zhí)行的條件碼助記符。所有ARM指令都是條件執(zhí)行的:當條件滿足時,指令執(zhí)行;當條件不滿足時,指令不執(zhí)行。條件碼位于指令機器編碼的高4位,如圖3-1所示,即第3128位,共有24=16種條件碼,其含義和助記符如表3-2所示。S表示如果指令中有S后綴,那么指令執(zhí)行將影響CPSR的值,否那么不影響。Rd表示目的存放器。Rn表示第一個源操作數(shù)存放器。shifter_operand表示第二個源操作數(shù)。圖3-1 ARM指令機器碼匯總表3-2 指令條件碼助記符及其含義條件碼31:28條件碼助記符含 義CPSR中條件標志位值0000EQ相等Z=10001NE不

6、相等Z=00010CS/HS無符號數(shù)大于或等于C=10011CC/LO無符號數(shù)小于C=00100MI負數(shù)N=10101PL非負數(shù)N=00110VS上溢出V=10111VC未溢出V=01000HI無符號數(shù)大于C=1且Z=01001LS無符號數(shù)小于或等于C=0且Z=11010GE有符號數(shù)大于或等于(N=1且V=1) 或 (N=0且V=0),即N=V1011LT有符號數(shù)小于(N=1且V=0) 或 (N=0且V=1),即NV1100GT有符號數(shù)大于Z=0且N=V1101LE有符號數(shù)小于或等于Z=1且NV1110AL無條件執(zhí)行1111 一般地,一條ARM匯編語言指令編譯后對應(yīng)于一條可執(zhí)行的32位ARM機

7、器碼指令,ARM機器碼指令如圖3-1所示,其中第3128位為條件碼,從圖3-1中可以分析出各操作數(shù)所占的位數(shù)及可能的取值范圍。例如,Rn、Rd、Rs和Rm用于表示存放器R0R15中的某個,故均占有4位。3.3 ARM指令尋址方式ARM指令尋址方式本質(zhì)上是ARM匯編指令的編碼規(guī)那么,熟悉ARM指令尋址方式,有助于寫出正確的ARM指令。在學(xué)習復(fù)雜的匯編語言指令集時,指令尋址方式顯得尤為重要;盡管基于RISC指令集的ARM指令數(shù)量較少,但是了解ARM指令的尋址方式,可以更深入地掌握ARM匯編指令集。按照指令操作數(shù)類型,ARM指令集分為五種尋址方式,依次為數(shù)據(jù)處理操作數(shù)尋址、字與無符號字節(jié)存儲/裝入尋

8、址、雙字與半字及有符號字節(jié)存儲/裝入尋址、存放器批量存儲/裝入尋址、協(xié)處理器存儲/裝入尋址。3.3.1 數(shù)據(jù)處理操作數(shù)尋址數(shù)據(jù)處理操作數(shù)尋址方式的指令語法為:S , , 其中,有11種形式,如下所述。模式1:立即數(shù)機器碼:如圖3-2所示。圖3-2 形式1的ARM指令編碼語法:#這里,immediate為以圖3-2中8位immed_8為低8位、高24位補0后的32位數(shù)循環(huán)右移2rotate_imm位得到的立即數(shù)。因此,并非所有32位的數(shù)都能充當立即數(shù),同時,規(guī)定當立即數(shù)小于0 xFF時,immed_8 = immediate,rotate_imm = 0;當立即數(shù)大于0 xFF時,選擇使rota

9、te_imm數(shù)值最小的編碼形式。容易推算,0 xFF1和0 x102等是不合法的立即數(shù),而0 xFF0和0 x104等那么是合法的立即數(shù)。立即數(shù)0 x3F0滿足編碼方式:(1) immed_8 = 0 x3F,rotate_imm = 0 xE;(2) immed_8 = 0 xFC,rotate_imm = 0 xF。此時,采用(1)方式編碼,因為方式(1)下rotate_imm較小。如果在編程時寫錯了立即數(shù),編譯時會報錯!例如: MOV R0, #0 x03 ADD R3, R3, #1模式2:存放器機器碼:如圖3-3所示。圖3-3 形式2的ARM指令編碼 語法: 這里,Rm為操作數(shù)的值;

10、如果Rm或Rn指定為R15,那么使用當前指令地址值加上8后的值。例如:ADD R3, R3, R0ADD R3, R3, R15 ; 注:如果該指令地址為0 x3000 0010,其運算為: ;R3 = R3 + 0 x3000 0010 + 8模式3:存放器邏輯左移立即數(shù)機器碼:如圖3-4所示。圖3-4 形式3的ARM指令編碼語法:, LSL # 這里,操作數(shù)等于Rm的值邏輯左移shift_imm位。如果Rm或Rn指定為15,那么操作數(shù)使用當前指令地址值加上8后的值。例如:MOV R1, R0, LSL #2模式4:存放器邏輯左移存放器機器碼:如圖3-5所示。圖3-5 形式4的ARM指令編碼

11、語法:, LSL 這里,操作數(shù)為Rm的值邏輯左移Rs7:0位。因此,當Rs7:0大于等于32時,操作數(shù)將為0。R15不能用作Rn、Rd、Rs或Rm。例如:MOV R2, R0, LSL R1模式5:存放器邏輯右移立即數(shù)機器碼:如圖3-6所示。圖3-6 形式5的ARM指令編碼語法:, LSR #這里,操作數(shù)為存放器Rm的值右移shift_imm位。如果Rm或Rn指定R15,那么操作數(shù)使用當前指令地址值加上8后的值。例如:MOV R2, R0, LSR #1模式6:存放器邏輯右移存放器機器碼:如圖3-7所示。圖3-7 形式6的ARM指令編碼語法:, LSR 這里,操作數(shù)為Rm的值右移Rs7:0位。

12、R15不能用作Rd、Rs、Rm或Rn。例如:MOV R2, R0, LSR R1模式7:存放器算術(shù)右移立即數(shù)機器碼:如圖3-8所示。圖3-8 形式7的ARM指令編碼 語法:, ASR # 這里,操作數(shù)為Rm算術(shù)右移shift_imm位(要求:1shift_imm32),按Rm31進行符號擴展,即如果Rm31=0,那么左邊補0;如果Rm31=1,那么左邊補1。 因此,當shift_imm= 32時,操作數(shù)等于0(Rm31 = 0)或等于0 xFFFF FFFF(Rm31 = 1)。如果Rm或Rn指定為R15,那么操作數(shù)使用當前指令地址值加上8后的值。例如:MOV R2, R1, ASR #4模式

13、8:存放器算術(shù)右移存放器機器碼:如圖3-9所示。圖3-9 形式8的ARM指令編碼語法:, ASR 這里,操作數(shù)為Rm的值算術(shù)右移Rs7:0位。當Rs7:0 = 0時,相當于不移位;當Rs7:032時,操作數(shù)為00(Rm31 = 0)或等于0 xFFFF FFFF(Rm31 = 1)。R15不能用作Rn、Rd、Rs或Rm。例如:MOV R2, R1, ASR R0模式9:存放器循環(huán)右移立即數(shù)機器碼:如圖3-10所示。圖3-10 形式9的ARM指令編碼語法:, ROR #這里,操作數(shù)循環(huán)右移shift_imm位(要求:1shift_imm31)。如果Rm或Rn指定為R15,那么操作數(shù)使用當前指令地

14、址值加上8后的值。例如:MOV R2, R1, ROR #4模式10:存放器循環(huán)右移存放器機器碼:如圖3-11所示。圖3-11 形式10的ARM指令編碼語法:, ROR 這里,操作數(shù)為Rm的值循環(huán)右移。R15不能用作Rn、Rd、Rs或Rm。例如:MOV R2, R1, ROR R0模式11:存放器擴展循環(huán)右移機器碼:如圖3-12所示。圖3-12 形式11的ARM指令編碼語法:, RRX 這里,操作數(shù)為Rm的值邏輯右移一位(該位放入Shifter_carry_out),CPSR的C標志位填充Rm的最高位空位。如果Rm或Rn指定R15,那么操作數(shù)使用當前指令地址值加上8后的值。例如:MOV R2,

15、 R1, RRX備注:在上述移位操作中,無論是左移還是右移,最后移出的位的值均存放在Shifter_carry_out中。3.3.2 字與無符號字節(jié)存儲/裝入尋址字與無符號字節(jié)存儲/裝入尋址方式的指令語法為:LDR|STRBT , 其中,、B和T的位置可調(diào)換;有9種模式(均適用于LDR、LDRB、STR和STRB;只有最后3種模式適用于LDRBT、LDRT、STRBT和STRT),如下所述。模式1:立即數(shù)偏置機器碼:如圖3-13所示。圖3-13 模式1的ARM指令編碼語法:, #+/-這里,操作數(shù)地址為Rn加上或減去12位的立即數(shù)值。U = 1時為加;U = 0時為減。B = 0時為字操作;B

16、 = 1時為無符號字節(jié)操作。L = 0時為裝入操作;L = 1時為存儲操作。R15為Rn時,使用當前指令地址加上8后的值。例如:LDR R1, R0, #0 x04; 將內(nèi)存地址R0+0 x4處的值裝入R1中LDR R1, R15, #0 x04; 將內(nèi)存地址PC+8+0 x4處的值裝入R1中備注:要考慮小端或大端存儲模式,例如:在小端模式下,對于字訪問來說,地址0 x3000 0000處的字是指0 x3000 0003至0 x3000 0000四個字節(jié)地址里的字節(jié)從高地址至低地址連接起來的32位字;地址0 x3000 0001處的字也是指x3000 0003至0 x3000 0000四個字節(jié)

17、地址里的字節(jié)從高地址至低地址連接起來的字,只是最高字節(jié)處于0 x3000 0000處,依次為0 x3000 0003和0 x3000 0002,最低字節(jié)地址為0 x3000 0001。 地址0 x3000 0002處的字仍然是指x3000 0003至0 x3000 0000四個字節(jié)地址里的字節(jié)連接起來的字,這時最高字節(jié)處于0 x3000 0001地址處,依次為0 x3000 0000和0 x3000 0003,最低字節(jié)地址為0 x3000 0002;同理,地址0 x3000 0003處的字仍然是指x3000 0003至0 x3000 0000四個字節(jié)地址里的字節(jié)連接起來的字,這時最高字節(jié)處于0

18、 x3000 0002地址處,依次為0 x3000 0001和0 x3000 0000,最低字節(jié)地址為0 x3000 0003。大端模式下的排序模式正好相反。盡管如上所述,作者建議,在進行字訪問時,12位的立即數(shù)的最后兩位應(yīng)為0b00,即能被4整除。注意:STR表示的操作是向右賦值的。模式2:存放器偏置機器碼:如圖3-14所示。圖3-14 模式2的ARM指令編碼語法:, +/-Rm 這里,操作數(shù)地址為Rn(在此稱為基址存放器)的值加上或減去Rm(在此稱為變址存放器)的值。R15不能用作Rn。例如:LDRB R1, R0, R2 ; 將內(nèi)存地址R0+R2處的字 節(jié)裝入R1中模式3:尺度存放器偏置

19、機器碼:如圖3-15所示。圖3-15 模式3的ARM指令編碼語法:有如下五種:, +/, LSL #, +/, LSR #, +/, ASR #, +/, ROR #, +/, RRX這里,操作數(shù)地址為Rn加上或減去Rm的移位值。對于LSL,移位立即數(shù)shift_imm為031;對于LSR和ASR,shift_imm為132;對于ROR,shift_imm為131。R15不能用作Rm;R15用作Rn時,使用當前指令地址加上8后的值。例如:LDRB R1, R0, R2, LSL #1 ; 將內(nèi)存地址R0+R21 處的字節(jié)值裝入R1中模式4:立即數(shù)預(yù)索引機器碼:如圖3-16所示。圖3-16 模式

20、4的ARM指令編碼語法:, #+/offset_12! 這里,操作數(shù)地址為Rn的值加上或減去12位的立即數(shù)偏移量后的值,同時,這個值寫入到Rn中。語法中的“!號將設(shè)置機器碼中的W位(即第21位),表示Rn加上或減去立即數(shù)后的值回賦給Rn。R15不能用作Rn。例如:LDR R1, R0, #0 x04!模式5:存放器預(yù)索引機器碼:如圖3-17所示。圖3-17 模式5的ARM指令編碼語法:, +/! 這里,操作數(shù)地址為Rn的值加上或減去Rm的值,這個地址值回賦給Rn。R15不能用作Rm和Rn。例如:LDR R1, R0, R2! ; 內(nèi)存地址R0+R2處的值賦; 給R1, R0 = R0 + R2

21、模式6:尺度存放器預(yù)索引機器碼:如圖3-18所示。圖3-18 模式6的ARM指令編碼語法:有如下五種:, +/, LSL #!, +/, LSR #!, +/-, ASR #!, +/-, ROR #!, +/-, RRX!該模式是在模式3操作的根底上,即操作數(shù)地址為Rn的值加上或減去Rm移位后的值,增加了寫回操作,即地址值回賦給Rn。例如:LDRB R1, R0, R2, LSL #1! ; 內(nèi)存地址R0+R21處的值裝入R1,R0 = R0 + R21模式7:立即數(shù)后索引機器碼:如圖3-19所示。圖3-19 模式7的ARM指令編碼語法:, #+/ 這里,操作數(shù)地址為Rn的值,如果指令條件滿

22、足,那么Rn加上或減去12位立即數(shù)后的值賦給Rn。R15不能用作Rn。例如:LDR R1, R0, #0 x4 ; 內(nèi)存地址R0處的值賦給R1, R0 = R0 + 4模式8:存放器后索引機器碼:如圖3-20所示。圖3-20 模式8的ARM指令編碼語法:, +/ 這里,操作數(shù)地址為Rn的值,指令條件滿足時,Rn加上或減去Rm的值賦給Rn。R15不能用作Rm和Rn。例如:LDR R1, R0, R2 ; 內(nèi)存地址R0處的值賦給R1, R0 = R0 + R2模式9:尺度存放器后索引機器碼:如圖3-21所示。圖3-21 模式9的ARM指令編碼語法:有如下五種:, +/, LSL #, +/, LS

23、R #, +/, ASR #, +/, ROR #, +/, RRX這里操作數(shù)地址為Rn的值,Rn加上或減去Rm的移位值后的值賦給Rn。R15不能用作Rm或Rn。 例如:LDR R1, R0, R2, LSL #0 x01 ;內(nèi)存地址R0處的值賦給R1, R0 = R0 + R213.3.3 雙字與半字及有符號字節(jié)存儲/裝入尋址雙字與半字及有符號字節(jié)存儲/裝入尋址方式的指令語法為:LDR|STRH|SH|SB|D , 其中,指令中H、SH、SB或D必有其一,條件可以放在指令助記符后面,例如,LDRHLS和LDRLSH均合法;有如下所述6種模式。模式1:立即數(shù)偏置機器碼:如圖3-22所示。圖3-

24、22 模式1下的ARM指令編碼語法:, #+/這里,操作數(shù)地址為Rn的值加上或減去8位立即數(shù)偏移量,其中,8位立即數(shù)的高四位為immedH,低四位為immedL。 STR開頭的存儲操作為自左向右,LDR開頭的裝入操作是自右向左的。圖3-22至圖3-27中,L、S和H的意義為:當LSH = 0b001時為存儲半字;當LSH = 0b010時為裝入雙字;當LSH = 0b011時為存儲雙字;當LSH = 0b101時為裝入無符號半字;當LSH = 0b110時為裝入有符號字節(jié);當LSH = 0b111時為裝入有符號半字。R15用作Rn時,Rn為當前指令地址加上8的值。注意:對于半字操作,建議立即數(shù)

25、的最低位為0(實際上要求的是Rn加上或減去立即數(shù)的值的最低位為0),在小端存儲模式下,返回的半字的高字節(jié)為操作數(shù)地址加1處的值,半字的低字節(jié)為該地址處的值;對于雙字操作,細心的讀者可能已經(jīng)從表3-1中查證了,ARMv4T并不支持。如果編程時寫了不支持的ARM指令,在RVDS中編譯時,會提示“Instruction not supported on target CPU(目標CPU不支持此指令)。例如:LDRH R1, R0, #0 x4 ; 內(nèi)存地址R0+4處的半字裝入R1中; 實際上裝入的是R0+5和R0+4兩處 ; 的字節(jié)合并值 ; 要求:R0+4的最低位為0模式2:存放器偏置機器碼:如圖

26、3-23所示。圖3-23 模式2下的ARM指令編碼語法:, +/ 這里,操作數(shù)地址為Rn加上或減去Rm的值。R15不能用作Rm;R15用作Rn時,Rn的值取當前指令地址加上8。例如:LDRH R1, R0, R2 ; 內(nèi)存地址R0+R2處的半字; 裝入R1中模式3:立即數(shù)預(yù)索引機器碼:如圖3-24所示。圖3-24 模式3下的ARM指令編碼語法:, #+/! 這里,操作數(shù)地址為Rn加上或減去8位立即數(shù)的值,同時,該操作數(shù)地址裝入Rn中。8位立即數(shù)的高四位為immedH,低四位為immedL。例如:LDRH R1, R0, #0 x02! ; 內(nèi)存地址R0+0 x02處的;半字裝入R1, R0 =

27、 R0+2模式4:存放器預(yù)索引機器碼:如圖3-25所示。圖3-25 模式4下的ARM指令編碼語法:, +/-! 這里,操作數(shù)地址為Rn加上或減去Rm的值,同時,該操作數(shù)地址裝入Rn中。例如:LDRH R1, R0, R2! ; 內(nèi)存地址R0+R2處的半字 ; 裝入R1, R0 = R0 + R2模式5:立即數(shù)后索引機器碼:如圖3-26所示。圖3-26 模式5下的ARM指令編碼語法:, #+/- 這里,操作數(shù)地址為Rn的值,當指令執(zhí)行條件滿足時,Rn加上或減去立即數(shù)offset_8的值賦給Rn。立即數(shù)offset_8的高四位為immedH,低四位為immedL。R15不能用作Rn。例如:LDRH

28、 R1, R0, #0 x02 ; 內(nèi)存地址R0處的值裝入 ; R1, R0 = R0 + 2模式6:存放器后索引機器碼:如圖3-27所示。圖3-27 模式6下的ARM指令編碼語法:, +/- 這里,操作數(shù)地址為Rn的值,當指令條件滿足時,Rn加上或減去Rm的值賦給Rn。圖3-27中的SBZ(Should Be Zero)為0。R15不能用作Rm或Rn。例如:LDRH R1, R0, R2 ; 內(nèi)存地址R0處的值裝入R1,; R0 = R0 + R23.3.4 存放器批量存儲/裝入尋址存放器批量存儲/裝入尋址方式的指令語法為:LDM|STM !, 其中,有如下五種模式。模式1:事后增加(IA

29、= Increment After)機器碼:如圖3-28所示。圖3-28 模式1下的ARM指令編碼語法:IA圖3-28至圖3-31中,對于LDM指令,當PC位于register_list中時,S為1表示SPSR裝入CPSR中;對于不使用PC的LDM指令和全部STM類指令,S為1表示使用用戶模式下的存放器組,而非當前模式下的存放器。用戶模式和系統(tǒng)模式下不能設(shè)置S位為1。W位表示操作完成后基址存放器的值是否變化,如果W為1,那么基址存放器的值在操作完成后將增加或減少4乘以存放器列表中包含的存放器個數(shù)的值,是增加還是減少,視第23位的值而定,第23位(即U位)為1 時增加,為0時減少。 L位為1時表

30、示裝入,為0時表示存儲。16位長的存放器列表register_list,每一位對應(yīng)于一個存放器,即第0位對應(yīng)于R0,第1位對應(yīng)于R1,依次類推,第15位對應(yīng)于R15(即PC),列表中至少應(yīng)包含一個存放器,多個存放器間用逗號分隔,連續(xù)的存放器可以用“-連接,如“R1-R4表示“R1, R2, R3, R4,列表用“包括??梢姡琒是指指令語法中的“是否存在;W是指指令語法中的“!是否存在;L是指指令語法中使用LDM還是STM。這里,定義操作數(shù)首地址start_address為基址存放器Rn的值;操作數(shù)尾地址end_address為Rn與4乘以存放器列表中存放器個數(shù)的和,再減去4的差,即start_

31、address = Rn, end_address = Rn + 4 (register_list各位中置1的個數(shù)) 4如果是LDM操作,操作是自左向右的(與LDR等相反),即首地址至尾地址各個字地址內(nèi)的值對應(yīng)裝入存放器列表中;如果是STM操作,操作是自右向左的(與STR等相反),即存放器列表中各個存放器的值存入自首地址至尾地址相對應(yīng)的地址處。如果指令中使用“!,那么尾地址end_address加上4的值賦給Rn,即Rn=Rn+ 4(register_list各位中置1的個數(shù))例如: STMIA R0, R1R4 ; 0賦給R1, R0+4賦給R2, R0+8 ; 賦給R3,R0+12賦給R4

32、STMIA R0!, R1R4 ; R0賦給R1, R0+4賦給R2, ; R0+8賦給R3,R0+12賦給R4, ; R0=R0+16說明:細心的讀者調(diào)試指令時可能會發(fā)現(xiàn),上述兩個指令中,不帶有“IA結(jié)果是一樣的,例如,第一條指令等同于STM R0, R1-R4,道理是顯然的。模式2:預(yù)先增加(IB = Increment Before)機器碼:如圖3-29所示。圖3-29 模式2下的ARM指令編碼語法:IB這里,首地址為start_address = Rn+4,尾地址為end_address = Rn+4(register_list各位中置1的個數(shù)),當指令中出現(xiàn)“!時,Rn=Rn+4(r

33、egister_list各位中置1的個數(shù))。例如:STMIB R0, R1R3; R0+4賦給R1, R0+8賦給R2, ; R0+12賦給R3STMIB R0!, R1R3; R0+4賦給R1, R0+8賦給R2, ; R0+12賦給R3, R0 = R0+12模式3:事后減少(DA = Decrement After)機器碼:如圖3-30所示。圖3-30 模式3下的ARM指令編碼語法:DA這里,首地址為start_address = Rn -4 (register_list各位中置1的個數(shù))+ 4,尾地址為end_address = Rn,當指令中出現(xiàn)“!時,Rn = Rn - 4 (re

34、gister_list各位中置1的個數(shù))。例如:STMDA R0, R1R3 ; R08賦給R1, R0-4賦給R2, ; R0賦給R3STMDA R0!, R1R3; R08賦給R1, R04賦給R2, ; R0 賦給R3, R0 = R0 12模式4:預(yù)先減少(DB = Decrement Before)機器碼:如圖3-31所示。圖3-31 模式4下的ARM指令編碼語法:DB 這里,首地址為start_address = Rn4 (register_list各位中置1的個數(shù)),尾地址為end_address=Rn4,當指令中出現(xiàn)“!時,Rn=Rn4 (register_list各位中置1的

35、個數(shù))。例如:STMDB R0, R1-R3 ; R012賦給R1, R08賦給R2,; R04賦給R3STMDB R0!, R1R3; R012賦給R1, R08賦給R2, ; R04賦給R3, R0 = R012模式5:堆棧操作 堆棧可用于保存存放器的值,通過壓棧(或稱入棧)將存放器的值壓入棧中保存,通過出棧操作恢復(fù)存放器中的數(shù)值。盡管堆棧本質(zhì)上是一段連續(xù)的內(nèi)存空間,但是,有其專用的堆棧操作,根據(jù)堆棧指令位置及其移動方向,分為四種方式:即FD、ED、FA和EA。其中,F(xiàn)表示Full stacks,即堆棧指針位置指向棧頂數(shù)據(jù)(如果有壓棧操作,堆棧指針必須首先移動到棧頂前面的一個字空間,因此壓

36、棧(STM)時,F(xiàn)相當于Before;如果有出棧操作,由于堆棧指針指向棧頂數(shù)據(jù),只需直接取數(shù)據(jù)即可,因此,出棧(LDM)時,F(xiàn)相當于After)。 E表示Empty stacks,即堆棧指針位置指向棧頂數(shù)據(jù)前面的一個地址空間,如果有一個壓棧操作,該地址空間將保存數(shù)據(jù)而成為棧頂數(shù)據(jù)(同樣道理,壓棧(STM)時,E相當于After;出棧(LDM)時,E相當于Before)。F和E表示堆棧指針位置,而D和A表示堆棧指針移動方向。D為Descending stacks,即堆棧指針移動方向為內(nèi)存地址減少的方向。A為Ascending stacks,表示堆棧指針移動方向為內(nèi)存地址增大的方向。因此,有類似的

37、8種操作,即LDMFA、LDMFD、LDMEA、LDMED和STMFA、STMFD、STMEA、STMED,對應(yīng)于機器碼中L(第20位)、P(第24位)、U(第23位)的值依次為:0b100、0b101、0b110、0b111和0b011、0b0b0、0b001、0b000。出于協(xié)處理對堆棧訪問的支持,建議使用FD或EA方式。例如程序1 AREA INIT, CODE, READONLY2 ENTRY3 START4 MOVR2, #0 x12 ; (1)5 MOV R3, #0 x55 ; (2)6 MOV R4, #0 xAA ; (3)7 8 MOV R0, #0 x30000000 ;

38、 (4)9 MOV R1, #0 x800 ; (5)10 ADD R0, R0, R1 ; (6)11 MOV SP, R0 ; (7)12 13 STMFD SP!, R2,R3,R4 ; (8)14 MOV R4, #0 x88 ; (9)15 16 LDMFD SP!, R2 - R4 ; (10)17 STOP18 BLSTOP19 END程序中各標號的解釋如下:(1) R2 = 0 x12; (2) R3 = 0 x55; (3) R4 = 0 xAA;(4) R0 = 0 x3000 0000;(5) R1 = 0 x800;(6) R0 = R0 + R1 = 0 x3000

39、0800;(7) SP = 0 x3000 0800;(8) 0 x3000 07F4 = 0 x12, 0 x3000 07F8 = 0 x55, 0 x3000 07FC = 0 xAA, SP = 0 x3000 07F4;(9) R4 = 0 x88;(10) R2 = 0 x12, R3 = 0 x55, R4 = 0 xAA, SP = 0 x3000 0800。請注意SP的值的變化情況。3.3.5 協(xié)處理器存儲/裝入尋址這里討論協(xié)處理器存儲/裝入尋址方式的編碼和語法,第節(jié)中將針對ARM920T微處理器具體討論協(xié)處理器指令(約5個)的應(yīng)用及例如。協(xié)處理器存儲/裝入尋址方式的指令語法

40、為:L , , 其中,有下述四種模式。模式1:立即數(shù)偏置機器碼:如圖3-32所示。圖3-32 模式1下的ARM指令編碼語法:, #+/*4圖3-32至圖3-35中,U = 1表示加;U = 0表示減。N位是協(xié)處理器無關(guān)的標識位,用于區(qū)分不同長度的傳遞值。W位(第21位)表示指令中有無“!,W = 1表示內(nèi)存地址寫回存放器,W = 0那么不寫回。L = 1表示裝入,L = 0表示存儲。如果指令執(zhí)行條件滿足,那么首地址start_address = Rn +/-offset_8 4(U = 1時取加號,U = 0時取減號),尾地址end_address = start_address + 4 (協(xié)

41、處理器的數(shù)目cp_num)。R15用作Rn時,Rn的值為當前指令地址加上8。模式2:立即數(shù)預(yù)索引機器碼:如圖3-33所示。圖3-33 模式2下的ARM指令編碼 語法:, #+/*4!如果指令執(zhí)行條件滿足,那么首地址start_address = Rn +/ offset_84(U = 1時取加號,U = 0時取減號),尾地址end_address = start_address+4(協(xié)處理器的數(shù)目cp_num)。首地址賦給Rn。R15不能用作Rn。模式3:立即數(shù)后索引機器碼:如圖3-34所示。圖3-34 模式3下的ARM指令編碼語法:, #+/*4如果指令執(zhí)行條件滿足,那么首地址start_a

42、ddress = Rn,尾地址end_address = start_address +4(協(xié)處理器的數(shù)目cp_num)。Rn = Rn +/-offset_84(U=1時取加號U=0時取減號)。R15不能用作Rn。模式4:無索引機器碼:如下圖。圖3-35 模式4下的ARM指令編碼語法:,如果指令執(zhí)行條件滿足,那么首地址start_address = Rn,尾地址end_address = start_address+4(協(xié)處理器的數(shù)目cp_num)。指定協(xié)處理器額外的指令參數(shù),取值為0255的整數(shù),用“包括。R15用作Rn時,Rn的值為當前指令地址加上8。3.4 ARM指令匯總 ARMv6指

43、令集版本具有114條ARM指令,但是ARMv4T僅支持其中的49條指令,如表3-1所示。出于節(jié)省篇幅和增強針對性,這里僅介紹表3-1所示的ARM指令(當然,記憶指令是需要時間和方法的),將這些指令分為九類,即賦值指令2條、算術(shù)運算指令12條、跳轉(zhuǎn)指令3條、比較指令2條、邏輯運算指令6條、CPSR訪問指令2條、內(nèi)存訪問指令16條、軟件中斷指令1條以及協(xié)處理器指令5條,共計49條。此外,本節(jié)還將介紹4條ARM偽指令。3.4.1 賦值指令賦值指令有2條,即MOV和MVN,如下所述。MOV指令(賦值)語法:MOVS , 解釋:cond表示指令執(zhí)行條件,如表3-2所示,只有滿足條件時指令才能被執(zhí)行。如果

44、cond被忽略,那么表示使用了條件碼AL,即該指令總被執(zhí)行。S出現(xiàn)在指令中時,將設(shè)置指令的S位(第20位)為1,表示指令的執(zhí)行將影響和刷新CPSR存放器的某些位。Rd存放器為目的操作數(shù)。Oprand2為第二個操作數(shù),可以為立即數(shù)(是8位整數(shù)左邊擴展24個0后的32位數(shù)循環(huán)右移32以內(nèi)的偶數(shù)位得到的)、存放器、存放器移位立即數(shù)和存放器移位存放器。移位方式有邏輯左移(LSL)、邏輯右移(LSR)、算術(shù)右移(ASR)、循環(huán)右移(ROR)、帶擴展位的循環(huán)右移(RRX)。 用“括起來的為可選項,用“括起來的為必選項。操作:如果執(zhí)行條件滿足,那么 Rd = Oprand2 如果 S = 1 且 Rd =

45、R15,那么 如果當前工作模式有SPSR,那么 CPSR=SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 最后移出的位(注意:這種說法稍欠準確) V不受影響用途:將某個特定值的立即數(shù)裝入存放器;將一個存放器的值賦給另一個存放器;移位操作;左移n位實現(xiàn)操作數(shù)乘以2n的運算;指令“MOV PC, LR可以實現(xiàn)跳轉(zhuǎn);當PC為目的操作數(shù),且S出現(xiàn)在指令中時,例如,“MOVS PC, LR執(zhí)行跳轉(zhuǎn)的同時,還將SPSR的值賦給CPSR。例如:MOV R1, #0 x01 ; R1 =

46、0 x1MOV R2, R1 ; R2 = R1 = 0 x1MOV R3, R2, LSL #0 x2 ; R3 = R2R1 = 2MVN指令(取反賦值)語法:MVNS , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Oprand2的取反 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 最后移出的位 V不受影響用途:用作某些位的屏蔽;計算一個數(shù)值的二進制補碼。例如:MVN

47、R4, R3, LSR R1 ; R4 = (R3R1)3.4.2 算術(shù)運算指令算術(shù)運算指令有12條,即ADD、ADC、MLA、MUL、RSB、RSC、SBC、SMLAL、SMULL、SUB、UMLAL以及UMULL,如下所述。ADD指令(加法)語法:ADDS , , 解釋:Rd存放器為目的操作數(shù)。Rn存放器為第一個源操作數(shù)。Oprand2為第二個源操作數(shù),可以為立即數(shù)(是8位整數(shù)左邊擴展24個0后的32位數(shù)循環(huán)右移32以內(nèi)的偶數(shù)位得到的)、存放器、存放器移位立即數(shù)和存放器移位存放器。移位方式有邏輯左移(LSL)、邏輯右移(LSR)、算術(shù)右移(ASR)、循環(huán)右移(ROR)、帶擴展位的循環(huán)右移(

48、RRX)。操作:如果執(zhí)行條件滿足,那么 Rd = Rn + Oprand2 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的進位 V = 結(jié)果的溢出位用途:實現(xiàn)兩個數(shù)值的加法運算;使用形如“ADD Rx, Rx, #1實現(xiàn)累加運算;使用形如“ADD Rd, Rx, Rx, LSL #n實現(xiàn)Rx的(2n + 1)倍運算;使用形如“ADD Rd, PC, #offset獲得一個基

49、于PC的相對地址(此處,PC的值為當前指令地址加上8)。例如:ADD R2, R1, #2 ; R2 = R1 + 2ADD R3, R1, R2 ; R3 = R1 + R2ADD R4, R4, R3, LSL #1 ; R4 = R4+ R31ADC指令(帶進位加法)語法:ADCS , , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Rn + Oprand2 + CPSR的C標志位 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N =

50、Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的進位 V = 結(jié)果的溢出位用途:在實現(xiàn)64位的加法操作時,ADC用于兩個加數(shù)的高32位數(shù)相加,例如,R1和R0以及R3和R2存入兩個64位數(shù),其中,R0和R2存放低32位,R1和R3存放高32位,這兩個64位數(shù)相加的結(jié)果存放在R5和R4中,其中,R4存放結(jié)果的低32位,R5存放結(jié)果的高32位,那么指令為ADDS R4, R0, R2 ; 注意,ADDS要帶有SADC R5, R1, R3 ; 如果使用ADCS,那么結(jié)果影響CPSR此外,可以用例如“ADCS R0, R0, R0實現(xiàn)帶擴展位的逐位循環(huán)移位操作。例如:略SUB指令(

51、減法)語法:SUBS , , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Rn-Oprand2 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的借位取反 V = 結(jié)果的溢出位(這里是指被減數(shù)小于減數(shù)的情況)用途:實現(xiàn)數(shù)值的減1操作,形如“SUB Ri, Ri, #1;SUBS由于影響CPSR,在循環(huán)控制中經(jīng)常被用到;SUBS也常用于中斷(或異常)返回中,形如“SUBS PC

52、, R15, #4。例如:略SBC指令(帶借位減法)語法:SBCS , , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Rn-Oprand2 NOT(C標志位) 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的借位取反 V = 結(jié)果的溢出位用途:用于實現(xiàn)兩個64位數(shù)的減法,如果存放器對R1、R0和R3、R2存放64位數(shù),其中R0和R2存放低32位,R1和R3存放高32位,

53、運算結(jié)果存入R5、R4中(R4存放低32位,R5存放高32位),那么指令為:SUBS R4, R0, R2SBC R5, R1, R3例如:略RSB指令(逆向減法)語法:RSBS , , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Oprand2-Rn 如果 S = 1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的借位取反 V = 結(jié)果的溢出位用途:產(chǎn)生負數(shù)(二進制補碼表示),指令形如

54、“RSB Rd, Rx, #0;產(chǎn)生一個數(shù)的2n 1倍,指令形式如“RSB Rd, Rx, Rx, LSL #n。例如:略RSC指令(帶借位逆向減法)語法:RSCS , , 解釋:略操作:如果執(zhí)行條件滿足,那么 Rd = Oprand2 Rn NOT(C標志位) 如果 S=1 且 Rd = R15,那么 如果當前工作模式有SPSR,那么 CPSR = SPSR 否那么,執(zhí)行結(jié)果不可預(yù)見 如果S =1 但 Rd R15,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C = 結(jié)果的借位取反 V = 結(jié)果的溢出位用途:用于實現(xiàn)64位的減法運算,例如,0

55、減去一個64位的數(shù),存放在R1、R0中(R0存放32位,R1存放高32位),結(jié)果存放在R3、R2中(R2存放低32位,R3存放高32位),指令如下:RSBS R2, R0, #0RSB R3, R1, #0例如:略MUL指令(乘法)語法:MULS , , 解釋:Rd存放器為目的操作數(shù),存放乘積。Rm存放器為第一個源操作數(shù),存放被乘數(shù)。Rs存放器為第二個源操作數(shù),存放乘數(shù)。操作:如果執(zhí)行條件滿足,那么 Rd = (Rm * Rs)31:0 如果 S = 1,那么 CPSR的標志位賦值如下: N = Rd31 Z = 1(Rd為0)或0(Rd不為0) C無意義或不受影響 V不受影響用途:實現(xiàn)兩個數(shù)

56、的乘法操作,由于乘積結(jié)果取低32位,因此,對于無符號數(shù)和有符號數(shù)來說,結(jié)果是一樣的。這個指令多用于乘積結(jié)果不超過32位的乘法操作,實際中要慎用!例如:MUL R3, R2, R1 ; R3 = R2 * R1結(jié)果的低32位MLA指令(乘加)語法:MLAS , , , 解釋:Rn存放器為第三個源操作數(shù),存儲的值被加到Rm*Rs的積上。操作:如果執(zhí)行條件滿足,那么 Rd = (Rm*Rs + Rn)31:0 如果 S=1,那么 CPSR的標志位賦值如下: N=Rd31 Z=1(Rd為0)或0(Rd不為0) C無意義或不受影響 V不受影響用途:實現(xiàn)32位數(shù)的乘加運算,Rd不能與Rm相同(ARMv6除

57、外),由于乘法運算和加法運算結(jié)果均取低32位,所以,該指令主要用于結(jié)果不超過32位的乘加操作,實際中要慎用!例如:略SMULL指令(32位有符號乘法)語法:SMULLS , , , 解釋:RdLo存放器為第一個目的操作數(shù),存儲乘積的低32位。RdHi存放器為第二個目的操作數(shù),存儲乘積的高32位。操作:如果執(zhí)行條件滿足,那么 RdHi = (Rm * Rs)63:32 RdLo = (Rm * Rs)31:0 如果 S = 1,那么 CPSR的標志位賦值如下: N = RdHi31 Z = 1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0) C不受影響 V不受影響用途:該指令是真正意

58、義下的乘法指令。不能使用R15,RdHi和RdLo不能相同。例如:略SMLAL指令(32位有符號乘加)語法:SMLALS , , , 解釋:略操作:如果執(zhí)行條件滿足,那么 RdLo = (Rm * Rs)31:0 + RdLo(原先的值)RdHi = (Rm * Rs)63:32 + RdHi + “(Rm * Rs)31:0 + RdLo(原先的值)的進位 如果 S = 1,那么 CPSR的標志位賦值如下: N = RdHi31 Z = 1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0) C不受影響 V不受影響用途:該指令是真正意義上的乘加運算。不用使用R15,RdHi和RdLo

59、不能相同。例如:略UMULL指令(無符號32位乘法指令)語法:UMULLS , , , 解釋:略操作:如果執(zhí)行條件滿足,那么 RdHi = (Rm * Rs)63:32 ; 無符號數(shù) RdLo = (Rm * Rs)31:0 如果 S = 1,那么 CPSR的標志位賦值如下: N = RdHi31 Z = 1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0) C不受影響 V不受影響用途:真正意義上的32位無符號乘法運算。不能使用R15,RdHi和RdLo不能相同。例如:略UMLAL指令(無符號乘加)語法:UMLALS , , , 解釋:略操作:如果執(zhí)行條件滿足,那么 RdLo = (

60、Rm * Rs)31:0 + RdLo(原先的值)RdHi = (Rm * Rs)63:32 + RdHi + “(Rm * Rs)31:0 + RdLo(原先的值)的進位 如果 S = 1,那么 CPSR的標志位賦值如下: N = RdHi31 Z = 1(RdHi和RdLo均為0)或0(RdHi或RdLo不為0) C不受影響 V不受影響用途:真正意義上32位無符號數(shù)的乘加運算。不能使用R15,RdHi和RdLo不能相同。例如:略3.4.3 跳轉(zhuǎn)指令跳轉(zhuǎn)指令有3條,即B、BL和BX,如下所述。B和BL指令(跳轉(zhuǎn)和帶連接跳轉(zhuǎn))語法:BL 解釋:L出現(xiàn)在指令中時,指令機器碼的L位(第24位)被設(shè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論