ARM指令

語法格式

<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>

{}表示是可選的部分,<>表示是必要的部分post

條件碼

大部分ARM指令都支持條件執行,即知足某些條件的時候執行當前指令,同時,還配合有S位用來指示當前指令是否會映像CPSR相應的位。測試

EQ Equal 相等 Z=1
NE Noequal 不相等 Z=0
CS/HS CarrySet/HighorSame 無符號數>= C=1
CC/LO CarryClear/LOwer 無符號數< C=0
MI MInus 負數 N=1
PL Plus 非負數 N=0
VS oVerflowSet 上溢出 V=1
VC oVerflowClear 沒有上溢出 V=0
HI HIgh 無符號> C=1&&Z=0
LS LowerorSame 無符號數<= C=0
GE GreaterorEqual 帶符號數>= N=1&&V=1或 N=0&&V=0
LT LessThan 帶符號數< N=1&&V=0或 N=0&&V=1
GT GreaterThan 帶符號數> Z=0&&N=V
LE LessEqual 帶符號數<= Z=1&&N!=V
AL 無條件執行

跳轉

B指令跳轉的範圍是PC+-32M,由於ARM一條指令32bit,操做碼B佔了6bit,還有24bit裝數據,考慮到ARM的地址是4byte對齊的,因此最後的兩位都會是0,因此就能夠用24bit數據表達26bit的地址空間,2^26=64M,即+-32M。若是須要跳轉的地址距離PC超過了32M,能夠將目標地址壓棧,經過內存將地址傳遞給PC實現長跳轉code

B{<cond>}       <target_addr>
BL{<cond>}      <target_addr>
BX{<cond>},     <Rm>
BLX <target_address>
BLX{<cond>} <Rm>

數據處理

  • 注意當即數的合法性問題
  • 當即數=(8bit數據) ROR 偶數位,若是不能經過這種方式獲得,就會報錯
  • {S}用於表示當前指令的操做結果是否影響CPSR中的相應位
MOV{<cond>}{S}  <Rd>,   <shifter_operand>           ;數據傳送
MVN{<cond>}{S}  <Rd>,   <shifter_operand>           ;數據求反傳送
ADD{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;加法
ADC{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;帶位加法
SUB{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;減法
SBC{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;帶位減法
RSB{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;逆向減法
RSC{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;帶位逆向減法
AND{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;邏輯與
ORR{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;邏輯或
EOR{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;邏輯異或
BIC{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;位清除
CMP{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;比較
CMN{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;基於相反數的比較
TST{<cond>}{S}  <Rd>,   <Rn>,   <shifter_operand>       ;位測試
TEQ{<cond>} <Rn>,   <shifter_operand>               ;相等測試

數據處理指令的操做數尋址方式(shifter_operand)

<opcode>{<cond>}{S} <Rd>,   <Rn>,   <shifter_operand>
#<immediate>                     ;當即數尋址
<Rm>                             ;寄存器尋址
<Rm>,LSL    #<shift_imm>        ;當即數邏輯左移
<Rm>,LSL    <Rs>                ;寄存器邏輯左移

<Rm>,LSR    #<shift_imm>        ;當即數邏輯右移
<Rm>,LSR    <Rs>                ;寄存器邏輯右移

<Rm>,ASR    #<shift_imm>        ;當即數算術右移
<Rm>,ASR    <Rs>                ;當即數算術右移

<Rm>,ROR    #<shift_imm>        ;當即數循環右移
<Rm>,ROR    <Rs>                ;寄存器循環右移

<Rm>,RRX                        ;寄存器擴展循環右移

乘法指令

任何乘法指令都必須使用寄存器,不能使用當即數內存

MUL{<cond>}{S}  <Rd>,   <Rm>,   <Rs>                ;32位乘法
MLA{<cond>}{S}  <Rd>,   <Rm>,   <Rs>,   <Rn>    ;32位帶加數的乘法
SMULL{<cond>}{S}    <RdLo>, <RdHi>, <Rm>,   <Rs>        ;64位有符號數乘法
SMLAL{<cond>}{S}    <RdLo>, <RdHi>, <Rm>,   <Rs>        ;64位帶加數的有符號數乘法
UMULL{<cond>}{S}    <RdLo>, <RdHi>, <Rm>,   <Rs>        ;64位無符號數乘法
UMLAL{<cond>}{S}    <RdLo>, <RdHi>, <Rm>,   <Rs>        ;64位帶加數的無符號數乘法

PSR指令

MRS{<cond>} <Rd>,   CPSR                            ;將PSR的內容傳送到通用寄存器中
MRS{<cond>} <Rd>,   SPSR                            
MSR{<cond>} CPSR_<fields>,  #<immediate>            ;將通用寄存器的內容或一個當即數傳送到PSR
MSR{<cond>} CPSR_<fields>,  <Rm>                    
MSR{<cond>} SPSR_<fields>,  #<immediate>    
MSR{<cond>} SPSR_<fields>,  <Rm>

內存訪問

B字節,H半字,T用戶模式,S由有符號get

LDR{<cond>      <Rd>,   <addressing_mode>               ;字數據讀取
LDR{<cond>}B    <Rd>,   <addressing_mode>               ;字節數據讀取
LDR{<cond>}BT   <Rd>,   <addressing_mode>               ;用戶模式的字節數據讀取
LDR{<cond>}H    <Rd>,   <addressing_mode>               ;半字數據讀取
LDR{<cond>}SB   <Rd>,   <addressing_mode>               ;有符號的字節數據讀取
LDR{<cond>}SH   <Rd>,   <addressing_mode>               ;有符號的半字數據讀取
LDR{<cond>}T    <Rd>,   <post_indexed_addressing_mode>      ;用戶模式的字數據讀取
STR{<cond>}     <Rd>,   <addressing_mode>               ;字數據寫入
STR{<cond>}B    <Rd>,   <addressing_mode>               ;字節數據寫入
STR{<cond>}H    <Rd>,   <addressing_mode>               ;半字數據寫入
STR{<cond>}T    <Rd>,   < post_indexed_addressing_mode> ;用戶模式字數據寫入

批量內存訪問

LDM{<cond>}<addressing_mode>    <Rn>{!},        <registers>         ;批量內存字數據讀取
LDM{<cond>}<addressing_mode>    <Rn>{!},        <registers_without_pc>  ;用戶模式的批量內存字數據讀取
LDM{<cond>}<addressing_mode>    <Rn>{!},        <registers_and_pc>      ;帶PSR的批量內存字數據讀取
STM{<cond>}<addressing_mode>    <Rn>{!},        <registers>         ;批量內存字數據寫入
STM{<cond>}<addressing_mode>    <Rn>,       <registers>         ;用戶模式的批量內存字數據寫入

異常發生指令

SWI{<cond>} <immed_24>      ;軟中斷
BKPT    <immediate>         ;斷點中斷
相關文章
相關標籤/搜索