我在这里有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。
谢谢
答案 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
指令使用了错误的地址。
使用不同的寄存器,它应该可以工作。