分类:
2008-03-19 20:15:46
LDR pc, (Vect_Table) -> 把INTIAL的地址赋给PC
LDR pc, (Vect_Table + 4) -》 把undefvec的地址赋给PC
PC的具体值,依赖于INITIAL和undefvec在那里定义的。
简单的方法是,你把代码用AXD编译一下,看反汇编你就知道了。
A2: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呢????
通常来说CPU遇到异常时会从0x00000000或0xFFFF0000的地址来取Vector Table(取决于CP15的配置),这是硬件自动完成的。所以按照你的问题,既然程序初始化会把Vector table拷贝到0地址,那么CPU应该从0地址取Vect_Table。
LDR pc, (Vect_Table)
就是把地址0x00000020地址中的数据作为PC指针,就是一条跳转指令
2。ARM指令LDR和ARM伪指令LDR区别
chinaunix网友2008-03-19 20:23:01
程序相对偏移: 程序相对偏移是前索引形式的另一个版本。汇编器由PC寄存器计算偏移量,并将PC寄存器作为Rn生成前索引指令。不能使用后缀“!” 指令举例如下: LDR Rd,label ;label为程序标号。label必须是在当前指令±4 KB范围内 后索引偏移: Rn的值用做传送数据的存储地址。在数据传送后,将偏移量与Rn相加,结果写回到Rn中。Rn不允许是R15。 指令举例如下: LDR Rd,[Rn],#0x04 地址对齐——大多数情况下,必须保证用于32位传送的地址是32位对齐的。