系统地看一遍这本书,对些知识点摘录
---2012年4月10日到12日
ARM处理器的7运行模式:
用户模式、系统模式、FIQ、IRQ、特权模式、数据访问中止模式、未定义指令中止模式
除了用户模式,其他6种模式为特权模式,程序可以访问所有系统资源,也可以进行处理器模式的切换。
处理器模式可以通过软件控制进行切换,也可以通过IRQ或异常处理过程进行切换。
寄存器:37个寄存器,31个通用寄存器,6个状态寄存器。
任意模式下,可见的寄存器包括15个通用寄存器(R0-R14),一个或两个状态寄存器及程序计数器PC。
通用寄存器:
未备份寄存器:R0-R7,,即共用寄存器,不同模式是同一寄存器
备份寄存器 :R8-R14,不同模式下不同
程序计数器 :PC(R15),不同模式下相同
R13常用作栈指针寄存器。
R14被用作连接寄存器:
*每一种处理器模式自己的物理R14中存放当前子程序的返回地址 。当通过BL或BLX指令调用
子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC时
子程序即返回。两种实现子程序返回的操作:
MOV PC, LR
BX LR
--------------
STMFD SP!,{<REGISTERS>,LR};在子程序入口时把PC保存到栈中
LDMFD SP!,{<REGSITERS>,PC};实现子程序返回,出栈
*当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要
返回的地址,对于有些异常模式,R14的值可能与返回的地址有一个常数的偏移量。
R14也可以作为通用寄存器使用。
关于PC的值:
由于ARm采用流水线机制,该值为当前指令地址值加8个字节。即对于ARM指令集
来说,PC指向当前指令的下两条指令的地址。
程序状态寄存器:
CPSR可以在任何模式下被访问。每一种异常模式下都有一个
专用的物理状态寄存器:SPSR(备份程序状态寄存器),当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。
在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。用户模式和系统模式没有SPSR。
CPSR和SPSR格式相同。
ARM体系3种方式控制程序的执行流程:
*ARM指令,4个字节;Thumb指令,2个字节。
*跳转指令:B--执行跳转操作;BL--在执行跳转操作的同时,保存子程序的返回地址;BX--在执行跳转操作的同时,根据目标
地址的最低位可以将程序状态切换到Thumb状态;BLX--跳转目标地址,保存子程序返回地址,根据目标地址最低位可以将程序
状态切换到Thumb状态。
*当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在当异常中断处理程序执行完后,程序
返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序
退出时,要恢复被中断的执行现场。
ARM体系的异常中断:
复位、未定义指令、软件中断、指令预取中止、数据访问中止、外部中断请求IRQ、快速中断请求FIQ
ARM处理器对异常中断的响应过程:
*将当前的CPSR内容保存到将要执行的异常中断对应的SPSR寄存器。
*设置当前CPSR中相应的位,使处理器进入相应的执行模式。
*将LR设置成返回地址。
*将PC设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序执行。
从异常中断处理程序返回:
*恢复被中断的程序处理器状态,即将SPSR寄存器的内容复制到CPSR中。
*返回到发生异常中断的指令的下一条指令处执行,即LR寄存器的值复制到PC中。
ARM存储器格式的大小端:
大小端:(大小端,会和具体的处理器架构、编译器有关)
小端存储:数据高位存放在高字节;低位存放在低字节
如:0x1234 low:0x34 high:0x12
数据从小到大,地址从低到高
大端存储:数据低位存放在高字节;高位存放在低字节
如:0x1234 low:0x12 high:0x34
数据从大到小,地址从低到高
判断大小端函数:
int checkCPU()
{
union
{
int a;
char b;
}c;
c.a=1;
return (c.b == 1);//小端返回TRUE,大端返回FALSE
}
ARM指令分类及其寻址方式:
跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常产生指令共6类。
数据处理指令操作数的具体寻址方式:
#<immediate>
<Rm>
<Rm>, LSL#<shift_imm>
<Rm>, LSL <Rs>
<Rm>, LSR#<shift_imm>
<Rm>, LSR <Rs>
<Rm>,ASR#<shift_imm>
<Rm>, ASR <Rs>
<Rm>, ROR#<shift_imm>
<Rm>, ROR <Rs>
<Rm>, RRX
字及无符号字节的Load/Store指令的寻址方式:
ARM有两大类的Load/Store指令:一类用于操作32位字类型数据以及8位无符号的字节类型数据;另一类用于操作16位半字类型以及8位的有符号
字节类型的数据。
LDR{<cond>}{B} {T}<Rd>,<address_mode>
其中<address_mode>表示第2个操作数的内存地址,有9种方式:
[<Rn>, #+/-<offset_12>]
[<Rn>, +/-<Rm>]
[<Rn>, +/-<Rm>, <shift>#<shift_imm>]
[<Rn>, #+/-<offset_12>]!
[<Rn>, +/-<Rm>]!
[<Rn>, +/-<Rm>, <shift>#<shift_imm>]!
[<Rn>], #+/-<offset_12
[<Rn>], +/-<Rm>
[<Rn>], +/-<Rm>, <shift>#<shift_imm>
操作半字