格式如下:

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

opcode: 指令助记符
cond: 执行条件
S: 是否影响 CPSR 突破口的值
Rd: 目标寄存器
Rn: 第 1 个操作数的寄存器
operand2: 第 2 个操作数
其中<>内的项是必须的,{}内的项是可选的。

使用条件码“cond”可以实现高效的逻辑操作,所有的ARM指令都可以条件执行,而Thumb指令
只有B(跳转)指令具有条件执行功能。无条件码时默认是无条件(AL)执行。其中的S项表示
该条指令是否影响CPSR寄存器的值,CMP指令是默认影响的,其他的包括 ADD 和 SUB 等指
令也可以影响 CPSR 寄存器的值,但要加上这个标记。

灵活使用第 2 个操作数能够提高代码效率。operand2 有如下形式:

  • #immed_8r – 常数表达式(立即数)
    ARM 中不是所有的数都可以作为立即数,立即数共有 12 位组成,其中[7:0]位表示基数,
    [11:8]位表示移位数,具体还是参考相关资料,此处不详述。
  • Rm – 寄存器方式(操作数即为寄存器的数值)
  • Rm,shift – 寄存器移位方式

将寄存器的移位结果作为操作数,但 Rm 的值保持不变。
例如,

ADD R1,R1,R1,LSL #3  ; R1 = R1+R1*8 = 9*R1
SUB R1,R1,R2,LSR R3  ; R1 = R1-(R2/2^R3)

除标号外,其他指令前面必须有空白符,不能直接写在行首。

关于 ARM 汇编的立即数有限制的原因,我的理解是,ARM 是 RISC 体系结构的,指令是定
长的(32 bits),32 位 ARM 汇编中 int 型应该是32 bits,而指令的操作码等占用了指令
的一部分,所以不可能有 32 个 bits 来表示立即数,所以出现了一些补偿的办法,或者说
限制。ARM 甚至有一个 ldr 伪指令来处理这种情况(ldr 是一条汇编指令,同时也有伪指令
的形式)。