Arm汇编第一讲Arm寄存器与七种模式两种状态
Arm学习第一讲 Arm寄存器与模式
一丶Arm寄存器
1.1 什么是寄存器
寄存器(register) 学过windows逆向的都知道.在汇编中同样有寄存器的概念. 寄存器是CPU的一个组成部分,里面放着指令丶数据丶和地址等相相关资源给CPU使用. 而他们的速度是很快的. 在windows x86汇编下. 速度分别就是
eax > ecx > ebx > edx ... 等. 寄存器速度比内存块. 又分为通用寄存器.以及专用寄存器.
- 通用寄存器
通用寄存器一般看名字就知道是通用的.它的功能就是完成通用的就算功能,谁都可以使用.
- 专用寄存器
专用寄存器一般特征有特别用处的寄存器. 如: 记录状态的状态寄存器 记录下一条执行指令的寄存器. 栈寄存器等. 是不可以随便修改的.
二丶Arm寄存器运行模式
2.1 Arm寄存器运行模式
在学习Arm汇编的时候.首先说一下Arm寄存器的运行模式,为什么要说一下运行模式. 原因在于Arm寄存器在各个模式下有单独的不同的名字以及含义.这个需要了解.
- 用户模式(USR)
Arm处理器正常的程序执行状态,在windows中我们就理解为是应用程序.是ring3程序
- 快速中断模式(FIQ)
高速数据传输或者通道处理
- 外部中断模式(IRQ)
通用的中断处理,一般就是系统发生中断的时候,Arm所运行的环境.
- 管理模式(SVC)
操作系统使用的保护模式
- 数据访问终止模式(ABT)
当数据或者指令预取终止的时候进入该模式,可用于虚拟存储以及存储保护.
- 系统模式(SYS)
运行具有特权的操作系统任务 相当于内核模式. x86下的ring0
- 未定义指令终止模式(UND)
当未定义的指令执行的时候进入该模式
以上数据模式 暂时只需要了解USR即可.
2.2Arm中寄存器介绍
在Arm汇编中.有 37个寄存器 其中 31个通用的. 6个状态寄存器
然后在31 个通用寄存器中又分为 未分组寄存器 和分组寄存器
- 未分组寄存器
见名之意 未分组的意思在各个运行模式下都是可以使用的.通用的寄存器.
他们分别是 R0~R7
- 分组寄存器
所谓分组寄存器,指的就是在不同的模式下有不同的寄存器
例如sp_und 而在abort(ABT) 模式下就叫做 sp_abt,反正就是进入不同的模式下会自动进行切换.
而R8-R12 寄存器很特殊,只有在快速模式下(FIQ)名字才不一样
- R13寄存器
R13寄存器一般称为栈指针,在用户模式与系统模式下 一般就代表SP栈顶指针的意思 而在其它模式下
则叫做sp_x 这里的后缀 X 特指某一种模式下的后缀名. 如在UND模式下. 那么就叫做sp_und
在FIQ模式下就叫做 sp_FIQ
- R14寄存器
R14寄存器也叫作LR寄存器(链接寄存器) 通常作用就是保存子程序或者中断的返回的地址.
除了 USR(用户模式) 和 SYS(系统模式) 其它模式都叫做LR_X (x还是特指的意思)
- R15寄存器(PC)
R15寄存器也叫作PC寄存器 总是执向正在取值的指令. 学过x86汇编的应该知道.这个
寄存器就类似于x86平台下的EIP寄存器
- CPSR(状态寄存器)
当前程序状态的CPSR寄存器. 类似于x86下的EFLAGS寄存器
2.3各个模式下的一览图
下列表格就代表各个平台下的寄存器名称.可做参考.
系统和用户模式 | 管理模式 | 终止模式 | 中断模式 | 未定义模式 | 快速中断模式 |
---|---|---|---|---|---|
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8_FIQ |
R9 | R9 | R9 | R9 | R9 | R9_FIQ |
R10 | R10 | R10 | R10 | R10 | R10_FIQ |
R11 | R11 | R11 | R11 | R11 | R11_FIQ |
R12 | R12 | R12 | R12 | R12 | R12_FIQ |
R13_SP | R13_SVC | R13_ABT | R13_IRQ | R13_UND | R13_FIQ |
R14_LR | R14_SVC | R14_ABT | R14_IRQ | R14_UND | R14_FIQ |
R15(PC) | R15(PC) | R15(PC) | R15(PC) | R15(PC) | R15(PC) |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR_SVC | SPSR_ABT | SPSR_IRQ | SPSR_UND | SPSR_FIQ |
2.54状态寄存器
状态寄存器,一般就是保存程序执行过程中的一些状态. 比如 计算是否进位. 是否溢出.等.
状态寄存器如下表示
|N|Z|C|V|.......|I|F|T|MODE|
状态寄存器只用到了 0-4位(MODE0 4-8位(IFT) 以及28-31位(NZCV n是第31位)
0-4位称为ModeBits 是用来定位我们的CPU所运行的模式
4 - 8 表示 打断标志位(Interrupt Disable bits) 表示是否关中断
作用如下
Interrupt Disable bits | 作用 |
---|---|
I | 7位: 如果为1则表示关闭IRQ |
F | 6位: 如果F = 1则表示关闭FIQ |
其中比较特殊的就是第五位 T
如果T = 1 则表示我们的程序运行在 Arm状态
如果T = 0 则表示我们的程序运行在 thumb状态
下面会说明什么是Arm状态,什么是Thumb状态
其中第28-31位 表示条件代码状态标志位作用如下
Condition Code Flags(条件代码标志) | 位数以及作用(31-28位) |
---|---|
N (Negative result from ALU flag) | 31位: 表示运算结果是否为负.为负数则是1 否则就是0 |
Z (Zero result from ALU flag) | 30位: 表示运算结果是否为0.如果为0就是1 否则就是0 |
C (ALU operation Carried Out) | 29位: 表示进位标志 加减运算有没有进位有就是1否则就是0 |
V (ALu operation oVerflowed) | 28位: 表示溢出位. 计算结果有没有溢出,溢出了就是1否则就是0 |
2.4 Arm运行状态 Arm&Thumb状态
在Arm汇编中,他有七种运行模式 两种运行状态
两种运行状态分别是 ARM 以及 Thumb状态
- Thumb状态
这个状态是16位指令 也就是2个字节 ArmV4版本后,假如的一种16位指令模式. 可以看做是ARM指令压缩形式的子集,具有16位的代码密度(也就是2个字节指令长度),但是只能是支持通用功能,必要的时候仍然需要ARM 指令.
而Thumb-2 技术则扩充了受限的16位thumb 指令集. 以及额外的32位指令,使指令集的使用更加广泛.
下面是两种状态下寄存器的对应表
Thumb状态 | Arm状态 |
---|---|
R0-R7(通用寄存器)与ARM相等 | R0-R7 |
CPSR (同上) | CPSR |
FP(栈底指针) | R11(栈底指针) |
IP | R12 |
SP(栈顶) | R13 |
LR(保存返回地址指令) | R14 |
PC(当前指令) | R15 |