Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348855
  • 博文数量: 120
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-11 17:50
文章分类

全部博文(120)

文章存档

2008年(120)

我的朋友

分类:

2008-03-19 20:15:46

1。关于 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 指令的这样用法呢?
====
A1:

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区别

伪指令LDR{cond} register, ={expr|label-expr}
expr为32为常量。编译器根据expr的取值情况来处理这条伪指令:
1)、当expr表示的地址没有超过mov或mvn指令中地址的取值范围时,编译器用合适的mov指令或mvn指令代替该LDR伪指令。
2)、当expr表示的地址超过了mov或mvn指令中地址的取值范围时,编译器将该常数放在缓冲区中,同时用一条基于PC的LDR指令读取该常数。
 
 
3。AXD调试时如何复位?
File->Reload Current Image
 
 
阅读(1150) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

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位对齐的。