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>         ;断点中断
相关文章
相关标签/搜索