1.ARM的7种工作模式:
User:用户模式,非特权模式;
FIQ:快速中断模式。高优先级中断
IRQ:中断模式。低优先级中断;
Supervisor:管理员模式(特权模式)。当复位或软中断指令执行时进入这种模式;(软中断:Software Interrupt,缩写即SWI,SWI指令,即软中断指令。是一种利用软件方式模拟硬件中断的机制,用于实现从用户模式(非特权模式)切换到特权模式(通常是管理模式或异常模式),并执行特权程序的过程。(执行一些需要特权才能完成的操作,如:系统调用))
Abort:数据中止模式。当存取异常时进入这种模式;
Undef:未定义指令模式。当执行未定义指令时进入此模式;
System:系统模式。使用和User模式相同的寄存器集的特权模式
2.ARM中,通用寄存器的数量37个32位的寄存器;Cortex体系结构下有40个32位的寄存器。
1个PC;(即:r15)
1个CPSR;
5个SPSR;
30个通用寄存器;(r0-r7:称为未分组寄存器,在所有运行模式下都指向同一个物理寄存器;r8 -r12:对应2个不同的物理寄存器;r13(sp)和r14(lr));
r13/r14/r15详解:
R13(SP)作为堆栈指针,用于管理栈的操作;R14(LR)作为链接寄存器,用于保存返回地址;R15(PC)作为程序计数器,用于存储下一条要执行的指令的地址。
R13(SP)、R14(LR)和R15(PC)是ARM架构中非常重要的寄存器,它们在程序执行、函数调用、返回和指令执行过程中扮演着关键的角色。这些寄存器在ARM架构的处理器中都是32位的,并且在处理器执行指令和程序时发挥着不可替代的作用。
3.ARM的异常向量表;(异常处理程序的地址的集合)
ARM的异常向量表是ARM处理器中用于处理各种异常情况的重要机制。它包含了一组异常处理程序入口地址的集合,用于处理处理器出现的各种异常情况。当异常事件发生时,处理器会跳转到相应的异常处理程序来进行处理,从而确保系统的稳定性和可靠性。
4.立即数是什么?如何判断是否为立即数?
立即数 = immed_8 循环右移 (2 * rotate_imm)
4.1 ARM中的立即数是通过一个8位的常数循环右移偶数位得到的。要判断一个数是否为立即数,需要将其转换为二进制,然后尝试找到一个8位的常数和循环右移的位数,使得通过循环右移偶数位后能够得到该数。如果这样的常数和位数存在,并且循环右移的位数是偶数,那么该数就是一个有效的ARM立即数。
4.2判断某数是不是12位立即数,12位立即数的条件是:
①如果某个数的数值范围是0~255之间,那么这个数一定是立即数;
②把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
③这个数的二进制序列的右边必须为偶数个连续的 0
4.3循环右移:
循环右移(Circular Right Shift)是二进制数操作中的一种位运算方式,它的核心思想是将一个二进制数的所有位向右移动指定的位数,同时将被移出的最高位(最左边的位)重新放到最低位(最右边的位)上,从而形成一个“循环”的效果。
以下是关于循环右移的详细解释:
定义
循环右移是一种二进制数的位运算,它将数值的每一位向右移动指定的位数,并将移出的最高位放回最低位,实现一个循环的移位效果。
操作过程
①确定移位位数:首先确定需要移动的位数n。
②准备数值:将要进行循环右移的二进制数准备好,假设它是一个32位的二进制数(在许多处理器中,整数通常是32位或64位)。
③执行循环右移:
将二进制数的最低n位存储起来,因为这些位将被移出。
将剩余的位向右移动n位,左侧空出的位用0填充(但这在循环右移中并不重要,因为这些位随后将被覆盖)。
将之前存储的最低n位放到移动后的二进制数的最高位(即最左边)。
示例
假设我们有一个8位的二进制数10101010(十进制的170),我们将其循环右移2位。
原始二进制数:10101010
最低2位(10)被移出并存储。
剩余的位(101010)向右移动2位,变为001010(注意左侧用0填充)。
之前存储的最低2位(10)放到最高位,得到10001010。
归纳
循环右移运算具有“循环”的特点,即移出的位会被重新放到另一边,这种特性使得它在某些算法和数据处理中非常有用。例如,在数据加密、图像处理和数字信号处理等领域,循环右移运算常被用作改变数据的位模式,以增加数据的复杂性、减少存储空间或提高信号的质量。
在编程实现上,循环右移可以通过位操作和逻辑运算来完成,具体实现方式可能因处理器架构和编程语言的不同而有所差异。但总体上,循环右移是一种高效的位运算方式,可以快速地处理大量数据。
5.常用汇编指令:4个,mov,mvn,add,ldr,
mov:传送字或字节;
mvn:反向传送,取反指令。将一个操作数的反码(即每一位都取反),传送到目标寄存器中。
add:加法,求和。用于将两个数求和并将结果存储在目标寄存器。
ldr:将内存中指定地址的数据加载到目标操作数中。例如,LDR R1, [R2] 表示将地址为R2的内存中的数据加载到寄存器R1中。
6.User模式下,使用的寄存器最少;
7.为什么FIQ的服务程序地址要位于0x1C?
FIQ(Fast Interrupt Request)是ARM架构中的一种快速中断请求,其服务程序地址位于0x1C的原因主要有以下几点:
①FIQ模式特性:ARM的FIQ模式提供了更多的banked寄存器(r8到r14以及SPSR),这些寄存器在FIQ模式切换时会被自动保存和恢复。相比之下,IRQ(Interrupt Request)模式就没有那么多banked寄存器,因此FIQ模式在处理中断时更加快速。
②中断向量表的位置:在ARM架构中,中断向量表是一个包含中断服务程序地址的表,用于在发生中断时跳转到相应的服务程序。IRQ的中断向量表地址通常位于0x18,而FIQ的中断向量表地址位于0x1C。
③直接执行与跳转:由于FIQ的中断向量表地址0x1C之后没有其他的中断向量表,这意味着FIQ的中断服务程序可以直接放在0x1C处,而不需要额外的跳转指令。相比之下,IRQ的中断向量表地址0x18之后还有其他的中断向量表,因此IRQ的中断服务程序通常需要通过跳转指令来执行。
④性能考虑:由于FIQ模式提供了更多的banked寄存器,并且在处理中断时不需要额外的跳转指令,因此FIQ中断的处理速度通常比IRQ中断更快。将FIQ的服务程序地址放在0x1C处,有助于进一步提高FIQ中断的处理效率。
综上所述,FIQ的服务程序地址位于0x1C主要是基于ARM架构的FIQ模式特性、中断向量表的位置、直接执行与跳转的性能考虑等多方面因素综合考虑的结果。