版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第3章ARM7TDMI(-S)指令系統(tǒng)2023/2/51華中科技大學(xué)計算機學(xué)院第3章目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集2023/2/52華中科技大學(xué)計算機學(xué)院3.1ARM處理器尋址方式尋址方式分類尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。ARM處理器具有8種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.相對尋址。2023/2/53華中科技大學(xué)計算機學(xué)院操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R0
0xAA0x55R2R13.1ARM處理器尋址方式尋址方式分類——寄存器尋址MOVR1,R20xAA2023/2/54華中科技大學(xué)計算機學(xué)院立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOV R0,#0xFF000;將立即數(shù)0xFF000裝入R0寄存器
0x55R0MOVR0,#0xFF00程序存儲3.1ARM處理器尋址方式尋址方式分類——立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)2023/2/55華中科技大學(xué)計算機學(xué)院寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3 ;R2的值左移3位,結(jié)果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相 ;“與”操作,結(jié)果放入R10x55R0R20x013.1ARM處理器尋址方式尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位2023/2/56華中科技大學(xué)計算機學(xué)院寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲單元的數(shù)據(jù)讀出
;保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2指定的存儲
;單元的內(nèi)容交換0x55R1R20x400000000xAA0x400000003.1ARM處理器尋址方式尋址方式分類——寄存器間接尋址LDRR1,[R2]0xAA2023/2/57華中科技大學(xué)計算機學(xué)院基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下:LDR R2,[R3,#0x0C] ;讀取R3+0x0C地址上的存儲單元
;的內(nèi)容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存儲單元3.1ARM處理器尋址方式尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)2023/2/58華中科技大學(xué)計算機學(xué)院多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到
;R2~R7、R12中(R1自動加1)STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保
;存到R0指向的存儲;單元中
;(R0自動加1)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器3.1ARM處理器尋址方式尋址方式分類——多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x400000102023/2/59華中科技大學(xué)計算機學(xué)院堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧词嵌褩5臈m?。存儲器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧3.1ARM處理器尋址方式尋址方式分類——堆棧尋址2023/2/510華中科技大學(xué)計算機學(xué)院3.1ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲區(qū)棧頂棧底棧區(qū)SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧2023/2/511華中科技大學(xué)計算機學(xué)院棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。3.1ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧2023/2/512華中科技大學(xué)計算機學(xué)院所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。3.1ARM處理器尋址方式尋址方式分類——堆棧尋址2023/2/513華中科技大學(xué)計算機學(xué)院相對尋址是基址尋址的一種變通。由程序計數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下:
BL SUBR1 ;調(diào)用到SUBR1子程序
BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號處
...LOOP MOV R6,#1 ...SUBR1 ...3.1ARM處理器尋址方式尋址方式分類——相對尋址2023/2/514華中科技大學(xué)計算機學(xué)院第3章目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集2023/2/515華中科技大學(xué)計算機學(xué)院簡單的ARM程序;文件名:TEST1.S
;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試
AREA Example1,CODE,READONLY ;聲明代碼段Example1
ENTRY ;標(biāo)識程序入口
CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù)
MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB
B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件結(jié)束
使用“;”進行注釋標(biāo)號頂格寫實際代碼段聲明文件結(jié)束2023/2/516華中科技大學(xué)計算機學(xué)院簡單的ARM程序;文件名:TEST1.S
;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試
AREA Example1,CODE,READONLY ;聲明代碼段Example1
ENTRY ;標(biāo)識程序入口
CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù)
MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB
B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件結(jié)束
2023/2/517華中科技大學(xué)計算機學(xué)院ARM指令小節(jié)目錄1.指令格式2.條件碼3.存儲器訪問指令3.數(shù)據(jù)處理指令5.乘法指令6.ARM分支指令7.協(xié)處理器指令8.雜項指令9.偽指令2023/2/518華中科技大學(xué)計算機學(xué)院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>號內(nèi)的項是必須的,{}號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù);2023/2/519華中科技大學(xué)計算機學(xué)院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——第2個操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r——常數(shù)表達式;Rm——寄存器方式;Rm,shift——寄存器移位方式;2023/2/520華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應(yīng)8位位圖,即一個8位的常數(shù)通過循環(huán)右移偶數(shù)位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)2023/2/521華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應(yīng)8位位圖,即一個8位的常數(shù)通過循環(huán)右移偶數(shù)位得到。例如:MOV R0,#1AND R1,R2,#0x0F2023/2/522華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——第2個操作數(shù)Rm——寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R2;R1<=R1-R22023/2/523華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR#n算術(shù)右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。2023/2/524華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1SUB R1,R1,R2,LSRR3 ;R1=R1-(R2/2R3)2023/2/525華中科技大學(xué)計算機學(xué)院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
使用條件碼“cond”可以實現(xiàn)高效的邏輯操作,提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無條件(AL)執(zhí)行。2023/2/526華中科技大學(xué)計算機學(xué)院操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于
1011LTN!=V有符號數(shù)小于
1100GTZ=0,N=V有符號數(shù)大于
1101LEZ=1,N!=V有符號數(shù)小于或等于
1110AL任何無條件執(zhí)行
(指令默認(rèn)條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表2023/2/527華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——條件碼C代碼:if(a>b) a++;else b++;對應(yīng)的匯編代碼:CMP R0,R1 ;R0與R1比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤R1,則R1=R1+1示例:2023/2/528華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——存儲器訪問指令
ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。ARM處理器是馮?諾依曼存儲結(jié)構(gòu),程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數(shù)據(jù)的訪問均要通過加載/存儲指令進行。存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。2023/2/529華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置LDRRd,addressing加載字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用戶模式加載字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用戶模式加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加載無符號半字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加載有符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加載有符號半字?jǐn)?shù)據(jù)
Rd←[addressing],addressing索引
LDR{cond}SHARM存儲器訪問指令——單寄存器加載2023/2/530華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置STRRd,addressing存儲字?jǐn)?shù)據(jù)[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用戶模式存儲字?jǐn)?shù)據(jù)[addressing]←Rd,
addressing索引STR{cond}TSTRBTRd,addressing以用戶模式存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存儲半字?jǐn)?shù)據(jù)[addressing]←Rd,addressing索引STR{cond}HARM存儲器訪問指令——單寄存器存儲
LDR/STR指令用于對內(nèi)存變量的訪問、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實現(xiàn)了程序散轉(zhuǎn)。所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。2023/2/531華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置LDM{mode}Rn{!},reglist多寄存器加載reglist←[Rn...],Rn回寫等LDM{cond}{mode}STM{mode}Rn{!},reglist多寄存器存儲[Rn...]←reglist,Rn回寫等STM{cond}{mode}ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。2023/2/532華中科技大學(xué)計算機學(xué)院ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}cond:指令執(zhí)行的條件;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結(jié)束后,將最后的地址寫回Rn中;reglist
:表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如{R1,R2,R6-R9},寄存器由小到大排列;^:加入該后綴后,進行數(shù)據(jù)傳送且寄存器列表不包含PC時,加載/存儲的寄存器是用戶模式下的,而不是當(dāng)前模式的寄存器。若在LDM指令且寄存器列表中包含有PC時使用,那么除了正常的多寄存器傳送外,還將SPSR也拷貝到CPSR中,這可用于異常處理返回。注意:該后綴不允許在用戶模式或系統(tǒng)模式下使用。2023/2/533華中科技大學(xué)計算機學(xué)院ARM存儲器訪問指令——多寄存器存取!多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作進行數(shù)據(jù)復(fù)制時,先設(shè)置好源數(shù)據(jù)指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲。進行堆棧操作操作時,要先設(shè)置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現(xiàn)堆棧操作。2023/2/534華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置SWPRd,Rm,Rn寄存器和存儲器字?jǐn)?shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存儲器字節(jié)數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}BARM存儲器訪問指令——寄存器和存儲器交換指令
SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。使用SWP可實現(xiàn)信號量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]
其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于存儲到存儲器中,若Rm與Rn相同,則為寄存器與存儲器內(nèi)容進行交換;Rn為要進行數(shù)據(jù)交換的存儲器地址,Rn不能與Rd和Rm相同。2023/2/535華中科技大學(xué)計算機學(xué)院ARM存儲器訪問指令——寄存器和存儲器交換指令SWP和SWPB——寄存器和存儲器交換指令編碼指令執(zhí)行的條件碼B用于區(qū)別無符號字節(jié)(B為1)或字(B為0)Rm源寄存器Rd目標(biāo)寄存器Rn為基址寄存器SWP指令應(yīng)用示例:SWP R1,R1,[R0] ;將R1的內(nèi)容與R0指向的存儲單元的內(nèi)容進行交換SWPB R1,R2,[R0] ;將R0指向的存儲單元內(nèi)的容讀取一字節(jié)數(shù)據(jù)到R1中
;(高24位清零),并將R2的內(nèi)容寫入到該內(nèi)存單元中
;(最低字節(jié)有效)2023/2/536華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——ARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令;算術(shù)邏輯運算指令;比較指令。數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,而不能對內(nèi)存中的數(shù)據(jù)進行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。
2023/2/537華中科技大學(xué)計算機學(xué)院ARM數(shù)據(jù)處理指令——指令編碼指令執(zhí)行的條件碼I用于區(qū)別立即數(shù)(I為1)和寄存器移位(I為0)opcode數(shù)據(jù)處理指令操作碼第二操作數(shù)Rd目標(biāo)寄存器Rn第一操作數(shù)寄存器S設(shè)置條件碼,與指令中的S位對應(yīng)帶進位加法ADC0101帶進位減法指令SBC0110帶進位逆向減法指令RSC0111位測試指令TST1000相等測試指令TEQ1001比較指令CMP1010負(fù)數(shù)比較指令CMN1011邏輯或操作指令ORR1100數(shù)據(jù)傳送MOV1101位清除指令BIC1110數(shù)據(jù)非傳送MVN1111加法運算指令A(yù)DD0100逆向減法指令RSB0011減法運算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令A(yù)ND0000說明指令助記符操作碼opcode操作碼功能表2023/2/538華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送Rd←(~operand2)MVN{cond}{S}ARM數(shù)據(jù)處理指令——數(shù)據(jù)傳送2023/2/539華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}ARM數(shù)據(jù)處理指令——比較指令2023/2/540華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}ARM數(shù)據(jù)處理指令——比較指令負(fù)數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:CMN{cond} Rn,operand2
應(yīng)用示例:
CMN R0,#1
;R0+1,判斷R0是否為-1的補碼
;如果是,則設(shè)置Z標(biāo)志位2023/2/541華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}ARM數(shù)據(jù)處理指令——比較指令負(fù)數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:CMN{cond} Rn,operand2注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結(jié)果。CMN指令可用于負(fù)數(shù)比較,比如CMNR0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復(fù)位。2023/2/542華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——乘法指令
ARM7TDMI具有三種乘法指令,分別為:32×32位乘法指令;32×32位乘加指令;32×32位結(jié)果為64位的乘/乘加指令。2023/2/543華中科技大學(xué)計算機學(xué)院ARM指令——乘法指令乘法指令編碼指令執(zhí)行的條件碼Opcode乘法指令操作碼S設(shè)置條件碼,與指令中的S位對應(yīng)Rm為被乘數(shù)寄存器Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標(biāo)寄存器(低32位)Rn/RdHi為目標(biāo)寄存器或64位乘法指令的目標(biāo)寄存器(高32位)Rs為乘數(shù)寄存器64位有符號乘加指令SMLAL11164位有符號乘法指令SMULL11064位無符號乘加指令UMLAL10164位無符號乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000說明指令助記符操作碼opcode操作碼功能表2023/2/544華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}ARM指令——乘法指令2023/2/545華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令Rd←Rm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}ARM指令——乘法指令
64位無符號乘法指令——UMULL指令將Rm和Rs中的值作無符號數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:UMULL{cond}{S}RdLo,RdHi,Rm,Rs
應(yīng)用示例:
UMULLR0,R1,R5,R8 ;(R1、R0)=R5×R82023/2/546華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——分支指令在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn)。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。2023/2/547華中科技大學(xué)計算機學(xué)院ARM分支指令——指令編碼分支指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號立即數(shù)(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標(biāo)地址寄存器,該寄存器裝載跳轉(zhuǎn)地址2023/2/548華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令2023/2/549華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:B{cond}Label
應(yīng)用示例:
B WAITA ;跳轉(zhuǎn)到WAITA標(biāo)號處
B 0x1234 ;跳轉(zhuǎn)到絕對地址0x1234處2023/2/550華中科技大學(xué)計算機學(xué)院BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1+8LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行2023/2/551華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}Label應(yīng)用示例:
BL DELAY ;調(diào)用子程序DELAY2023/2/552華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。指令格式如下:BX{cond}Rm跳轉(zhuǎn)地址Rm[0]跳轉(zhuǎn)后CPSR標(biāo)志T位處理器狀態(tài)00ARM11Thumb2023/2/553華中科技大學(xué)計算機學(xué)院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。指令格式如下:BX{cond}Rm應(yīng)用示例:
ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到R0指定的地址,
;并根據(jù)R0的最低位來切換處理器狀態(tài)2023/2/554華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——協(xié)處理器指令(自學(xué))
ARM內(nèi)核支持協(xié)處理器操作,協(xié)處理器的控制要通過協(xié)處理器命令實現(xiàn)。ARM內(nèi)核與協(xié)處理器的關(guān)系A(chǔ)RM內(nèi)核協(xié)處理器A協(xié)處理器B握手信號數(shù)據(jù)地址總線…2023/2/555華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM指令集——雜項指令
ARM指令集中有三條指令作為雜項指令,實際上這三條指令非常重要。它們?nèi)缦滤荆褐浄f明操作條件碼位置SWIimmed_24軟中斷指令產(chǎn)生軟中斷,處理器進入管理模式SWI{cond}MRSRd,psr讀狀態(tài)寄存器指令Rd←psr,psr為CPSR或SPSRMRS{cond}MSRpsr_fields,Rd/#immed_8r寫狀態(tài)寄存器指令psr_fields←Rd/#immed_8r,psr為CPSR或SPSRMSR{cond}2023/2/556華中科技大學(xué)計算機學(xué)院ARM雜項指令——軟中斷指令
SWI指令用于產(chǎn)生軟中斷,從而實現(xiàn)在從戶模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉(zhuǎn)到SWI異常入口。在其它模式下也可使用SWI指令,處理器同樣地切換到管理模式。該指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù),操作系統(tǒng)在SWI異常處理程序中進行相應(yīng)的系統(tǒng)服務(wù)。SWI{cond} immed_24SWI指令格式SWI指令編碼指令執(zhí)行的條件碼指令傳遞的參數(shù)(24位立即數(shù))2023/2/557華中科技大學(xué)計算機學(xué)院ARM雜項指令——軟中斷指令根據(jù)SWI指令傳遞的參數(shù),SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24位立即數(shù)指定了用戶請求的服務(wù)類型,參數(shù)通過通用寄存器傳遞。MOVR0,#34
;設(shè)置子功能號為34SWI12
;調(diào)用12號軟中斷指令中的24位立即數(shù)被忽略,用戶請求的服務(wù)類型由寄存器R0的值決定,參數(shù)通過其它的通用寄存器傳遞。MOVR0,#12
;調(diào)用12號軟中斷MOVR1,#34
;設(shè)置子功能號為34SWI0
2023/2/558華中科技大學(xué)計算機學(xué)院ARM雜項指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場保護
MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測試T標(biāo)志位
LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)
LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(shù)
...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回2023/2/559華中科技大學(xué)計算機學(xué)院ARM雜項指令——狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRS{cond}Rd,psrMRS指令格式指令對應(yīng)編碼指令執(zhí)行的條件碼目標(biāo)寄存器,不能為R15區(qū)別CPSR(為0)和SPSR(為1)寄存器2023/2/560華中科技大學(xué)計算機學(xué)院ARM雜項指令——狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRS{cond}Rd,psrMRS指令格式應(yīng)用示例:
MRSR1,CPSR ;將CPSR狀態(tài)寄存器讀取,保存到R1中
MRSR2,SPSR ;將SPSR狀態(tài)寄存器讀取,保存到R2中2023/2/561華中科技大學(xué)計算機學(xué)院ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。MSR{cond}psr_fields,#immed_8rMSR指令格式1MSR{cond}psr_fields,RmMSR指令格式2指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c控制域屏蔽字節(jié)(psr[7..0])x擴展域屏蔽字節(jié)(psr[15..8])s狀態(tài)域屏蔽字節(jié)(psr[23..16])f標(biāo)志域屏蔽字節(jié)(psr[31..24])保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)的源寄存器要傳送到狀態(tài)寄存器指定域的立即數(shù)2023/2/562華中科技大學(xué)計算機學(xué)院保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)的源寄存器ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c控制域屏蔽字節(jié)(psr[7..0])x擴展域屏蔽字節(jié)(psr[15..8])s狀態(tài)域屏蔽字節(jié)(psr[23..16])f標(biāo)志域屏蔽字節(jié)(psr[31..24])要傳送到狀態(tài)寄存器指定域的立即數(shù)MSR指令1編碼MSR指令2編碼Rotate:立即數(shù)對齊8_bit_immediate:8位立即數(shù)2023/2/563華中科技大學(xué)計算機學(xué)院(1)(2)(3)(4)ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。應(yīng)用示例1:;子程序:使能IRQ中斷ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR應(yīng)用示例2:;子程序:禁能IRQ中斷DISABLE_IRQMRSR0CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR
1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對應(yīng)于CPSR中的I控制位;3.將修改后的值寫回CPSR寄存器的對應(yīng)控制域;3.返回上一層函數(shù);2023/2/564華中科技大學(xué)計算機學(xué)院3.2指令集介紹ARM偽指令
ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別為ADR偽指令、ADRL偽指令、LDR偽指令、NOP偽指令。2023/2/565華中科技大學(xué)計算機學(xué)院ARM偽指令——小范圍的地址讀取
ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADR{cond}register,exprADR偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器地址表達式地址表達式expr的取指范圍:當(dāng)?shù)刂分挡皇亲謱R時,其取指范圍為-255~255;當(dāng)?shù)刂分凳亲謱R時,其取指范圍為-1020~1020;當(dāng)?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大。2023/2/566華中科技大學(xué)計算機學(xué)院ARM偽指令——小范圍的地址讀取
ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人財政管理課程設(shè)計
- 大氣污染課程設(shè)計鍋爐
- 投融資管理課程設(shè)計
- 合同之樣板房銷售合同
- 人力資源管理系統(tǒng)升級服務(wù)合同
- 2024年危險化學(xué)品進出口檢驗檢疫代理合同3篇
- 2024年版區(qū)域獨家產(chǎn)品分銷合同2篇
- 2024至2030年中國鋁石行業(yè)投資前景及策略咨詢研究報告
- 2024年中國工藝帽子市場調(diào)查研究報告
- 2024人事委托代理合同-高端人才獵頭服務(wù)項目3篇
- 提高髖關(guān)節(jié)置換患者VTE防控措施落實PDCA
- 廣西2023年廣西北部灣銀行校園招聘考試參考題庫含答案詳解
- 大學(xué)生心理健康教育讀本PPT(第2版)高職完整全套教學(xué)課件
- 加油站安全檢查表分析(SCL)及評價記錄
- 豐田車系卡羅拉(雙擎)轎車用戶使用手冊【含書簽】
- 幼兒園突發(fā)安全事件事故處置措施
- 現(xiàn)代藥物制劑與新藥研發(fā)智慧樹知到答案章節(jié)測試2023年蘇州大學(xué)
- 肺結(jié)核的學(xué)習(xí)課件
- 心肺復(fù)蘇術(shù)最新版
- 2023-2024學(xué)年貴州省貴陽市小學(xué)數(shù)學(xué)六年級上冊期末自測提分卷
- GB/T 9115.2-2000凹凸面對焊鋼制管法蘭
評論
0/150
提交評論