软件逆向工程原理与实践第3章ARM体系结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.状态寄存器 除通用寄存器之外的所有处理器状态都保存在状态寄存 器中。当前的处理器状态保存在当前程序状态寄存器 (Current Program Status Register, CPSR)中。此外,每一种异 常模式也拥有一个被保存程序状态寄存器(Saved Program Status Register, SPSR),该寄存器在异常发生的前一刻将 CPSR中的内容保存于其中。由于SPSR仅在异常模式下起作 用,因此用户模式USR和系统模式SYS下不存在SPSR寄存 器。某些文献中提到的应用程序状态寄存器(Application Program Status Register,APSR),可以看作CPSR中某些字段 的别名。
第3章 ARM体系结构 当前程序状态寄存器CPSR类似于x86/x64中的
EFLAGS/RFLAGS寄存器,可以在任意处理器模式下访问, 其内部结构如图3-1所示。以下分别介绍其中的重要标识位 含义。
图3-1 CPSR寄存器的内部结构
第3章 ARM体系结构
1) 条件代码标识位 CPSR中的条件代码标识位包括N(Negative)、Z(Zero)、 C(Carry)和V(oVerflow)。指令通过测试这些标识位的置位情 况,可以决定是否执行指令。 条件代码标识位不是在任意情况下都能够更改的。实际 上,ARM指令只会在以下更改条件满足的情况下,根据计 算结果对CPSR中的条件代码标识位进行更改:
以下将具体介绍重要的通用寄存器及状态寄存器的功能。 1.程序计数器 通用寄存器R15又称程序计数器(Program Counter,PC)。 由于ARM的流水线设计,该寄存器通常指向相对于当前被 执行的指令的两条指令之后,即,在ARM状态下,PC=当 前指令地址+8字节(两条ARM指令之后);在Thumb状态下, PC=当前指令地址+4字节(两条16位Thumb指令之后)。在 ARM状态下,代码可以直接读写PC寄存器。
第3章 ARM体系结构
第3章 ARM体系结构
3.1 ARM基本特性 3.2 ARM寄存器与数据类型 3.3 ARM指令集 3.4 思考与练习
第3章 ARM体系结构
3.1 ARM基本特性
在第二章中介绍的x86是一种复杂指令集计算(CISC, Complex Instruction Set Computing)体系结构,相比之下, ARM则是一种精简指令集计算(RISC,Reduced Instruction Set Computing)体系结构。与x86相比,ARM体现出以下体 系结构特征:
第3章 ARM体系结构
3.2.1 ARM寄存器 ARM的可见通用寄存器为16个,R0~R15,这些寄存
器可以被任意的非特权指令所使用。这些通用寄存器可以分 为三组:
(1) 未分组寄存器(unbanked register):R0~R7。这8个 通用寄存器,不管处在哪个处理器模式,都指向同样的32位 物理寄存器。
第3章 ARM体系结构
(1) 执行一个比较操作(CMN、CMP、TEQ或TST); (2) 执行某个算术运算操作、逻辑操作或移动操作,该 操作的目标寄存器不是R15。注意这些操作指令大多都存在 两个版本,一个是保持标识位的版本,一个是修改标识位的 版本。修改标识位的指令版本通常有一个后缀“S”。
第3章 ARM体系结构
第3章 ARM体系结构
Thumb指令集相对于ARM指令集受到以下两方面限制: (1) Thumb代码可能需要更多的指令完成同一项任务, 因此在需要最大化性能时,应优先使用ARM状态的指令; (2) Thumb指令集不包括一些异常处理指令,因此必须 使用ARM状态指令进行顶层的异常处理。
第3章 ARM体系结构
第3章 ARM体系结构
3.1.3 内存模型 ARM体系结构采用单一的平面内存模型,地址范围为
0~232-1。这一地址空间可以被看作230个32位字,每个字的 地址都是字对齐的,即地址可以被4整除;也可以将这一地 址空间看作231个16位的半字,每个半字都是半字对齐的, 即地址可以被2整除。一些ARM体系结构还向后兼容早期的 226字节地址空间。
第3章 ARM体系结构
(2) 分组寄存器(banked register):R8~R14。这7个通用 寄存器,会根据当前的处理器模式,引用到不同的物理寄存 器。当我们需要使用某个具体的物理寄存器时,需要用更特 殊的名称去使用它们。
(3) 程序计数器(program counter):R15。
第3章 ARM体系结构
第Baidu Nhomakorabea章 ARM体系结构
3.2.2 数据类型 ARM的内存数据类型包含以下四种: (1) 字节(Byte):8位; (2) 半字(Halfword):16位; (3) 字(Word):32位; (4) 双字(DoubleWord):64位。
第3章 ARM体系结构
其中,半字必须与双字节界限对齐,字必须与四字节界 限对齐。需要注意的是,如果这些数据类型是无符号的,那 么N位的数据值的取值范围为0~2N-1,使用正常二进制表 示;如果这些数据类型是有符号的,那么N位数据值的取值 范围为 -2N-1~2N-1-1,使用二进制补码表示。加载和存储指 令能够将字节、半字或字数据在内存和寄存器之间移动,由 于寄存器是32位的,因此在从内存加载字节或半字数据时, 会自动进行高位零填充或高位带符号填充。
(3) C:该标识位存在四种置位方式。
第3章 ARM体系结构
① 对于加法和CMN指令,如果加法运算结果产生一个 进位(无符号上溢),则C置1,否则置0;
② 对于减法和CMP指令,如果减法运算结果产生一个 借位(无符号下溢),则C置0,否则置1;
③ 对于非加法、非减法指令,如果该指令配合移位操 作使用,则C置为最后一个被移位器移出的位;
第3章 ARM体系结构
第3章 ARM体系结构
除用户模式之外的其他模式均可称为特权模式。在这些 模式下,程序可以访问所有的系统资源,也可以自由地切换 模式。在这些特权模式中,FIQ、IRQ、SVC、ABT、UND 这五种模式合称为异常模式。只有在特定的异常发生时,才 能进入这五种模式。每一种异常模式都有一些额外的寄存器 以避免与用户模式状态产生冲突。异常的发生不会导致进入 另一个特权模式SYS。实际上,这一特权模式是用于执行需 要访问操作系统资源的特权任务的。在SYS特权模式下,能 够使用的寄存器与在用户模式下相同。
第3章 ARM体系结构
4) ARM/Thumb处理器状态位 ARM/Thumb处理器状态位T用于标识当前执行处于 ARM状态还是Thumb状态。当处于Thumb状态时,T置1; 当处于ARM状态时,T置0。修改此标识位能够实现ARM状 态和Thumb状态的切换。 5) 大小端序标识位 ARM可运行于大端序或小端序模式下。当标识位E置0 时,为小端序;当标识位E置1时,为大端序。ARM在多数 情况下使用小端序。
④ 对于非加法、非减法指令,且该指令没有配合移位 操作使用,则C不变。
第3章 ARM体系结构
(4) V:该标识位存在两种置位方式。 ① 对于加法或减法运算,如果发生了有符号的上溢, 则V置1; ② 对于非加法、非减法运算,V不变。
第3章 ARM体系结构
2) 中断禁止位 CPSR中存在两个中断禁止位I和F。当I置位时,禁止 IRQ模式下的中断;当F置位时,禁止FIQ模式下的中断。 3) 模式位 CPSR中存在5个当前处理器模式位M[4:0],用于指定当 前的处理器模式(USR、SVC等)。由于仅存在7个主要的处 理器模式,因此并非每一种模式位取值均对应合法的处理器 模式。典型地,USR的模式位为10000,SYS的模式位为 11111。
第3章 ARM体系结构
3.1.2 处理器状态 在ARM体系结构下,处理器状态特指由ARM指令集或
Thumb指令集所决定的状态。Thumb指令集是ARM指令集 的一个重编码的子集。Thumb状态指与Thumb指令集相对应 的处理器指令状态。在Thumb状态下,指令长度通常是 ARM状态下指令长度的一半,因此使用Thumb指令集通常 能够达到更高的代码密度(混合使用16位/32位指令的代码长 度短于全部使用32位指令的代码)。
第3章 ARM体系结构
ARM指令集的指令可支持寄存器保存以下类型的数据: 32位指针;无符号/有符号32位整数;无符号16位或8位整数 (高位0扩展);有符号16位或8位整数(高位符号扩展);2个16 位整数封入一个寄存器;4个8位整数封入一个寄存器;无符 号/有符号64位整数保存在2个寄存器中。
第3章 ARM体系结构
2.链接寄存器 通用寄存器R14又称链接寄存器(Link Register,LR), 该寄存器通常用于在函数调用中保存返回地址。一种常见的 情况是,BL指令在跳转之前将返回地址保存在该寄存器中, 即LR常保存BL指令的后一条指令的地址。典型的将R14寄 存器的内容存入PC寄存器的方法包括: (1) MOV PC, LR (2) BX LR (3) 如果被调用函数入口使用以下指令将R14的内容压 栈:
第3章 ARM体系结构
3.1.1 ARM的处理器模式 ARM有七种不同的处理器模式,具体如表3-1所示。模
式切换可由软件控制,或由外部的中断或异常处理引起。大 多数应用程序在用户模式下运行,当处理器处于用户模式时, 程序不能访问一些被保护的系统资源,也不能进行模式切换, 除非引起一个异常。处理器模式决定了运行于该模式下的程 序能够访问的寄存器集合。
(1) 指令集更小,同时提供更多的通用寄存器。
第3章 ARM体系结构
(2) ARM的内存访问方式与x86存在明显差别,使用加 载-存储(LDR/STR)的内存访问方式,而非x86广泛使用的 MOV指令。加载和存储的寻址均可由寄存器内容和指令域 决定。
(3) 统一而定长的指令域,能够简化对指令的解码。 (4) 在每一条数据处理指令中,同时考虑使用算数逻辑 单元(ALU)和移位器(shifter),最大化对ALU和移位器的使用。 (5) 引入了自增和自减寻址模式,简化程序循环的实现。 (6) 为增大数据吞吐率,允许加载和存储多条指令。 (7) 为增大执行吞吐率,所有指令均支持条件执行。
地址计算使用一般的整数指令计算。如果地址计算的结 果相对于地址范围而言出现了上溢或者下溢,则需要进行绕 回(wrap around),即地址计算结果需要模232。
第3章 ARM体系结构
3.2 ARM寄存器与数据类型
ARM具有31个通用寄存器,每个通用寄存器均为32位。 在任意时刻,其中的16个通用寄存器是可见的,其他的通用 寄存器用来加速执行处理。ARM还具有6个状态寄存器,这 些状态寄存器也是32位的,但实际上只使用其中的12位。 ARM数据类型则定义了指令所能操作的操作数的长度。
第3章 ARM体系结构
3.3 ARM指令集
STMFD SP!, {<其他寄存器列表>, LR} 那么使用以下指令从被调用函数返回: LDMFD SP!, {<其他寄存器列表>, PC}
第3章 ARM体系结构
3.栈指针 通用寄存器R13又称栈指针(Stack Pointer,SP),类似于 x86/x64的ESP/RSP,指向栈顶位置。
第3章 ARM体系结构
在符合条件代码标识位的更改条件时,各条件代码标识 位的设置操作如下。
(1) N:设置为指令运算结果的第31位(最高位符号位)。 如果指令进行有符号整数的补码运算,则当运算结果为负数 时,N置1;当运算结果为正数时,N置0。
(2) Z:如果指令的运算结果为0,则置1,否则置0。对 于比较运算指令,运算结果为0常代表比较结果为相等。
由于以上原因,Thumb指令必须与特定版本的ARM指 令配合使用。Thumb指令和ARM指令的助记符相同,在32 位Thumb指令后加.W后缀以示区分。
ARM核心启动时,多数情况进入ARM状态并保持在此 状态,直到显式或隐式地切换到Thumb状态。若当前程序状 态寄存器(CPSR)中的T标识位被置位,则处理器状态处于 Thumb状态。
第3章 ARM体系结构 当前程序状态寄存器CPSR类似于x86/x64中的
EFLAGS/RFLAGS寄存器,可以在任意处理器模式下访问, 其内部结构如图3-1所示。以下分别介绍其中的重要标识位 含义。
图3-1 CPSR寄存器的内部结构
第3章 ARM体系结构
1) 条件代码标识位 CPSR中的条件代码标识位包括N(Negative)、Z(Zero)、 C(Carry)和V(oVerflow)。指令通过测试这些标识位的置位情 况,可以决定是否执行指令。 条件代码标识位不是在任意情况下都能够更改的。实际 上,ARM指令只会在以下更改条件满足的情况下,根据计 算结果对CPSR中的条件代码标识位进行更改:
以下将具体介绍重要的通用寄存器及状态寄存器的功能。 1.程序计数器 通用寄存器R15又称程序计数器(Program Counter,PC)。 由于ARM的流水线设计,该寄存器通常指向相对于当前被 执行的指令的两条指令之后,即,在ARM状态下,PC=当 前指令地址+8字节(两条ARM指令之后);在Thumb状态下, PC=当前指令地址+4字节(两条16位Thumb指令之后)。在 ARM状态下,代码可以直接读写PC寄存器。
第3章 ARM体系结构
第3章 ARM体系结构
3.1 ARM基本特性 3.2 ARM寄存器与数据类型 3.3 ARM指令集 3.4 思考与练习
第3章 ARM体系结构
3.1 ARM基本特性
在第二章中介绍的x86是一种复杂指令集计算(CISC, Complex Instruction Set Computing)体系结构,相比之下, ARM则是一种精简指令集计算(RISC,Reduced Instruction Set Computing)体系结构。与x86相比,ARM体现出以下体 系结构特征:
第3章 ARM体系结构
3.2.1 ARM寄存器 ARM的可见通用寄存器为16个,R0~R15,这些寄存
器可以被任意的非特权指令所使用。这些通用寄存器可以分 为三组:
(1) 未分组寄存器(unbanked register):R0~R7。这8个 通用寄存器,不管处在哪个处理器模式,都指向同样的32位 物理寄存器。
第3章 ARM体系结构
(1) 执行一个比较操作(CMN、CMP、TEQ或TST); (2) 执行某个算术运算操作、逻辑操作或移动操作,该 操作的目标寄存器不是R15。注意这些操作指令大多都存在 两个版本,一个是保持标识位的版本,一个是修改标识位的 版本。修改标识位的指令版本通常有一个后缀“S”。
第3章 ARM体系结构
第3章 ARM体系结构
Thumb指令集相对于ARM指令集受到以下两方面限制: (1) Thumb代码可能需要更多的指令完成同一项任务, 因此在需要最大化性能时,应优先使用ARM状态的指令; (2) Thumb指令集不包括一些异常处理指令,因此必须 使用ARM状态指令进行顶层的异常处理。
第3章 ARM体系结构
第3章 ARM体系结构
3.1.3 内存模型 ARM体系结构采用单一的平面内存模型,地址范围为
0~232-1。这一地址空间可以被看作230个32位字,每个字的 地址都是字对齐的,即地址可以被4整除;也可以将这一地 址空间看作231个16位的半字,每个半字都是半字对齐的, 即地址可以被2整除。一些ARM体系结构还向后兼容早期的 226字节地址空间。
第3章 ARM体系结构
(2) 分组寄存器(banked register):R8~R14。这7个通用 寄存器,会根据当前的处理器模式,引用到不同的物理寄存 器。当我们需要使用某个具体的物理寄存器时,需要用更特 殊的名称去使用它们。
(3) 程序计数器(program counter):R15。
第3章 ARM体系结构
第Baidu Nhomakorabea章 ARM体系结构
3.2.2 数据类型 ARM的内存数据类型包含以下四种: (1) 字节(Byte):8位; (2) 半字(Halfword):16位; (3) 字(Word):32位; (4) 双字(DoubleWord):64位。
第3章 ARM体系结构
其中,半字必须与双字节界限对齐,字必须与四字节界 限对齐。需要注意的是,如果这些数据类型是无符号的,那 么N位的数据值的取值范围为0~2N-1,使用正常二进制表 示;如果这些数据类型是有符号的,那么N位数据值的取值 范围为 -2N-1~2N-1-1,使用二进制补码表示。加载和存储指 令能够将字节、半字或字数据在内存和寄存器之间移动,由 于寄存器是32位的,因此在从内存加载字节或半字数据时, 会自动进行高位零填充或高位带符号填充。
(3) C:该标识位存在四种置位方式。
第3章 ARM体系结构
① 对于加法和CMN指令,如果加法运算结果产生一个 进位(无符号上溢),则C置1,否则置0;
② 对于减法和CMP指令,如果减法运算结果产生一个 借位(无符号下溢),则C置0,否则置1;
③ 对于非加法、非减法指令,如果该指令配合移位操 作使用,则C置为最后一个被移位器移出的位;
第3章 ARM体系结构
第3章 ARM体系结构
除用户模式之外的其他模式均可称为特权模式。在这些 模式下,程序可以访问所有的系统资源,也可以自由地切换 模式。在这些特权模式中,FIQ、IRQ、SVC、ABT、UND 这五种模式合称为异常模式。只有在特定的异常发生时,才 能进入这五种模式。每一种异常模式都有一些额外的寄存器 以避免与用户模式状态产生冲突。异常的发生不会导致进入 另一个特权模式SYS。实际上,这一特权模式是用于执行需 要访问操作系统资源的特权任务的。在SYS特权模式下,能 够使用的寄存器与在用户模式下相同。
第3章 ARM体系结构
4) ARM/Thumb处理器状态位 ARM/Thumb处理器状态位T用于标识当前执行处于 ARM状态还是Thumb状态。当处于Thumb状态时,T置1; 当处于ARM状态时,T置0。修改此标识位能够实现ARM状 态和Thumb状态的切换。 5) 大小端序标识位 ARM可运行于大端序或小端序模式下。当标识位E置0 时,为小端序;当标识位E置1时,为大端序。ARM在多数 情况下使用小端序。
④ 对于非加法、非减法指令,且该指令没有配合移位 操作使用,则C不变。
第3章 ARM体系结构
(4) V:该标识位存在两种置位方式。 ① 对于加法或减法运算,如果发生了有符号的上溢, 则V置1; ② 对于非加法、非减法运算,V不变。
第3章 ARM体系结构
2) 中断禁止位 CPSR中存在两个中断禁止位I和F。当I置位时,禁止 IRQ模式下的中断;当F置位时,禁止FIQ模式下的中断。 3) 模式位 CPSR中存在5个当前处理器模式位M[4:0],用于指定当 前的处理器模式(USR、SVC等)。由于仅存在7个主要的处 理器模式,因此并非每一种模式位取值均对应合法的处理器 模式。典型地,USR的模式位为10000,SYS的模式位为 11111。
第3章 ARM体系结构
3.1.2 处理器状态 在ARM体系结构下,处理器状态特指由ARM指令集或
Thumb指令集所决定的状态。Thumb指令集是ARM指令集 的一个重编码的子集。Thumb状态指与Thumb指令集相对应 的处理器指令状态。在Thumb状态下,指令长度通常是 ARM状态下指令长度的一半,因此使用Thumb指令集通常 能够达到更高的代码密度(混合使用16位/32位指令的代码长 度短于全部使用32位指令的代码)。
第3章 ARM体系结构
ARM指令集的指令可支持寄存器保存以下类型的数据: 32位指针;无符号/有符号32位整数;无符号16位或8位整数 (高位0扩展);有符号16位或8位整数(高位符号扩展);2个16 位整数封入一个寄存器;4个8位整数封入一个寄存器;无符 号/有符号64位整数保存在2个寄存器中。
第3章 ARM体系结构
2.链接寄存器 通用寄存器R14又称链接寄存器(Link Register,LR), 该寄存器通常用于在函数调用中保存返回地址。一种常见的 情况是,BL指令在跳转之前将返回地址保存在该寄存器中, 即LR常保存BL指令的后一条指令的地址。典型的将R14寄 存器的内容存入PC寄存器的方法包括: (1) MOV PC, LR (2) BX LR (3) 如果被调用函数入口使用以下指令将R14的内容压 栈:
第3章 ARM体系结构
3.1.1 ARM的处理器模式 ARM有七种不同的处理器模式,具体如表3-1所示。模
式切换可由软件控制,或由外部的中断或异常处理引起。大 多数应用程序在用户模式下运行,当处理器处于用户模式时, 程序不能访问一些被保护的系统资源,也不能进行模式切换, 除非引起一个异常。处理器模式决定了运行于该模式下的程 序能够访问的寄存器集合。
(1) 指令集更小,同时提供更多的通用寄存器。
第3章 ARM体系结构
(2) ARM的内存访问方式与x86存在明显差别,使用加 载-存储(LDR/STR)的内存访问方式,而非x86广泛使用的 MOV指令。加载和存储的寻址均可由寄存器内容和指令域 决定。
(3) 统一而定长的指令域,能够简化对指令的解码。 (4) 在每一条数据处理指令中,同时考虑使用算数逻辑 单元(ALU)和移位器(shifter),最大化对ALU和移位器的使用。 (5) 引入了自增和自减寻址模式,简化程序循环的实现。 (6) 为增大数据吞吐率,允许加载和存储多条指令。 (7) 为增大执行吞吐率,所有指令均支持条件执行。
地址计算使用一般的整数指令计算。如果地址计算的结 果相对于地址范围而言出现了上溢或者下溢,则需要进行绕 回(wrap around),即地址计算结果需要模232。
第3章 ARM体系结构
3.2 ARM寄存器与数据类型
ARM具有31个通用寄存器,每个通用寄存器均为32位。 在任意时刻,其中的16个通用寄存器是可见的,其他的通用 寄存器用来加速执行处理。ARM还具有6个状态寄存器,这 些状态寄存器也是32位的,但实际上只使用其中的12位。 ARM数据类型则定义了指令所能操作的操作数的长度。
第3章 ARM体系结构
3.3 ARM指令集
STMFD SP!, {<其他寄存器列表>, LR} 那么使用以下指令从被调用函数返回: LDMFD SP!, {<其他寄存器列表>, PC}
第3章 ARM体系结构
3.栈指针 通用寄存器R13又称栈指针(Stack Pointer,SP),类似于 x86/x64的ESP/RSP,指向栈顶位置。
第3章 ARM体系结构
在符合条件代码标识位的更改条件时,各条件代码标识 位的设置操作如下。
(1) N:设置为指令运算结果的第31位(最高位符号位)。 如果指令进行有符号整数的补码运算,则当运算结果为负数 时,N置1;当运算结果为正数时,N置0。
(2) Z:如果指令的运算结果为0,则置1,否则置0。对 于比较运算指令,运算结果为0常代表比较结果为相等。
由于以上原因,Thumb指令必须与特定版本的ARM指 令配合使用。Thumb指令和ARM指令的助记符相同,在32 位Thumb指令后加.W后缀以示区分。
ARM核心启动时,多数情况进入ARM状态并保持在此 状态,直到显式或隐式地切换到Thumb状态。若当前程序状 态寄存器(CPSR)中的T标识位被置位,则处理器状态处于 Thumb状态。