ARM指令系统

本课程讲解内容主要基于ARM7处理器

概述

记一下ARM的处理器组成

编程模型

什么是编程模型?

编程模型(Programming Model)是所有用户可见的寄存器的集合。

用户级程序使用的寄存器:

  • 15个通用32位寄存器(r0~r14)
  • 1个程序计数器PC(r15)
  • 1个当前状态寄存器(CPSR,Current Program Status Register)
  • r0-r3用于参数传入。如果需要的参数超过4个,则将被置于栈中
  • r11帧指针寄存器(Frame Pointer, FP)
  • r13栈指针寄存器(Stack Pointer, SP)
  • r14链接寄存器(Link Register, LR)
  • r15程序计数器(Program Counter, PC)

处理器模式

  • 用户模式:正常的程序执行状态;
  • 系统模式:运行具有特权的操作系统任务;
  • FIQ 模式(Fast Interrupt Request):用于支持高速数据传输或通道处理;
  • IRQ 模式(Interrupt Request):用于通用中断处理;
  • SVC 模式(Supervisor):用于操作系统的保护模式;
  • ABT 模式(Abort):在一个数据或指令预取异常终止的时候进入的模式;
  • UND 模式(Undefined):在执行了一个未定义的指令的时候进入的模式;

ARM处理器模式由CPSR寄存器的mode[4:0]控制。

异常模式

异常类型 处理器模式 异常向量地址 优先级
复位 管理 0×00000000 1
未定义指令 未定义 0×00000004 7
软件中断 管理 0×00000008 6
预取中止 中止 0×0000000C 5
数据中止 0×00000010 2
中断IRQ 中断 0×00000018 4
快中断FIQ 快中断 0×0000001C 3

关于中断

收到中断请求之后,处理器暂停执行当前程序,转而执行中断服务程序,处理完毕后再返回到程序断点处,继续执行原来的程序。

各模式下的寄存器

记一记,很容易搞混

  • R0~R7:保存数据或地址值的通用寄存器
  • R8~R14和SPSR:取决于当前的处理器模式
    • R8~R12有2组不同的物理寄存器:一组用于除FIQ模式之外的所有寄存器模式(R8~R12),另一组用于FIQ模式(R8_fiq~R12_fiq)
    • R13和R14分别有6个不同的物理寄存器:1个是用户模式和系统模式公用,其余5个分别对应于其他5种异常模式
    • SPSR有5个不同的物理寄存器:分别对应于其他5种异常模式,注意用户模式和系统模式下没有该寄存器

异常

当出现异常时,异常模式的R14和SPSR寄存器用于保存状态

当ARM处理器遇到一条自己和系统内协处理器都无法处理的指令时,这时将产生未定义指令异常中断。从未定义指令异常状态返回时,处理器执行下面的指令:

MOVS PC, R14_und

练习

答案
  1. D
  2. CE
  3. B

CPSR

  • N:当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零。
  • Z:Z=1表示运算结果为零;Z=0表示运算结果为非零。
  • C:可以有4种方法设置C的值
  • 加法运算(包括CMN):产生进位C=1,否则C=0。
  • 减法运算(包括CMP):产生借位C=0,否则C=1。
  • 包含RRX的非加/减运算指令:C为移出值的最后一位。
  • 对于其他非加减运算指令,C值通常保持不变。
  • V:当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。对于其他非加减运算,V的值通常保持不变。

NZ较简单,略过。

进位 C

mov  w0,#0xaa	;w0的最高位为1

adds w0,w0,w0 ; 执行后 相当于 10101010 << 1 最高位进位1 C标记 为 1
adds w0,w0,w0 ; 执行后 相当于 01010101 << 1 最高位进位0 C标记 为 0

mov w0,#0x0 ; wo = 0x0, 二进制0000

subs w0,w0,#0xff ; w0 - 0xff = 0x00 - 0xff = 0x00 + 0xffffff01 = 0xffffff01
; 没有进位, C = 0
subs w0,w0,#0xff ; wo - 0xff = 0xffffff01 - 0xff = 0xffffff01 + 0xffffff01
; 有进位, C = 1
subs w0,w0,#0xff

将减法转换成加法后运算。

C标志位可理解为两无符号数相加时,有进位则C=1。

溢出 V

对2进制补码表示的有符号数的加/减运算的溢出判断:

  • 两个正数(MSB都是0)相加,结果为一个负值(MSB为1)
  • 两个负数(MSB都是1)相加,结果为一个正值(MSB为0)

处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志C;根据是否超出有符号数的范围设置溢出标志V。

练习

答案
  1. A

  2. C

      0x 7fffffff		正数,最高位为0,0111
    + 0x 00000001
    ---------------
    0x 8ffffff0 最高位溢出,符号位变成1(有符号)
    但最高位为0+1=1,未进位(无符号)

存储器系统

  • 标准的ARM字是32位长,每个字分为4个8位字节,或2个16位半字
  • 字总是以4字节边界对准,半字则以偶数字节的边界对准
  • ARM允许按字节寻址,每个地址对应一个字节,而不是一个字
  • ARM使用232个8位字节的地址空间,字节地址从0到232-1

大小端

  • 大端存储中,数据的高位字节(最高有效字节)保存在内存的低地址处,而低位字节(最低有效字节)保存在高地址处。
  • 小端存储中,数据的低位字节保存在内存的低地址处,而高位字节保存在高地址处。

对于半字,寻址需要和两字节进行对齐。

内存地址 | 存放内容    内存地址 | 存放内容
-----大端存储-----|-------小端存储------ 0x12345678
0x4000 | 0x12 | 0x4000 | 0x78 |
0x4001 | 0x34 | 0x4001 | 0x56 |
0x4002 | 0x56 | 0x4002 | 0x34 |
0x4003 | 0x78 | 0x4003 | 0x12 |
答案
0x4003 0x4002 0x4001 0x4000 C
0x78 0x56 0x34 0x12

0x1003 0x1002 0x1001 0x1000 CD
0xba98 0xfedc