### ARM经典300问知识点解析 #### 第1章 体系结构 **知识点一:处理器初始模式** 在ARM体系结构中,当系统复位时,CPU会进入一个特定的工作模式,通常称为“复位模式”或者更准确地说是“管理模式”。这种模式允许执行一些关键的初始化任务,比如设置中断向量表、配置内存映射等。 **问题**:请问在初始化CPU堆栈的时候一开始在执行`mov r0, LR`这句指令时处理器是什么模式? **答案**:此时处理器处于复位后的模式,即管理模式。在这个模式下,可以进行系统的初始化工作,并且可以通过修改CPSR(Current Program Status Register)寄存器来切换到其他模式。 **知识点二:MOV指令中的8位立即数** 在ARM体系结构中,为了节省指令空间,某些指令(如MOV)支持特殊的立即数格式。这种格式允许使用8位的立即数通过循环移位形成更复杂的32位立即数。 **问题**:请教:MOV中的8位图立即数,是怎么一回事?0xF0000001是怎么来的? **答案**: 1. **8位图立即数**:这是一种特殊的立即数形式,允许使用8位的值通过循环移位来形成更复杂的32位值。这样的设计主要是由于指令长度的限制,不可能直接在32位的指令中包含完整的32位立即数。 2. **0xF0000001**:这个值是通过将8位的值0x1F(即31)进行循环右移4位得到的。具体来说,0x1F表示的是二进制形式下的`00011111`,经过4位的循环右移后变为`11111000`,再将其扩展为32位即为`11111000000000000000000000000001`,即0xF0000001。 **知识点三:合法与非法的8位位图立即数** 为了确保指令的紧凑性和有效性,ARM体系结构规定了一些规则来定义哪些立即数是合法的,哪些是非法的。 **问题**:即常数是由一个8位的常数循环移位偶数位得到,这句话如何理解?该常数必须对应8位位图,既然是8位位图,那么取值为0-255,怎么0x3FC这种超出255的数是合法常量呢? **答案**: 1. **理解8位位图立即数**:8位位图立即数是指一个8位的数值通过循环移位偶数位形成的立即数。这种立即数可以在32位的指令中使用,但其值是由8位的基本单位通过循环移位得到的。 2. **合法与非法常量的区分**:合法的8位位图立即数是由一个8位的数值通过循环移位偶数位得到的。例如,0x3FC是由0xFC(即252)循环移位得到的,因此是合法的;而0x1FE不是由任何8位值循环移位得到的,因此是非法的。 3. **例子说明**:如0xF0000000、0xF0000001是合法的,因为它们都可以由8位的值循环移位得到,而0xF0000010则是非法的,因为它不能由8位的值通过循环移位偶数位得到。 **知识点四:LDR指令的寻址方式** 在ARM体系结构中,LDR指令用于加载数据到寄存器。它支持多种寻址方式,包括预索引和后索引。 **问题**:对于汇编语句LDR R0, [R1], #−4,是先将R1的值减4结果存入R1,然后读取R1所指单元的值到R0,还是先读取R1到R0,然后再将R1减4结果存入R1? **答案**:LDR R0, [R1], #−4 是后索引方式。这意味着首先读取R1指向的内存单元的内容到R0,然后更新R1的值(即R1 = R1 - 4)。这种方式适用于连续读取内存区域的情况。 **知识点五:处理器模式标识** 在ARM体系结构中,处理器的工作模式是可以通过程序访问的,这对于确定程序执行上下文非常重要。 **问题**:在程序移植的过程中,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别“代码段处于什么样的模式”? **答案**:可以通过读取CPSR(Current Program Status Register)寄存器来确定当前处理器的工作模式。任何时候都可以读取CPSR寄存器,从而获知当前的处理器模式。 **知识点六:保护寄存器的选择** 在ARM体系结构中,当发生模式转换时,某些寄存器会被自动保存到堆栈中以保护当前状态。 **问题**:为什么保护现场时,总是保护R0-R3,R12,为什么不保护R4-R11? **答案**:根据ARM Thumb过程调用标准,通常只保护R0-R3和R12。这是因为R0-R3常常用于函数参数传递和返回值,而R12用作子程序链接寄存器。至于R4-R11,则被认为是在调用过程中可以被重写,因此不进行保护。 **知识点七:MOV指令操作数限制** 在ARM汇编程序中,某些指令(如MOV)对操作数有一定的限制。 **问题**:请问mov R1, #0x00003DD0错误:out of the range of operation是怎么回事? **答案**:MOV指令的操作数为8位位图数。由于0x00003DD0不能通过8位位图数通过循环移位得到,因此会导致超出操作范围的错误。如果需要使用更大的立即数,可以考虑使用LDR指令或者其他方法。 **知识点八:“用户可见”寄存器的理解** 在ARM体系结构中,存在一系列寄存器,其中一部分被称为“用户可见”。 **问题**:“用户可见”应该怎样理解?这37个寄存器是否是37个不同的物理寄存器,例如R8与R8_fiq应该是两个不同的物理寄存器吧? **答案**:用户可见寄存器是指用户可以通过程序操作的寄存器。在ARM体系结构中,R8与R8_fiq确实是两个不同的寄存器,它们分别用于不同的处理器模式。每个模式拥有一组独立的寄存器,这些寄存器在不同的模式下具有不同的名称。 **知识点九:不同模式的限制** ARM体系结构支持多种处理器模式,每种模式都有其特定的功能和限制。 **问题**:USR模式,SVC模式,IRQ模式分别有哪些限制? **答案**: 1. **USR模式**:用户模式下不能设置CPSR寄存器,代码可以为ARM或Thumb。 2. **SVC模式**:监督模式,用于操作系统核心处理,具有较高的权限。 3. **IRQ模式**:中断模式,用于处理外部中断。对于外设操作的限制与具体的芯片设计有关。 **知识点十:初始化堆栈与工作模式的关系** 在初始化堆栈时,可以通过设置CPSR寄存器来决定处理器的初始工作模式。 **问题**:请问“在初始化堆栈时就决定了工作模式”是什么意思?如何决定工作模式的? **答案**:初始化堆栈时,可以通过设置CPSR寄存器来确定处理器的初始工作模式。例如,将CPSR设置为特定值可以确保处理器启动时处于特定的模式,如管理模式。 **知识点十一:文字池的概念** 在ARM汇编程序设计中,经常提到“文字池”的概念。 **问题**:请问ARM汇编程序设计中所谓的“文字池”作何理解? **答案**:文字池可以理解为一个常量数组,其中保存了程序运行时需要使用的常量,包括普通的数值和地址。这些常量可以通过LDR指令加载到寄存器中使用。 **知识点十二:中断向量表的实现** 在ARM体系结构中,中断向量表用于快速定位异常处理程序的位置。 **问题**:为什么在中断向量表中不直接LDR PC,“异常地址”。而是使用一个标号,然有再在后面使用DCD定义这个标号? **答案**:LDR指令的跳转范围有限,通常只能跳转到当前PC的4kB范围内,而B指令可以跳转到32MB的范围内。在实际使用中,通过在LDR PC,“xxxx”这条指令附近使用一个标号,并在后面使用DCD定义这个标号来存储异常服务程序的地址,这样可以实现全范围的跳转。 这些知识点涵盖了ARM体系结构中的多个方面,包括处理器模式、指令操作数限制、中断处理等,对于理解和掌握ARM体系结构具有重要意义。
- 粉丝: 0
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Shell和Python的大数据0408班级保险项目设计源码
- 基于Vue.js的JavaScript家教网HTML前端设计源码
- 基于C语言的redis0.1版本设计源码解析与解读
- 基于JavaScript的图书管理系统设计源码
- 基于Python语言的Struts2安全漏洞扫描工具设计源码
- 基于ESP8266和Wi-Fi的超声波测距继电器自动控制小电器设计源码
- 基于Kotlin的安卓终端App设计源码
- 基于Html与Java融合的flower-tms花卉售后系统设计源码
- 基于PyQt5和数据库的人脸识别考勤打卡系统设计源码
- 基于Vue和JavaScript的某省汽车票订票助手前端页面设计源码