《ARM体系结构与编程》学习摘录

本文详细介绍了ARM处理器的运行模式、寄存器组织、异常中断响应过程,以及存储系统中的Cache和写缓冲区机制。讨论了如何在汇编和C语言中处理异常中断,特别是SWI异常中断的使用和处理。此外,还涵盖了大小端存储、数据处理指令、Load/Store指令、跳转指令和批量Load/Store指令的寻址方式。通过对这些关键概念的阐述,读者能够对ARM体系结构和编程有更深入的理解。
摘要由CSDN通过智能技术生成

系统地看一遍这本书,对些知识点摘录

---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>

操作半字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值