【问题标题】:What am I doing wrong in my powerpc assembly program?我在我的 powerpc 汇编程序中做错了什么?
【发布时间】:2015-09-11 18:32:19
【问题描述】:

我编写了一个简单的汇编程序来熟悉 QEMU。我一直在关注这两个教程(opensourceforu.efytimes.com/2011/07/qemu-for-embedded-systems-development-part-2/)(http://www.csd.uwo.ca/~mburrel/stuff/ppc-asm.html)下面是我为PowerPC编写的汇编程序,稍作修改从第二个教程开始。

.global _Start
_Start:
addi 3, 0, 0xa #load 0xA into r3
addi 4, 0, 0xb #load 0xB into r4
addi 5, 0, 0xc #load 0xB into r5
b .

这是基本的,只是将随机值加载到通用寄存器 3-5 中。

当我交叉编译它时,我使用以下链接器脚本。

ENTRY(_Start)
SECTIONS
{
. = 0x10000;
startup : { dummyStartup.o(.text)}
}

我通过第一个教程中的说明使用 ppc 的交叉编译器将所有内容放在一起,当我在 QEMU 中运行时,寄存器 3-5 具有预期值。

我的问题是,当我将 0x10000 更改为不同的值时,例如 0x10500 或 0x9999,程序仍然可以正常运行。该教程指出,QEMU 的 -kernel 选项需要所有内容都位于 0x10000 才能执行我的代码,但似乎并非如此。这是为什么呢?

【问题讨论】:

  • 无论如何它都会在0x10000 加载您的代码,如果您有任何内存引用,如果您的代码不期望该地址,它们将无法工作.当然这段代码没有内存访问,所以它是位置无关的。
  • 0x10000 是标准还是 qemu 的实现决定?因为我认为它忽略了我提供的地址很奇怪。
  • 我可以删除它,我想既然 c 翻译成程序集,它应该被包括在内。
  • @Jester 是正确的,您编写的测试代码与位置无关,可以在任何地方重新定位。更复杂的程序不一定是位置无关的。例如,如果您对程序中的标签执行绝对 ba 分支,并且链接器将原点设置错误,则分支的绝对地址不会分支到您认为的位置。

标签: assembly linker qemu powerpc


【解决方案1】:

我认为0x10000 值取决于平台。所以根据 QEMU 模拟的内核加载地址是不同的机器。

如果您在 QEMU 源代码中查找 KERNEL_LOAD_ADDR,您会看到有几个不同的值:

https://github.com/qemu/qemu/search?q=KERNEL_LOAD_ADDR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2022-01-16
    • 2014-03-28
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多