ARM指令和Thumb指令的區別


ARM處理器的工作狀態

https://blog.csdn.net/itismine/article/details/4753701?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

       在ARM的體系結構中,可以工作在三種不同的狀態,一是ARM狀態,二是Thumb狀態及Thumb-2狀態,三是調試狀態。

  Thumb 指令可以看作是 ARM 指令壓縮形式的子集,是針對代碼密度的問題而提出的,它具有 16 位的代碼密度,但是它不如ARM指令的效率高 .

Thumb 不是一個完整的體系結構,不能指望處理只執行Thumb 指令而不支持 ARM 指令集.

因此,Thumb 指令只需要支持通用功能,必要時可以借助於完善的 ARM 指令集,比如,所有異常自動進入 ARM 狀態.

 

在編寫 Thumb 指令時,先要使用偽指令 CODE16 聲明,而且在 ARM 指令中要使用 BX指令跳轉到 Thumb 指令,以切換處理器狀態.

編寫 ARM 指令時,則可使用偽指令 CODE32聲明.

 

流水線處理:
不同於微編碼的處理器,ARM (保持它的 RISC 性)是完全硬布線的。

為了加速 ARM 2 和 3 的執行使用 3 階段流水線。第一階段持有從內存中取回的指令。第二階段開始解碼,而第三階段實際執行它。故此,程序計數器總是超出當前執行的指令兩個指令。(在為分支指令計算偏移量時必須計算在內)。

因為有這個流水線,在分支時丟失 2 個指令周期(因為要重新添滿流水線)。所以最好利用條件執行指令來避免浪費周期。例如:

...
CMP R0,#0
BEQ over
MOV R1,#1
MOV R2,#2
over
...


可以寫為更有效的:
...
CMP R0,#0
MOVNE R1,#1
MOVNE R2,#2


二、Thumb 指令集與 ARM 指令集的區別
Thumb 指令集沒有協處理器指令,信號量指令以及訪問 CPSR 或 SPSR 的指令,沒有乘加指令及 64 位乘法指令等,且指令的第二操作數受到限制;除了跳轉指令 B 有條件執行功能外,其它指令均為無條件執行;大多數 Thumb 數據處理指令采用 2 地址格式.Thumb指令集與

ARM 指令的區別一般有如下幾點:

  •       跳轉指令

程序相對轉移,特別是條件跳轉與 ARM 代碼下的跳轉相比,在范圍上有更多的限制,轉向子程序是無條件的轉移.

  •       數據處理指令

數據處理指令是對通用寄存器進行操作,在大多數情況下,操作的結果須放入其中一個操作數寄存器中,而不是第 3 個寄存器中.數據處理操作比 ARM 狀態的更少,訪問寄存器 R8~R15 受到一定限制.除 MOV 和 ADD 指令訪問器 R8~R15 外,其它數據處理指令總是更新 CPSR 中的 ALU 狀態標志.訪問寄存器 R8~R15 的 Thumb 數據處理指令不能更新 CPSR 中的 ALU 狀態標志.

  •       單寄存器加載和存儲指令

在 Thumb 狀態下,單寄存器加載和存儲指令只能訪問寄存器 R0~R7

  •       批量寄存器加載和存儲指令

LDM 和 STM 指令可以將任何范圍為 R0~R7 的寄存器子集加載或存儲. PUSH 和 POP 指令使用堆棧指令 R13 作為基址實現滿遞減堆棧.除 R0~R7 外,PUSH 指令還可以存儲鏈接寄存器 R14,並且 POP 指令可以加載程序指令PC

 

ARM指令分為以下幾種:

一、ARM 存儲器訪問指令
助記符                       說明                                        操作                                                  條件碼位置
LDR    Rd,addressing      加載字數據                            Rd←[addressing],addressing 索引 LDR{cond}
LDRB   Rd,addressing    加載無符字節數據                  Rd←[addressing],addressing 索引 LDR{cond}B
LDRT   Rd,addressing    以用戶模式加載字數據        Rd←[addressing],addressing 索引 LDR{cond}T
LDRBT Rd,addressing    以用戶模式加載無符號字數據 Rd←[addressing],addressing 索引 LDR{cond}BT
LDRH   Rd,addressing    加載無符半字數據              Rd←[addressing],addressing 索引 LDR{cond}H
LDRSB Rd,addressing    加載有符字節數據        Rd←[addressing],addressing 索引 LDR{cond}SB
LDRSH Rd,addressing    加載有符半字數據     Rd←[addressing],addressing 索引 LDR{cond}SH
STR    Rd,addressing    存儲字數據                        [addressing]←Rd,addressing 索引 STR{cond}
STRB   Rd,addressing    存儲字節數據       [addressing]←Rd,addressing 索引 STR{cond}B
STRT   Rd,addressing    以用戶模式存儲字數據    [addressing]←Rd,addressing 索引 STR{cond}T
SRTBT Rd,addressing    以用戶模式存儲字節數據   [addressing]←Rd,addressing 索引 STR{cond}BT
STRH   Rd,addressing    存儲半字數據          [addressing]←Rd,addressing 索引 STR{cond}H
LDM{mode} Rn{!},reglist   批量(寄存器)加載       reglist←[Rn…],Rn 回存等          LDM{cond}{more}
STM{mode} Rn{!},rtglist   批量(寄存器)存儲           [Rn…]← reglist,Rn 回存等         STM{cond}{more}
SWP     Rd,Rm,Rn          寄存器和存儲器字數據交換 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}
SWPB    Rd,Rm,Rn        寄存器和存儲器字節數據交換 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}B

