您的位置 首页 设计

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

1、问题引出在ARM开发中,异常向量表(或者称为中断向量表)处在一个关键的位置,因为它控制了ARM芯片复位时的跳转地址,也即是调到哪里去…

1、问题引出

ARM开发中,反常向量表(或许称为中止向量表)处在一个要害的方位,由于它操控了ARM芯片复位时的跳转地址,也便是调到哪里去履行发动代码。一般来说,反常向量表的方法如下

Vector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. LDR pc, =resetHandler ; Reset LDR pc, Undefined_Addr ; Undefined instructions LDR pc, SWI_Addr ; Software interrupt (SWI/SYS) LDR pc, Prefetch_Addr ; Prefetch abort LDR pc, Abort_Addr ; Data abort B . ; RESERVED LDR pc, IRQ_Addr ; IRQ LDR pc, FIQ_Addr ; FIQ

Undefined_Addr: DCD Undefined_HandlerSWI_Addr: DCD SWI_HandlerPrefetch_Addr: DCD Prefetch_HandlerAbort_Addr: DCD Abort_HandlerFIQ_Addr: DCD FIQ_HandlerIRQ_Addr DCD IRQ_Handler

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

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

2、关于ARM伪指令

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

3、LDR指令和LDR伪指令的差异

1)LDR指令是将内存中的一个字加载到方针寄存器中,如

LDR R0,[R1] ;将R1指向内存的32bit加载到R0中

LDR R4,lable ;将地址label处的内存中的一个32bit的字加载到R4中,假如地址为label处的内容是0xFFFF 5555,则此指令履行后,R4 = 0xFFFF5555

假如是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伪指令的一般方法:

LDRR0,=0x01

LDRPC,=label

LDR R0,=0x01这条伪指令能够用MOV指令替代,由于要赋予的常数0x01能够包括在MOV指令的当即数中。而LDR PC, =label则纷歧定是用MOV指令来完成,由于label是一个地址常数,经过指令中12bit当即数移位的方法纷歧定能构成。若MOV指令不能完成,则用LDR指令来完成,完成的进程如下图

:即先运用PC+偏移量作为地址拜访内存,将此地址的内存加载到方针寄存器中(PC寄存器)。当然,指定地址处的内存有必要包括正确的值,编译器主动在这个地址中写入正确的label值。

所以,LDR伪指令能够完成将任何32bit的数装入方针寄存器,并且在伪指令LDR PC, =label中履行之后,PC的值便是label的值。

4、回到反常向量表

Vector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. LDR pc, =resetHandler ; Reset LDR pc, Undefined_Addr ; Undefined instructions LDR pc, SWI_Addr ; Software interrupt (SWI/SYS) LDR pc, Prefetch_Addr ; Prefetch abort LDR pc, Abort_Addr ; Data abort B . ; RESERVED LDR pc, IRQ_Addr ; IRQ LDR pc, FIQ_Addr ; FIQ

Undefined_Addr: DCD Undefined_HandlerSWI_Addr: DCD SWI_HandlerPrefetch_Addr: DCD Prefetch_HandlerAbort_Addr: DCD Abort_HandlerFIQ_Addr: DCD FIQ_HandlerIRQ_Addr DCD IRQ_Handler

LDR PC, =resetHandler 是将标号resetHandler的值(编译器编译时分配的地址值)载入PC,产生跳转,即跳转到resetHandler处履行;

LDR PC, XXXX_Addr 是将XXX_Addr处的内容载入PC,产生跳转,有必要拜访XXX_Addr地址的内存将跳转值取出。

5、总结:

LDR PC, =label伪指令,能够完成任何地址的跳转,履行后,直接跳转到label处履行;

LDR PC, label指令,履行后是将label地址处的内容(跳转地址)装入PC,所以LDR指令常常合作DCD运用。但也能够完成任何地址的跳转。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/276376.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部