版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章ARM7TDMI(-S)指令系統(tǒng)2023/2/51華中科技大學計算機學院第3章目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集2023/2/52華中科技大學計算機學院3.1ARM處理器尋址方式尋址方式分類尋址方式是根據指令中給出的地址碼字段來實現尋找真實操作數地址的方式。ARM處理器具有8種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.相對尋址。2023/2/53華中科技大學計算機學院操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結果保存到R0
0xAA0x55R2R13.1ARM處理器尋址方式尋址方式分類——寄存器尋址MOVR1,R20xAA2023/2/54華中科技大學計算機學院立即尋址指令中的操作碼字段后面的地址碼部分即是操作數本身,也就是說,數據就包含在指令當中,取出指令也就取出了可以立即使用的操作數(這樣的數稱為立即數)。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結果放入R0,并且影響標志位MOV R0,#0xFF000;將立即數0xFF000裝入R0寄存器
0x55R0MOVR0,#0xFF00程序存儲3.1ARM處理器尋址方式尋址方式分類——立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數據2023/2/55華中科技大學計算機學院寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3 ;R2的值左移3位,結果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相 ;“與”操作,結果放入R10x55R0R20x013.1ARM處理器尋址方式尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位2023/2/56華中科技大學計算機學院寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲單元的數據讀出
;保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2指定的存儲
;單元的內容交換0x55R1R20x400000000xAA0x400000003.1ARM處理器尋址方式尋址方式分類——寄存器間接尋址LDRR1,[R2]0xAA2023/2/57華中科技大學計算機學院基址尋址就是將基址寄存器的內容與指令中給出的偏移量相加,形成操作數的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下:LDR R2,[R3,#0x0C] ;讀取R3+0x0C地址上的存儲單元
;的內容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存儲單元3.1ARM處理器尋址方式尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數據2023/2/58華中科技大學計算機學院多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數據讀出到
;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華中科技大學計算機學院堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧3.1ARM處理器尋址方式尋址方式分類——堆棧尋址2023/2/510華中科技大學計算機學院3.1ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲區(qū)棧頂棧底棧區(qū)SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧2023/2/511華中科技大學計算機學院棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數據項,稱為滿堆棧;堆棧指針指向下一個待壓入數據的空位置,稱為空堆棧。3.1ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧2023/2/512華中科技大學計算機學院所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內含有效數據項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內含有效數據項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。3.1ARM處理器尋址方式尋址方式分類——堆棧尋址2023/2/513華中科技大學計算機學院相對尋址是基址尋址的一種變通。由程序計數器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數的有效地址。相對尋址指令舉例如下:
BL SUBR1 ;調用到SUBR1子程序
BEQ LOOP ;條件跳轉到LOOP標號處
...LOOP MOV R6,#1 ...SUBR1 ...3.1ARM處理器尋址方式尋址方式分類——相對尋址2023/2/514華中科技大學計算機學院第3章目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集2023/2/515華中科技大學計算機學院簡單的ARM程序;文件名:TEST1.S
;功能:實現兩個寄存器相加;說明:使用ARMulate軟件仿真調試
AREA Example1,CODE,READONLY ;聲明代碼段Example1
ENTRY ;標識程序入口
CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設置參數
MOV R1,#10LOOP BL ADD_SUB ;調用子程序ADD_SUB
B LOOP ;跳轉到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件結束
使用“;”進行注釋標號頂格寫實際代碼段聲明文件結束2023/2/516華中科技大學計算機學院簡單的ARM程序;文件名:TEST1.S
;功能:實現兩個寄存器相加;說明:使用ARMulate軟件仿真調試
AREA Example1,CODE,READONLY ;聲明代碼段Example1
ENTRY ;標識程序入口
CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設置參數
MOV R1,#10LOOP BL ADD_SUB ;調用子程序ADD_SUB
B LOOP ;跳轉到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件結束
2023/2/517華中科技大學計算機學院ARM指令小節(jié)目錄1.指令格式2.條件碼3.存儲器訪問指令3.數據處理指令5.乘法指令6.ARM分支指令7.協(xié)處理器指令8.雜項指令9.偽指令2023/2/518華中科技大學計算機學院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>號內的項是必須的,{}號內的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標寄存器; Rn:第1個操作數的寄存器;operand2:第2個操作數;2023/2/519華中科技大學計算機學院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——第2個操作數<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
靈活的使用第2個操作數“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r——常數表達式;Rm——寄存器方式;Rm,shift——寄存器移位方式;2023/2/520華中科技大學計算機學院3.2指令集介紹ARM指令集——第2個操作數#immed_8r——常數表達式該常數必須對應8位位圖,即一個8位的常數通過循環(huán)右移偶數位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數2023/2/521華中科技大學計算機學院3.2指令集介紹ARM指令集——第2個操作數#immed_8r——常數表達式該常數必須對應8位位圖,即一個8位的常數通過循環(huán)右移偶數位得到。例如:MOV R0,#1AND R1,R2,#0x0F2023/2/522華中科技大學計算機學院3.2指令集介紹ARM指令集——第2個操作數Rm——寄存器方式在寄存器方式下,操作數即為寄存器的數值。例如:SUB R1,R1,R2;R1<=R1-R22023/2/523華中科技大學計算機學院3.2指令集介紹ARM指令集——第2個操作數Rm,shift——寄存器移位方式將寄存器的移位結果作為操作數,但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR#n算術右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。2023/2/524華中科技大學計算機學院3.2指令集介紹ARM指令集——第2個操作數Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1SUB R1,R1,R2,LSRR3 ;R1=R1-(R2/2R3)2023/2/525華中科技大學計算機學院
ARM指令的基本格式如下:3.2指令集介紹ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
使用條件碼“cond”可以實現高效的邏輯操作,提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉)指令具有條件執(zhí)行功能。如果指令不標明條件代碼,將默認為無條件(AL)執(zhí)行。2023/2/526華中科技大學計算機學院操作碼條件助記符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數大于或等于0011CC/LOC=0無符號數小于0100MIN=1負數0101PLN=0正數或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數大于1001LSC=0,Z=1無符號數小于或等于1010GEN=V有符號數大于或等于
1011LTN!=V有符號數小于
1100GTZ=0,N=V有符號數大于
1101LEZ=1,N!=V有符號數小于或等于
1110AL任何無條件執(zhí)行
(指令默認條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表2023/2/527華中科技大學計算機學院3.2指令集介紹ARM指令集——條件碼C代碼:if(a>b) a++;else b++;對應的匯編代碼: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華中科技大學計算機學院3.2指令集介紹ARM指令集——存儲器訪問指令
ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現。ARM處理器是馮?諾依曼存儲結構,程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數據的訪問均要通過加載/存儲指令進行。存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。2023/2/529華中科技大學計算機學院助記符說明操作條件碼位置LDRRd,addressing加載字數據Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加載無符號字節(jié)數據Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用戶模式加載字數據Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用戶模式加載無符號字節(jié)數據Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加載無符號半字數據Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加載有符號字節(jié)數據Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加載有符號半字數據
Rd←[addressing],addressing索引
LDR{cond}SHARM存儲器訪問指令——單寄存器加載2023/2/530華中科技大學計算機學院助記符說明操作條件碼位置STRRd,addressing存儲字數據[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存儲字節(jié)數據[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用戶模式存儲字數據[addressing]←Rd,
addressing索引STR{cond}TSTRBTRd,addressing以用戶模式存儲字節(jié)數據[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存儲半字數據[addressing]←Rd,addressing索引STR{cond}HARM存儲器訪問指令——單寄存器存儲
LDR/STR指令用于對內存變量的訪問、內存緩沖區(qū)數據的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數據到PC寄存器,則實現程序跳轉功能,這樣也就實現了程序散轉。所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。2023/2/531華中科技大學計算機學院助記符說明操作條件碼位置LDM{mode}Rn{!},reglist多寄存器加載reglist←[Rn...],Rn回寫等LDM{cond}{mode}STM{mode}Rn{!},reglist多寄存器存儲[Rn...]←reglist,Rn回寫等STM{cond}{mode}ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令可以實現在一組寄存器和一塊連續(xù)的內存單元之間傳輸數據。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現場保護、數據復制、常數傳遞等。2023/2/532華中科技大學計算機學院ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}cond:指令執(zhí)行的條件;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結束后,將最后的地址寫回Rn中;reglist
:表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如{R1,R2,R6-R9},寄存器由小到大排列;^:加入該后綴后,進行數據傳送且寄存器列表不包含PC時,加載/存儲的寄存器是用戶模式下的,而不是當前模式的寄存器。若在LDM指令且寄存器列表中包含有PC時使用,那么除了正常的多寄存器傳送外,還將SPSR也拷貝到CPSR中,這可用于異常處理返回。注意:該后綴不允許在用戶模式或系統(tǒng)模式下使用。2023/2/533華中科技大學計算機學院ARM存儲器訪問指令——多寄存器存取!多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數據傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數據塊傳送操作堆棧操作進行數據復制時,先設置好源數據指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲。進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現堆棧操作。2023/2/534華中科技大學計算機學院助記符說明操作條件碼位置SWPRd,Rm,Rn寄存器和存儲器字數據交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存儲器字節(jié)數據交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}BARM存儲器訪問指令——寄存器和存儲器交換指令
SWP指令用于將一個內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內容寫入到該內存單元中。使用SWP可實現信號量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]
其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲器中讀入的數據;Rm的數據用于存儲到存儲器中,若Rm與Rn相同,則為寄存器與存儲器內容進行交換;Rn為要進行數據交換的存儲器地址,Rn不能與Rd和Rm相同。2023/2/535華中科技大學計算機學院ARM存儲器訪問指令——寄存器和存儲器交換指令SWP和SWPB——寄存器和存儲器交換指令編碼指令執(zhí)行的條件碼B用于區(qū)別無符號字節(jié)(B為1)或字(B為0)Rm源寄存器Rd目標寄存器Rn為基址寄存器SWP指令應用示例:SWP R1,R1,[R0] ;將R1的內容與R0指向的存儲單元的內容進行交換SWPB R1,R2,[R0] ;將R0指向的存儲單元內的容讀取一字節(jié)數據到R1中
;(高24位清零),并將R2的內容寫入到該內存單元中
;(最低字節(jié)有效)2023/2/536華中科技大學計算機學院3.2指令集介紹ARM指令集——ARM數據處理指令數據處理指令大致可分為3類:數據傳送指令;算術邏輯運算指令;比較指令。數據處理指令只能對寄存器的內容進行操作,而不能對內存中的數據進行操作。所有ARM數據處理指令均可選擇使用S后綴,并影響狀態(tài)標志。
2023/2/537華中科技大學計算機學院ARM數據處理指令——指令編碼指令執(zhí)行的條件碼I用于區(qū)別立即數(I為1)和寄存器移位(I為0)opcode數據處理指令操作碼第二操作數Rd目標寄存器Rn第一操作數寄存器S設置條件碼,與指令中的S位對應帶進位加法ADC0101帶進位減法指令SBC0110帶進位逆向減法指令RSC0111位測試指令TST1000相等測試指令TEQ1001比較指令CMP1010負數比較指令CMN1011邏輯或操作指令ORR1100數據傳送MOV1101位清除指令BIC1110數據非傳送MVN1111加法運算指令ADD0100逆向減法指令RSB0011減法運算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令AND0000說明指令助記符操作碼opcode操作碼功能表2023/2/538華中科技大學計算機學院助記符說明操作條件碼位置MOVRd,operand2數據傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數據非傳送Rd←(~operand2)MVN{cond}{S}ARM數據處理指令——數據傳送2023/2/539華中科技大學計算機學院助記符說明操作條件碼位置CMPRn,operand2比較指令標志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數比較指令標志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標志N、Z、C、V←Rn^operand2TEQ{cond}ARM數據處理指令——比較指令2023/2/540華中科技大學計算機學院助記符說明操作條件碼位置CMPRn,operand2比較指令標志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數比較指令標志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標志N、Z、C、V←Rn^operand2TEQ{cond}ARM數據處理指令——比較指令負數比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執(zhí)行。指令格式如下:CMN{cond} Rn,operand2
應用示例:
CMN R0,#1
;R0+1,判斷R0是否為-1的補碼
;如果是,則設置Z標志位2023/2/541華中科技大學計算機學院助記符說明操作條件碼位置CMPRn,operand2比較指令標志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數比較指令標志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標志N、Z、C、V←Rn^operand2TEQ{cond}ARM數據處理指令——比較指令負數比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執(zhí)行。指令格式如下:CMN{cond} Rn,operand2注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結果。CMN指令可用于負數比較,比如CMNR0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復位。2023/2/542華中科技大學計算機學院3.2指令集介紹ARM指令集——乘法指令
ARM7TDMI具有三種乘法指令,分別為:32×32位乘法指令;32×32位乘加指令;32×32位結果為64位的乘/乘加指令。2023/2/543華中科技大學計算機學院ARM指令——乘法指令乘法指令編碼指令執(zhí)行的條件碼Opcode乘法指令操作碼S設置條件碼,與指令中的S位對應Rm為被乘數寄存器Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標寄存器(低32位)Rn/RdHi為目標寄存器或64位乘法指令的目標寄存器(高32位)Rs為乘數寄存器64位有符號乘加指令SMLAL11164位有符號乘法指令SMULL11064位無符號乘加指令UMLAL10164位無符號乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000說明指令助記符操作碼opcode操作碼功能表2023/2/544華中科技大學計算機學院助記符說明操作條件碼位置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華中科技大學計算機學院助記符說明操作條件碼位置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中的值作無符號數相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:UMULL{cond}{S}RdLo,RdHi,Rm,Rs
應用示例:
UMULLR0,R1,R5,R8 ;(R1、R0)=R5×R82023/2/546華中科技大學計算機學院3.2指令集介紹ARM指令集——分支指令在ARM中有兩種方式可以實現程序的跳轉,一種是使用分支指令直接跳轉,另一種則是直接向PC寄存器賦值實現跳轉。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。2023/2/547華中科技大學計算機學院ARM分支指令——指令編碼分支指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號立即數(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標地址寄存器,該寄存器裝載跳轉地址2023/2/548華中科技大學計算機學院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令2023/2/549華中科技大學計算機學院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉范圍限制在當前指令的±32M字節(jié)地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:B{cond}Label
應用示例:
B WAITA ;跳轉到WAITA標號處
B 0x1234 ;跳轉到絕對地址0x1234處2023/2/550華中科技大學計算機學院BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉到指定地址運行程序。跳轉范圍限制在當前指令的±32M字節(jié)地址內。指令格式如下:BL{cond}LabelAddr1+8LabelAddr2Addr21.當程序執(zhí)行到BL跳轉指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉地址裝入程序計數器(PC)2.程序跳轉到目標地址Label繼續(xù)執(zhí)行,當子程序執(zhí)行結束后,將LR寄存器內容存入PC,返回調用函數繼續(xù)執(zhí)行2023/2/551華中科技大學計算機學院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉到指定地址運行程序。跳轉范圍限制在當前指令的±32M字節(jié)地址內。指令格式如下:BL{cond}Label應用示例:
BL DELAY ;調用子程序DELAY2023/2/552華中科技大學計算機學院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態(tài)。指令格式如下:BX{cond}Rm跳轉地址Rm[0]跳轉后CPSR標志T位處理器狀態(tài)00ARM11Thumb2023/2/553華中科技大學計算機學院助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態(tài)。指令格式如下:BX{cond}Rm應用示例:
ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉到R0指定的地址,
;并根據R0的最低位來切換處理器狀態(tài)2023/2/554華中科技大學計算機學院3.2指令集介紹ARM指令集——協(xié)處理器指令(自學)
ARM內核支持協(xié)處理器操作,協(xié)處理器的控制要通過協(xié)處理器命令實現。ARM內核與協(xié)處理器的關系ARM內核協(xié)處理器A協(xié)處理器B握手信號數據地址總線…2023/2/555華中科技大學計算機學院3.2指令集介紹ARM指令集——雜項指令
ARM指令集中有三條指令作為雜項指令,實際上這三條指令非常重要。它們如下所示:助記符說明操作條件碼位置SWIimmed_24軟中斷指令產生軟中斷,處理器進入管理模式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華中科技大學計算機學院ARM雜項指令——軟中斷指令
SWI指令用于產生軟中斷,從而實現在從戶模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉到SWI異常入口。在其它模式下也可使用SWI指令,處理器同樣地切換到管理模式。該指令主要用于用戶程序調用操作系統(tǒng)的系統(tǒng)服務,操作系統(tǒng)在SWI異常處理程序中進行相應的系統(tǒng)服務。SWI{cond} immed_24SWI指令格式SWI指令編碼指令執(zhí)行的條件碼指令傳遞的參數(24位立即數)2023/2/557華中科技大學計算機學院ARM雜項指令——軟中斷指令根據SWI指令傳遞的參數,SWI異常處理程序可以作出相應的處理。SWI指令傳遞參數有以下兩種方法,指令中的24位立即數指定了用戶請求的服務類型,參數通過通用寄存器傳遞。MOVR0,#34
;設置子功能號為34SWI12
;調用12號軟中斷指令中的24位立即數被忽略,用戶請求的服務類型由寄存器R0的值決定,參數通過其它的通用寄存器傳遞。MOVR0,#12
;調用12號軟中斷MOVR1,#34
;設置子功能號為34SWI0
2023/2/558華中科技大學計算機學院ARM雜項指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現場保護
MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測試T標志位
LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數
LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數
...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回2023/2/559華中科技大學計算機學院ARM雜項指令——狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRS{cond}Rd,psrMRS指令格式指令對應編碼指令執(zhí)行的條件碼目標寄存器,不能為R15區(qū)別CPSR(為0)和SPSR(為1)寄存器2023/2/560華中科技大學計算機學院ARM雜項指令——狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRS{cond}Rd,psrMRS指令格式應用示例:
MRSR1,CPSR ;將CPSR狀態(tài)寄存器讀取,保存到R1中
MRSR2,SPSR ;將SPSR狀態(tài)寄存器讀取,保存到R2中2023/2/561華中科技大學計算機學院ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對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標志域屏蔽字節(jié)(psr[31..24])保存要傳送到狀態(tài)寄存器指定域數據的源寄存器要傳送到狀態(tài)寄存器指定域的立即數2023/2/562華中科技大學計算機學院保存要傳送到狀態(tài)寄存器指定域數據的源寄存器ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對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標志域屏蔽字節(jié)(psr[31..24])要傳送到狀態(tài)寄存器指定域的立即數MSR指令1編碼MSR指令2編碼Rotate:立即數對齊8_bit_immediate:8位立即數2023/2/563華中科技大學計算機學院(1)(2)(3)(4)ARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。應用示例1:;子程序:使能IRQ中斷ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR應用示例2:;子程序:禁能IRQ中斷DISABLE_IRQMRSR0CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR
1.將CPSR寄存器內容讀出到R0;2.修改對應于CPSR中的I控制位;3.將修改后的值寫回CPSR寄存器的對應控制域;3.返回上一層函數;2023/2/564華中科技大學計算機學院3.2指令集介紹ARM偽指令
ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別為ADR偽指令、ADRL偽指令、LDR偽指令、NOP偽指令。2023/2/565華中科技大學計算機學院ARM偽指令——小范圍的地址讀取
ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現該ADR偽指令的功能,若不能用一條指令實現,則產生錯誤,編譯失敗。ADR{cond}register,exprADR偽指令格式指令執(zhí)行的條件碼加載的目標寄存器地址表達式地址表達式expr的取指范圍:當地址值不是字對齊時,其取指范圍為-255~255;當地址值是字對齊時,其取指范圍為-1020~1020;當地址值是16字節(jié)對齊時,其取指范圍將更大。2023/2/566華中科技大學計算機學院ARM偽指令——小范圍的地址讀取
ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO 16830:2025 EN Specification of bamboo drinking straws
- 江西師范大學科學技術學院《建筑設備施工組織設計》2023-2024學年第一學期期末試卷
- 湖南中醫(yī)藥大學湘杏學院《水電站建筑物》2023-2024學年第一學期期末試卷
- 湖南工藝美術職業(yè)學院《多媒體信息處理與檢索技術》2023-2024學年第一學期期末試卷
- 衡陽科技職業(yè)學院《統(tǒng)計軟件操作》2023-2024學年第一學期期末試卷
- 浙江師范大學《能源與動力工程測試技術》2023-2024學年第一學期期末試卷
- 長春師范大學《衛(wèi)生檢驗綜合技術》2023-2024學年第一學期期末試卷
- 榆林職業(yè)技術學院《太陽能熱利用技術》2023-2024學年第一學期期末試卷
- 使用二手設備節(jié)約資本開支
- 實踐學習實施報告
- 特色酒吧方案計劃書
- 重慶市南開中學2023-2024學年中考三模英語試題含答案
- 2023年上海高中物理合格考模擬試卷一含詳解
- 2022版義務教育(地理)課程標準(附課標解讀)
- 2024年滑雪用品行業(yè)分析報告及未來發(fā)展趨勢
- 經方治療腦梗塞的體會
- 新版DFMEA基礎知識解析與運用-培訓教材
- 制氮機操作安全規(guī)程
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護理安全用氧培訓課件
- 《三國演義》中人物性格探析研究性課題報告
評論
0/150
提交評論