新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM指令集與Thumb指令集的區別

        ARM指令集與Thumb指令集的區別

        作者: 時間:2016-11-20 來源:網絡 收藏
        一、現在先區分下ARM指令集Thumb指令集

        Thumb 指令可以看作是 ARM 指令壓縮形式的子集,是針對代碼密度的問題而提出的,它具有 16 位的代碼密度但是它不如ARM指令的效率高 .Thumb 不是一個完整的體系結構,不能指望處理只執行Thumb 指令而不支持 ARM 指令集.因此,Thumb 指令只需要支持通用功能,必要時可以借助于完善的 ARM 指令集,比如,所有異常自動進入 ARM 狀態.在編寫 Thumb 指令時,先要使用偽指令 CODE16 聲明,而且在 ARM 指令中要使用 BX指令跳轉到 Thumb 指令,以切換處理器狀態.編寫 ARM 指令時,則可使用偽指令 CODE32聲明.

        本文引用地址:http://www.104case.com/article/201611/318735.htm

        流水線處理:
        不同于微編碼的處理器,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}



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 垣曲县| 房产| 申扎县| 柳林县| 易门县| 遵义市| 兴化市| 紫金县| 云南省| 游戏| 客服| 大庆市| 界首市| 仙游县| 定襄县| 澳门| 保定市| 武平县| 嵊泗县| 武强县| 科技| 遂平县| 邳州市| 镇巴县| 随州市| 辉南县| 察雅县| 湖南省| 积石山| 宜城市| 乌恰县| 彭泽县| 呈贡县| 马公市| 宜昌市| 南川市| 西安市| 当雄县| 绵阳市| 凯里市| 紫金县|