1)说出ARM可以工作的模式名字。
ARM有8个基本工作模式:
User :非特权模式,大部分任务执行在这种模式
FIQ :当一个高优先级(fast)中断产生时将会进入这种模式
IRQ :当一个低优先级(normal)中断产生时将会进入这种模式
Supervisor :当复位或软中断指令执行时将会进入这种模式
Abort :当存取异常时将会进入这种模式
Undef :当执行未定义指令时会进入这种模式
System :使用和User模式相同寄存器集的特权模式Cortex-A特有模式:
Monitor :是为了安全而扩展出的用于执行安全监控代码的模式;
\2) ARM核有多少个寄存器?
ARM处理器有16个通用寄存器,分别命名为R0-R15。
其中,R0-R12是通用寄存器
R13是堆栈指针寄存器(SP)
R14是链接寄存器(LR)
R15是程序计数器(PC)。以及不同模式下的状态寄存器CPSR
3)PC和LR寄存器的别名?
PC寄存器是程序计数器(Program Counter)的别名,用于存储当前正在执行的指令的地址。
LR寄存器是链接寄存器(Link Register)的别名,用于存储函数调用的返回地址。
\4) R13别名是什么?
R13寄存器的别名是SP(Stack Pointer),用于指向栈顶。
5)哪种模式使用的寄存器最少?
在ARM架构中,Thumb模式使用的寄存器数量相对较少。Thumb模式是一种16位指令集,相比于ARM模式的32位指令集,Thumb模式使用的寄存器数量减少了一半。
6)在Thumb 指令集中,哪些寄存器处于Low group?
R0-R7寄存器
7)CPSR的哪2位反映了处理器的状态?
CPSR的T位和J位反应了处理器的状态
0 0 ARM状态
1 0 Thumb 状态
1 1 ThumbEE 状态
8)所有的Thumb指令采取什么对齐方式?
Thumb指令集是一种16位的指令集,它采用了对齐方式为半字对齐(halfword alignment)。这意味着Thumb指令必须以2字节(16位)的边界对齐,即指令的地址必须是2的倍数。如果指令地址不是2的倍数,处理器会产生对齐异常。因此,在使用Thumb指令集编程时,需要确保指令的地址是2的倍数。
\9) ARM有哪几个异常源。
Prefetch about exception
Data about exception
Interrupt exception
10)ARM有哪几种异常模式。
Prefetch about mode
Data about mode
Interrupt mode
Fast interrupt mode
11)在复位后,ARM处理器处于何种模式、何种状态?
在复位后,ARM处理器处于特权模式(privileged mode)和初始状态(initial state)。在特权模式下,处理器可以访问所有的系统资源和指令,并执行特权级别的操作。初始状态下,处理器的寄存器和状态被初始化为默认值,等待执行第一条指令。处理器会根据启动配置和引导程序的设置来确定接下来的操作。
√1)哪些ARM指令可以有条件的执行?
EQ:相等 GT:大于 GE:大于等于 LT:小于 LE:小于等于
√2)下面的指令完成什么工作?
MOVNES r2,r3,ASR #2
前一条指令的结果不等于0的时候执行:将r3的值右移2位然后赋值给r2寄存器
ARM A9处理器总共40个寄存器,System模式下使用17个寄存器,SVC模式下使用18个寄存器。
\1) 异常向量表位于存储器的什么位置?
ARM异常向量表位于存储器的起始地址处,通常是在存储器的最开始的位置。
异常向量表的起始地址可以通过特定的寄存器(如CPSR或VBAR)来配置。
√2)IRQ或FIQ异常的返回指令是什么?
一般在异常处理函数中:
Irq_handler:
Stmfd sp!,{r0-r12,lr}
Bl do_irq
Ldmfd sp!,{r0-r12,pc}^
√3)什么类型的异常优先级最高?
Reset异常优先级最高
Data About
FIQ
IRQ
Prefetch About
SWI
Undefined instruction
√4)什么指令可以放在中断向量表?
存放的是异常处理函数的入口地址
√5) FIQ的什么特点使得它处理的速度比IRQ快?
A)FIQ的优先级比IRQ的优先级高
B)FIQ不用进行程序的跳转命令,而IRQ要进行跳转。因为FIQ异常处理函数位于异常向量表的最末,则处理FIQ的异常可以直接处理
C)FIQ有其他独立的寄存器
√6)在嵌套的中断处理程序中,如何确保LR没有被破坏?
\1. 在进入中断处理程序之前,将LR的值保存到一个临时变量中。这可以通过将LR的值压入堆栈或者保存到其他寄存器中来实现。
\2. 在中断处理程序中,尽量避免修改LR的值。如果需要修改LR,确保在返回之前将其恢复到之前保存的值。
\3. 如果在中断处理程序中需要调用其他子程序,确保在调用之前将LR的值保存到堆栈或其他寄存器中,并在返回之前将其恢复。
. 在进入中断处理程序之前,将LR的值保存到一个临时变量中。这可以通过将LR的值压入堆栈或者保存到其他寄存器中来实现。
\2. 在中断处理程序中,尽量避免修改LR的值。如果需要修改LR,确保在返回之前将其恢复到之前保存的值。
\3. 如果在中断处理程序中需要调用其他子程序,确保在调用之前将LR的值保存到堆栈或其他寄存器中,并在返回之前将其恢复。
\4. 在退出中断处理程序之前,将保存的LR值恢复到LR寄存器中,以确保正确的返回地址。