首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM寻址方式

ARM寻址方式

一  ARM的寻址方式


寻址:数据存放在哪里


[1]立即数寻址
[2]寄存器寻址
[3]寄存器移位寻址
[4]寄存器间接寻址
[5]基址变址寻址

<1>前索引

<2>后索引

<3>自动索引
[6]相对寻址
[7]多寄存器寻址
[8]堆栈寻址




二  CPSR/SPSR操作指令


[1]读CPSR/SPSR

MRS  r0,cpsr  =>r0   = cpsr


[2]写CPSR/SPSR
   MSR  cpsr,r0  =>cpsr = r0




思考:使能IRQ异常,其他位不变,如何操作?


MRS R0,CPSR


MOV r1,#1


BIC r0,r0,r1,lsl #7  @r0 = r0 & ~(r1 << 7)


MSR CPSR,R0



三  常用的ARM伪指令


伪指令不是ARM设计的指令,是编译器为了方便程序使用而设计的指令,编译器会对伪指令进行翻译,翻译成ARM核所能识别的指令


ldr r0,=0x12345678
含义:将0x12345678加载r0


ldr r0,=label
含义:
将标签表示的地址加载r0,(标签表示的地址受指定的代码运行地址影响 -Ttext = addr)


ldr r0,label
含义:
将标签表示的地址内容加载到r0


adr r0,label
含义:
在代码运行的时候,动态获取标签所在内存的地址(此时根据pc的值 +/- 偏移量得到标签所在的地址),
代码在不同的地方运行,获得的标签值不一样




四  ARM异常处理


1.异常产生的时候,ARM核自己做的事情

[1]保存CPSR到异常模式的spsr

[2]设置CPSR相应位

<1>进入ARM状态

<2>进入相应的异常模式

<3>禁用相应的中断(可选)

[3]保存pc到异常模式的lr

[4]将pc指向对应的异常向量


2.程序需要做的事情
  [1]编写异常向量表(一块内存,放了一些跳转指令)
  [2]告诉ARM核异常向量表所在的位置
      <1>ARM7/ARM9/ARM11  异常向量表可以存放在:0x0000 0000 或 0xffff 0000
      <2>cortex-A系列,异常向量表可以存放在任意位置,它有协处理器cp15的c12寄存器决定
  注意:ARM核从0x0000 0000地址寻找异常向量表
  [3]编写异常处理函数
   
  注意:
  异常处理函数应该做的事情
  [1]保存共用的寄存器的值  
  [2]做异常处理的事情
  [3]返回:恢复现场
  
<1>恢复保存的寄存器的值
  
<2>将异常模式的lr寄存器值赋值给pc
  
<3>恢复cpsr
返回列表