这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» [求助] 关于 LDR Rd,label 的问题

共5条 1/1 1 跳转至

[求助] 关于 LDR Rd,label 的问题

菜鸟
2007-02-07 01:45:52 打赏
有个问题,希望大家能指点指点,谢谢先!

关于 LDR Rd,label

我在书上看到的解释是这样的:
程序相对偏移。程序相对偏移是前索引偏移形式的另一个版本。汇编器由PC寄存器计算偏移量,并将PC寄存器作为Rn生成前索引指令,不能使

用后缀"!"。

书上说的前索引偏移。 在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址。
LDR Rd, [Rn, #0x0x]!

然后,我在看了这样的代码的时候:

ENTRY
INT_Entry ; INT_Entry 的符号地址为 0x2000000
LDR pc, (Vect_Table) ; 该处地址为0x2000000
LDR pc, (Vect_Table + 4) ;
LDR pc, (Vect_Table + 8) ;
nop;
LDR pc, (Vect_Table +16) ;
LDR pc, (Vect_Table +20)
LDR pc, (Vect_Table +24) ; IRQ
LDR pc, (Vect_Table +28) ;

Vect_Table ; Vect_Table 的符号地址为 0x2000020
DCD INITIAL ; reset
DCD undefvec ; Undefined Instruction
DCD swivec ; Software Interrupt
DCD pabtvec ; Prefetch Abort
DCD dabtvec ; Data Abort
DCD rsvdvec ; reserved
DCD INT_IRQ ; reserved
DCD INT_FIQ ; reserved

我这样理解 LDR pc, (Vect_Table) 这一句了: 把地址( 0x2000000 + 0x2000020 )的值 给pc寄存器。

这样好像是不对的,该怎么理解 LDR 指令的这样用法呢?



关键词: 求助 关于 label 问题 Table

菜鸟
2007-02-07 22:54:00 打赏
2楼

LDR pc, (Vect_Table) -> 把INTIAL的地址赋给PC
LDR pc, (Vect_Table + 4) -》 把undefvec的地址赋给PC

PC的具体值,依赖于INITIAL和undefvec在那里定义的。

简单的方法是,你把代码用AXD编译一下,看反汇编你就知道了。


菜鸟
2007-02-07 23:21:00 打赏
3楼
谢谢 twentyone,
LDR pc, (Vect_Table) ; 我把它理解为把 Vect_Table 的第一项的值取来给PC,(即INTIAL的地址给PC)。

其实在这段代码之后,还会把这部分中断入口代码 copy 到 0地址处(包括Vect_Table部分)。

这样的话,memory里面,岂不是有两个Vect_Tale部分了, 我就困惑了:
LDR pc, (Vect_Table) 的时候它怎么知道是根据哪个 Vect_Table 呢,是根据0x000020处的Vect_Table呢,还是根据0x2000020处的Vect_Table呢????

菜鸟
2007-02-08 19:02:00 打赏
4楼

通常来说CPU遇到异常时会从0x00000000或0xFFFF0000的地址来取Vector Table(取决于CP15的配置),这是硬件自动完成的。所以按照你的问题,既然程序初始化会把Vector table拷贝到0地址,那么CPU应该从0地址取Vect_Table。

LDR pc, (Vect_Table)

就是把地址0x00000020地址中的数据作为PC指针,就是一条跳转指令


菜鸟
2007-04-01 00:35:00 打赏
5楼

呵呵,学东西中!!!

[em05]

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]