您好、欢迎来到现金彩票网!
当前位置:双彩网 > 向量指令 >

ARM异常向量表中LDR指令、LDR伪指令的来龙去脉

发布时间:2019-06-16 20:10 来源:未知 编辑:admin

  (或者称为中断向量表)处在一个关键的位置,因为它控制了ARM芯片复位时的跳转地址,也即是调到哪里去执行启动代码。一般来说,异常向量表的形式如下

  在编译链接时,将此异常向量表安排到地址0处,芯片复位后PC == 0,便执行 LDR pc, =resetHandler 这条跳转指令,转而执行启动代码。若发生其他异常或者中断时,PC被硬件强制赋值为 0x0000 00XX,也是取异常向量表中的跳转指令执行,转而执行对应的异常或者中断处理例程。

  但仔细观察会发现,复位异常和其他的异常不同。复位异常使用伪指令 LDR pc, =resetHandler,而其他异常则使用LDR指令。为什么?

  ARM伪指令不是真正的指令,伪指令在真正编译链接后,会被一条真实的ARM指令代替。

  如果是LDR RX, label的形式,按照ARM官方文档的说法,LDR指令的内存操作地址是在PC的基础上加上指令中的立即数偏移得到,如果要访问的内存离当前PC太远,则LDR指令就无能为力了,因为LDR指令中只有12bit来存放偏移地址,太远或者不适合移位形成的偏移量不能用LDR指令。

  LDR指令在执行时,必定会访问内存,访问内存就需要地址,如上面的R1寄存器给出的地址、label常数作为的地址等。LDR指令执行完之后,PC的值等于label地址指向的内容。

  2)LDR伪指令则是将一个数赋给寄存器。LDR伪指令是将一个寄存器等于某个值,这个值可以来源于指令中包含的立即数,也可以来源于一个内存位置存放的内容。当要赋予的值可以用ARM指令的立即数表示时,LDR伪指令用MOV指令代替,否则LDR伪指令用LDR指令代替。LDR伪指令的一般形式:

  LDR R0,=0x01这条伪指令可以用MOV指令代替,因为要赋予的常数0x01可以包含在MOV指令的立即数中。而LDR PC, =label则不一定是用MOV指令来实现,因为label是一个地址常数,通过指令中12bit立即数移位的方式不一定能形成。若MOV指令不能实现,则用LDR指令来实现,实现的过程如下图

  :即先使用PC+偏移量作为地址访问内存,将此地址的内存加载到目标寄存器中(PC寄存器)。当然,指定地址处的内存必须包含正确的值,编译器自动在这个地址中写入正确的label值。

  所以,LDR伪指令可以实现将任何32bit的数装入目标寄存器,并且在伪指令LDR PC, =label中执行之后,PC的值就是label的值。

  LDR PC, =label伪指令,可以实现任何地址的跳转,执行后,直接跳转到label处执行;

  LDR PC, label指令,执行后是将label地址处的内容(跳转地址)装入PC,所以LDR指令常常配合DCD使用。但也可以实现任何地址的跳转。

http://bluecaleel.com/xiangliangzhiling/178.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有