ARM 指令分类及其寻址方式
ARM 指令集概要
ARM 微处理器的指令长度可以是 32 位(在 ARM 状态下),也可以为 16 位(在 Thumb 状态下)。 ARM 微处理器中支持字节(8 位)、半字(16 位)、字(32 位)三种数据类型。其中,字需要 4 字节对齐(地址的低两位为 0)、半字需要 2 字节对齐(地址的最低位为 0)。
ARM 汇编指令格式
ARM 指令的典型编码格式为:{cond} {opcode} {S} {Rn} {Rd} {shifter_operand},其中 {cond} 是指令执行的条件编码、{opcode} 是指令操作符编码、{S} 决定指令的执行是否影响 CPRS 的值、{Rn} 是包含第一个源操作数的寄存器编码、{Rd} 是目标寄存器编码、{shifter_operand} 是第二个源操作数。
ARM 指令的条件码域
大多 ARM 指令都可以条件执行,也就是根据 CPSR 中的条件码的状态决定是否执行该指令。只有在 CPSR 中的条件码标志满足指定的条件时,带条件码的指令才可以执行,否则指令被忽略(相当于一条空操作 NOP 指令)。每一条 ARM 指令编码中包含 4 位的条件码,位于指令编码的最高 4 位[31:28]。条件码共有 16 种,每种条件码可用两个字符(条件码的助记符)表示,这两个字符可以添加在指令助记符的后面和指令同时使用。
ARM 寻址方式
ARM 寻址方式有多种,包括立即寻址、寄存器寻址、寄存器间接寻址、寄存器移位寻址、基址变址寻址等。
立即寻址
立即寻址就是在指令中直接给出操作数的值,例如 ADD R0, R0, #0x1;R0 ← R0 + 1。
寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,例如 ADD R0, R1, R2;R0 ← R1 + R2。
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中,例如 LDR R0, [R1];R0 ← [R1]。
寄存器移位寻址
寄存器移位寻址就是将寄存器中的值移位后作为操作数,例如 ADD R3, R2, R1, LSL #2;R3 ← R2 + 4*R1。
基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址,例如 LDR R0, [R1, #4];R0 ← [R1 + 4]。