PowerPC加载方法地址来自内存中的已知地址并调用该方法

时间:2014-08-05 11:59:58

标签: c powerpc

我在这里有MPC5668G。从引导加载程序中的asm代码我想跳转到主程序的主程序,它们是独立生成的。因此,我使用了一些编译指示和链接器将主方法的地址(无论它链接到哪里)放到内部闪存的末尾。那将是0x001FFFFC。

我如何尝试调用此主要方法。

我想我只是遗漏了一些东西,但不知何故加载指令失败了......或者做错了什么。

我这样做:

e_lis  r0, 0x001F
e_or2i r0, 0xFFFC
e_lwz  r3, 0(r0)

我可以看到寄存器和内存,一切看起来都不错,但是

e_lwz  r3, 0(r0)

只是将FFFFFFFF加载到r3(而不是0x80810,这是main的地址和内存中地址0x001FFFFC的值)。

知道为什么吗?

第二个问题,那么如何调用该方法呢?

MPC5668G的BAM使用LR寄存器和blr分支到启动代码......这是正确的方法吗?

原始代码(作为启动代码和仍然链接在一起的主程序)使用

e_bl main

直接调用main。

谢谢

2 个答案:

答案 0 :(得分:2)

PowerPC User Instruction Set Architecture Book 1中,lwz定义为:

lwz RT,D(RA)

lwz的文字说:

  

让有效地址(EA)为和(RA | 0)+ D.   EA处理的存储加载到RT32:63。 RT0:31设置为0.

该文本,特别是" RA | 0"基本上说如果值RA为零,则不将其视为寄存器0,将其视为零值。否则,它被视为编号寄存器。对于使用" RA"。

的任何加载指令,这是一个重要的事情

这在定义和符号中进一步阐述:

  

(RA | 0)表示RA字段具有该值的寄存器RA的内容   1-31,如果RA字段为0,则为0。

因此,在示例中将r0替换为另一个寄存器以解决问题。

答案 1 :(得分:1)

当用作相对加载或存储操作的基础时,寄存器r0的值始终为零(没有用于加载/存储的操作码和绝对地址)。因此,lwz指令使用了错误的地址。

使用不同的寄存器,它应该可以工作。