ARM指令集机器编码基本格式:

所有的指令,占用4字节,32位

程序的启动从ARM指令集开始,进入异常转化为ARM状态,运行ARM指令集指令;ARM汇编语言指令格式

ARM汇编语言指令格式

<opcode>{<cond>}{s} <Rd>,<Rn>{,<operand2>}

opcode:操作码(指令助记符),如B,STR;

cond:可选择的条件码,执行条件,如NE,EQ;

S:若有S后缀,则根据计算结果更新CPSR中的条件码

Rd:目标寄存器;

Rn:存放第一个操作数的寄存器;

operand2:第二个操作数。

ARM指令条件码

0000 EQ: Z置位,表示相等

0001 NE: Z清零,表示不相等

0010 CS/HS: C置位,无符号数大于或等于

0011 CC/LO: C清零,无符号数小于

0100 MI: N置位,表示负数

0101 PL: N清零,表示正数或零

0110 VS: V置位,表示溢出

0111 VC: V清零,表示未溢出

1000 HI: C置位且Z清零,无符号数大于

1001 LS: C清零或Z置位,无符号数小于或等于

1010 GE: N等于V,带符号数大于或等于

1011 LT: N不等于V,带符号数小于

1100 GT: Z清零且N等于V,带符号数大于

1101 LE: Z置位或N不等于V,带符号数小于或等于

1110 AL: 无条件执行

ARM寻址

立即寻址

含义:操作数包含在指令的32位机器编码中;

例子

MOV R0,#0x0000F200   ;R0 <- #0x0000F200

值得庆幸的:其实没必要一个一个数的算,编译系统为我们提供了伪指令LDR。

ldr r1,=0x12345678

寄存器寻址

含义: 操作数存放在寄存器中

例子:

  1. 基本操作方式

ADD R0,R1,R2  ; R0<-R1+R2
  1. 对第二操作数寄存器的移位操作

ADD R3,R2,R1,LSR #2  ;  R3<-R2+R1÷4

注意:第二个操作数为寄存器时方可进行移位操作,移位数可以是五位立即数或某个寄存器内的数值,执行完毕后第二操作数寄存器中的数值并不改变;

寄存器间接寻址

含义:利用寄存器的值作为存储器指针,数据传送类的load/store类指令都使用寄存器间接寻址方式;

LDR RO,[R1] ; R0<mem32[R1]
STR RO,[R1] ; mem32[R1]R0