【发布时间】: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