### ARM经典300问知识点解析 #### 第1章 体系结构 **知识点一:处理器初始模式** **问题描述:** 在初始化CPU堆栈时,当执行`mov r0, LR`这句指令时,处理器处于哪种模式? **知识点解析:** 当系统复位后,ARM处理器会自动进入复位模式(Reset Mode),这是一种特定的工作模式,主要用于系统的启动和初始化。在这种模式下,处理器执行第一条指令通常是跳转到复置向量指向的位置,开始系统的初始化过程。因此,在执行`mov r0, LR`时,处理器正处在复位后的模式,也就是**管理模式**(Supervisor Mode)。管理模式是一种特权模式,允许访问所有的系统资源,非常适合进行系统初始化等关键操作。 **知识点二:MOV指令中8位图立即数的理解** **问题描述:** MOV指令中8位图立即数是什么含义?0xF0000001是如何构成的? **知识点解析:** 1. **8位图立即数概念:** 在ARM架构中,为了适应指令长度的限制(32位指令),MOV指令支持使用8位图立即数。这意味着指令中可以直接使用的立即数是通过对一个8位数(0-255)进行循环右移偶数位得到的。 2. **示例分析:** 0xF0000001可以由0x1F经过循环右移4位得到。具体步骤如下: - 0x1F (二进制: 00011111) - 循环右移4位: 00000001 11110000 (前8位) - 转换为十六进制: 0x1F000000 - 最终加上1(最末尾的1保持不变): 0x1F000001 - 因此,0xF0000001是合法的8位图立即数。 **知识点三:合法与非法常量的判断依据** **问题描述:** 如何理解“8位位图”?为什么某些值被认为是合法的,而其他值被认为是非法的? **知识点解析:** 1. **8位位图的理解:** 8位位图是指一个8位的值(0-255),通过对其循环移位偶数位可以得到一系列的值。这些值可以用于MOV指令的立即数中,以减少指令的编码长度。 2. **合法与非法常量的判断:** - 合法常量:0x3FC、0、0xF0000000、200、0xF0000001 - 0x3FC (二进制: 00000011111100) 可以通过0x3F (二进制: 000000111111) 左移4位得到; - 0xF0000000 (二进制: 11110000000000000000000000000000) 可以通过0xF (二进制: 1111) 循环右移28位得到; - 0xF0000001 (二进制: 11110000000000000000000000000001) 同上,只是最后加了1。 - 非法常量:0x1FE、511、0xFFFF、0x1010、0xF0000010 - 0x1FE (二进制: 000111111110) 无法通过8位数循环移位得到; - 0xFFFF (二进制: 1111111111111111) 也无法通过8位数循环移位得到; - 0x1010 (二进制: 0001000000010000) 也无法通过8位数循环移位得到; - 0xF0000010 (二进制: 11110000000000000000000000000010) 由于最低位为1且无法通过循环移位得到,故为非法。 3. **LDR指令操作理解:** 对于`LDR R0, [R1], #−4`指令,其操作顺序是先读取R1指向的内存单元的值到R0,然后再将R1的值减4并存回R1。这就是所谓的“后索引”寻址方式。 **知识点四:代码段的工作模式识别** **问题描述:** 在程序移植过程中,如何识别代码段处于何种模式? **知识点解析:** 识别代码段处于何种模式的方法之一是通过读取CPSR(Current Program Status Register,当前程序状态寄存器)。CPSR包含了当前处理器模式的信息,可以通过读取CPSR来确定当前所处的模式。 **知识点五:保护寄存器的选择** **问题描述:** 在保护现场时,为什么选择保护R0-R3, R12,而不保护R4-R11? **知识点解析:** 这种选择主要遵循的是**ARM/thumb过程调用标准**(Procedure Call Standard, PCS)。根据PCS,R0-R3通常用于传递函数参数,R12作为返回地址的备份。因此,在进入子函数之前,通常需要保护这些寄存器。而R4-R11被视为局部变量或者临时寄存器,它们的值可能会被子函数覆盖,因此通常不需要特别保护。 **知识点六:MOV指令操作数限制** **问题描述:** 为什么使用`MOV R1, #0x00003DD0`会遇到超出操作范围的错误? **知识点解析:** 在ARM架构中,MOV指令的操作数限制为8位图立即数。这意味着指令中可以直接使用的立即数是通过对一个8位数(0-255)进行循环右移偶数位得到的。0x00003DD0无法通过这种方式构造,因此该指令会报错。 **知识点七:用户可见寄存器的理解** **问题描述:** “用户可见”的含义是什么?37个寄存器是否代表37个不同的物理寄存器? **知识点解析:** “用户可见”意味着程序员可以通过程序直接访问这些寄存器。在ARM架构中,确实存在多个物理寄存器组(例如R8与R8_fiq),每个模式下的寄存器集都是独立的,因此R8与R8_fiq确实是两个不同的物理寄存器。 **知识点八:不同模式下的限制** **问题描述:** USR模式、SVC模式、IRQ模式各有哪些限制? **知识点解析:** 1. **USR模式(用户模式):** 用户模式下,代码可以是ARM或Thumb指令集,但不能直接修改CPSR寄存器。此外,没有SPSR寄存器。 2. **SVC模式(系统调用模式):** SVC模式通常用于处理系统调用,是一种特权模式,可以访问所有的系统资源。 3. **IRQ模式(中断模式):** 中断模式下,处理器禁止进一步的IRQ中断,以防止中断嵌套。同时,访问外设的能力可能受限于具体的硬件设计。 **知识点九:初始化堆栈与工作模式的关联** **问题描述:** 初始化堆栈时如何决定工作模式? **知识点解析:** 初始化堆栈时,可以通过设置CPSR寄存器来决定工作模式。在系统启动阶段,复位向量通常会包含设置CPSR的指令,以确定后续执行代码的工作模式。 **知识点十:文字池的概念** **问题描述:** “文字池”在ARM汇编程序设计中的含义是什么? **知识点解析:** 文字池是一种存储常量的区域,这些常量可以是普通的数值,也可以是地址。在ARM汇编程序中,文字池用于存放那些不会改变的值,这些值可以被指令直接引用,以提高代码的效率和可读性。 **知识点十一:中断向量表中LDR PC的使用** **问题描述:** 为什么在中断向量表中使用标号而不是直接LDR PC? **知识点解析:** 使用标号的主要原因是LDR指令的跳转范围有限(当前PC 4KB范围内),而B指令可以跳转到更大的范围(32MB)。通过在LDR PC "xxxx"指令不远处使用"xxxx" DCD定义一个字,并在这个字中存放最终异常服务程序的地址,可以实现全范围跳转。 以上是基于给定文件的部分内容提取的关键知识点及其解析。
- 粉丝: 8
- 资源: 26
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 贪吃蛇方案设计的方法.zip
- 微信支付账单(20240731-20240731).zip
- minio20240920.tar
- 集成供应链(Integrated Supply Chain,ISC)核心业务流程再造,华为的最佳实践
- zabbix-server-pgsql-7.0-centos-latest.tar
- zabbix-web-apache-pgsql-7.0-centos-latest.tar
- Altium Designer 24.9.1 Build 31 (x64)
- 基于JAVA的人机对弈的一字棋系统设计与实现课程设计源代码,极大极小搜索和α-β搜索算法
- 电子回单_2024092100085000842531409053050071685353.pdf
- 背景:js多边形渐变网格背景插件效果演示