gpt4 book ai didi

c - PowerPC 从内存中的已知地址加载方法地址并调用该方法

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:38 28 4
gpt4 key购买 nike

我这里有一个 MPC5668G。我想从引导加载程序中的 asm 代码跳转到独立生成的主程序的主例程。因此,我使用一些编译指示和链接器将 main 方法(无论它链接到哪里)的地址放到内部闪存的末尾。那将是 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。

谢谢

最佳答案

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

lwz RT,D(RA)

lwz 的文本说:

Let the effective address (EA) be the sum (RA|0)+ D. The word in storage addressed by EA is loaded into RT32:63. RT0:31 are set to 0.

文本,特别是“RA|0”,基本上是说如果 RA 的值为零,则不将其视为寄存器 0,而是将其视为值零。否则,它被视为编号寄存器。对于使用“RA”的任何加载指令,了解这一点很重要。

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

(RA|0) means the contents of register RA if the RA field has the value 1-31, or the value 0 if the RA field is 0.

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

关于c - PowerPC 从内存中的已知地址加载方法地址并调用该方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138307/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com