A R M 指令 系统
本章重点讲述 ARM V7 架构的指令系 统,包括 ARM 指令的指令格式、条件码、ARM 指令的寻址方式和 ARM V7 架构下的 Thumb-2 指令集。一.指令格式 {}{S} , {,<shifter_operand>} opcode 为指令操作码,cond 为执行条件,S 表示该指令的执行是否影响应用程序状态寄存器 APSR(标志)寄存器的值(若写上则影响 APSR),Rd 为目的操作数(寄存器),Rn 为第一源操作数(寄 存器),shifter_operand 为第二源操作数“<>”符号内的项是必需的,“{}”符号内 的项是可选的例如: MOVS R1, R2 ;R2 传送到 R1,且更新 APSR MOV R1, R2 ;R2 传送到 R1,且不更新 APSR 二. 4 位的条件码(cond)条件码共有 16 种(见下表)。 EQ 相等 NE 不相等 CS/HS 无符号数大于等于 CC/LO 无符号数小于三.第二源操作数<shifter_operand>有三类共 11 种选择形式,三类方式分别是立即数方式、寄存器方式 和寄存器移位方式。(1) 立即数方式(#immed) 32位立即数 = immed_8循环右移(2×rotate_imm)位 例:(2) 寄存器方式(Rm) 例如: ADD R2, R3, R4 ; R2 ← R3 + R4 SUB R1, R3, R2 ; R1 ← R3 – R2 (3) 寄存器移位方式(Shift_operand) 例如: MOV R0, R2, LSL #3 ;R2 逻辑左移 3 位(相当于乘 8)后,赋值给 R0 寄存器 具体的移位类型有 9 种: ,ASR #<shift_imm>/ 操作:按照立即数 shift_imm 或 Rs(通用寄存器,不能是 R15)内容指定的次数,对寄存器 Rm 中 的值向右移动,左端用 Rm第 31 位的值来填充。算术右移一位相当于有符号数除以 2。 ,LSL #<shift_imm>/ 操作:按照立即数 shift_imm 或 Rs(通用寄存器,不能是 R15)内容指定的次数,对寄存器 Rm 中 的值向左移动,低位用 0 填充。逻辑左移一位相当于无符号数乘以 2。 ,LSR #<shift_imm>/ 操作:按照立即数 shift_imm 或 Rs(通用寄存器,不能是 R15)内容指定的次数,对寄存器 Rm 中 的值向右移动,高位用 0 填充。逻辑右移一位相当于无符号数除以 2。 ,ROR #<shift_imm> / 操作:按照立即数 shift_imm 或 Rs(通用寄存器,不能是 R15)内容指定的次数,对寄存器 Rm 中 的值向右循环移动,左端用右端移出的位填充。 ,RRX 操作:对寄存器 Rm 中的值进行带扩展的循环右移操作,执行该指令时数据循环右移 1 位。与 ROR 指令不同的是,要在循环数据的高位与低位之间添加 CPSR 中的进位标志位 C,每右移一位,C 标 志位移入 Rm 高位,Rm 的低位移入 C 标志位。 以上 9 种类型的立即数 shift_imm 由于只有 5 位,所以取值范围为 0~31。 四.ARM 指令的寻址方式 立即寻址 寄存器直接寻址 寄存器移位寻址 寄存器间接寻址 基址变址寻址 多寄存器直接寻址 堆栈寻址 五.ARM 核心指令数据传送指令 存储器访问指令 算术运算指令 逻辑运算指令 移位和循环指令 符号扩展指令字节调序指令 位域处理指令 比较和测试指令 子程序调用与无条件转移指令 饱和运算指令伪指令