二、ARM 數據處理指令
助記符號                                   說明                                   操作               條件碼位置
MOV Rd ,operand2   數據轉送                           Rd←operand2               MOV {cond}{S}
MVN Rd ,operand2   數據非轉送                        Rd←(operand2)             MVN {cond}{S}
ADD Rd,Rn operand2 加法運算指令                  Rd←Rn+operand2            ADD {cond}{S}
SUB Rd,Rn operand2 減法運算指令                  Rd←Rn-operand2            SUB {cond}{S}
RSB Rd,Rn operand2 逆向減法指令                  Rd←operand2-Rn            RSB {cond}{S}
ADC Rd,Rn operand2 帶進位加法                     Rd←Rn+operand2+carry      ADC {cond}{S}
SBC Rd,Rn operand2 帶進位減法指令            Rd←Rn-operand2-(NOT)Carry SBC {cond}{S}
RSC Rd,Rn operand2 帶進位逆向減法指令       Rd←operand2-Rn-(NOT)Carry RSC {cond}{S}
AND Rd,Rn operand2 邏輯與操作指令              Rd←Rn&operand2            AND {cond}{S}
ORR Rd,Rn operand2 邏輯或操作指令             Rd←Rn|operand2            ORR {cond}{S}
EOR Rd,Rn operand2 邏輯異或操作指令          Rd←Rn^operand2            EOR {cond}{S}
BIC Rd,Rn operand2 位清除指令                      Rd←Rn&(~operand2)         BIC {cond}{S}
CMP Rn,operand2    比較指令                       標志 N、Z、C、V←Rn-operand2 CMP {cond}
CMN Rn,operand2    負數比較指令               標志 N、Z、C、V←Rn+operand2 CMN {cond}
TST Rn,operand2    位測試指令                    標志 N、Z、C、V←Rn&operand2 TST {cond}
TEQ Rn,operand2    相等測試指令                標志 N、Z、C、V←Rn^operand2 TEQ {cond}

 

三、乘法指令
      具有 32×32 乘法指令,32×32 乘加指令,32×32 結果為 64 位的乘/乘法指令.
助記符                                               說明                        操作              條件碼位置
MUL   Rd,Rm,Rs        32 位乘法指令    Rd←Rm*Rs           (Rd≠Rm)    MUL{cond}{S}
MLA   Rd,Rm,Rs,Rn     32 位乘加指令    Rd←Rm*Rs+Rn        (Rd≠Rm)    MLA{cond}{S}
UMULL RdLo,RdHi,Rm,Rs 64 位無符號乘法指令 (RdLo,RdHi)←Rm*Rs             UMULL{cond}{S}
UMLAL RdLo,RdHi,Rm,Rs 64 位無符號乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) UMLAL{cond}{S}
SMULL RdLo,RdHi,Rm,Rs 64 位有符號乘法指令 (RdLo,RdHi)←Rm*Rs             SMULL{cond}{S}
SMLAL RdLo,RdHi,Rm,Rs 64 位有符號乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) SMLAL{cond}{S}

 

四、跳轉指令
在 ARM 中有兩種方式可以實現程序的跳轉,一種是使用跳轉指令直接跳轉,另一種則是直接向 PC 寄存器賦值實現跳轉.
          
助記符           說明                            操作                    條件碼位置
B label 跳轉指令                             Pc←label                 B{cond}
BL label 帶鏈接的跳轉指令             LR←PC-4, PC←label BL{cond}
BX Rm    帶狀態切換的跳轉指令    PC←label,切換處理狀態 BX{cond}

五、ARM協處理器指令
ARM 支持協處理器操作,協處理器的控制要通過協處理器命令實現.
助記符                                                            說明                           操作             條件碼位置
CDP
coproc,opcodel,CRd,CRn,CRm{,opcode2}     協處理器數據操作指令       取決於協處理器   CDP{cond}
LDC{L} coproc,CRd〈地址〉                  協處理器數據讀取指令      取決於協處理器   LDC{cond}{L}
STC{L} coproc,CRd,〈地址〉                 協處理器數據寫入指令      取決於協處理器   STC{cond}{L}
                                                                    ARM 寄存器到協處理器
MCR coproc, opcodel,Rd,CRn,{,opcode2}   寄存器的數據傳送指令       取決於協處理器 MCR{cond}
                                                                     協處理器寄存器到 ARM
MRC coproc, opcodel,Rd,CRn,{,opcode2}   寄存器到數據傳送指令        取決於協處理器MCR{cond}

五、ARM 雜項指令
助記符                                                說明                            操作                               條件碼位置
SWI immed_24                軟中斷指令               產生軟中斷,處理器進入管理模式       SWI{cond}
MRS Rd,psr                  讀狀態寄存器指令 Rd←psr,psr 為 CPSR 或 SPSR                  MRS{cond}
MSR psr_fields,Rd/#immed_8r 寫狀態寄存器指令 psr_fields←Rd/#immed_8r,psr 為 CPSR 或 SPSR MSR{cond}
————————————————
版權聲明:本文為CSDN博主「itismine」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/itismine/java/article/details/4753701


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM