2

我正在使用 gnu 作为简单的引导。是这样的:

.text
.org 0x7c00
start:
    movw $0x7c0, %ax
    movw %ax, %ds
    movw %ax, %es
    leaw greeting_msg, %si
    call prtstr
....

end:
    .fill 510-(end - start), 1, 0
    .word 0xAA55

而输出的hexdump是:

○ → hexdump bare.o 
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0007c00 c0b8 8e07 8ed8 8dc0 7f36 e87c 0046 02b8
0007c10 bb4f 4115 10cd f883 754f a133 4f01 3e8d
0007c20 7c97 15b9 cd41 8310 4ff8 2275 8b66 9b16

哪一个与 nasm 中的 ORG 不同?如果我使用 NASM,它会输出如下内容:

 ○ → hexdump test_org
0000000 c031 d88e 14be ac7c c008 0674 0eb4 10cd
0000010 f5eb feeb 6557 636c 6d6f 2065 6f74 4d20
0000020 6361 6e69 6f74 6873 0a0d 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000

这里有什么问题?谢谢。

4

3 回答 3

2

没有错,只是.org在 GAS 中不在.orgNASM 中。.org在 GAS 中表示当前位置计数器前进多少,如下所示:

.org expr, fill

其中 fill 是用于填充的内容,如果未指定,则默认为零(此处有更多信息

.org在 NASM 中表示该模块将被放置的内存地址(从而生成正确的分支和跳转指令)(更多信息在这里

我建议您将 NASM 用于此类平面二进制文件,这对我来说总是很有吸引力。

于 2012-06-18T14:39:46.300 回答
2

您正在将二进制文件(来自 Nasm)与来自 (G)as 的可链接 .o 文件进行比较。我认为,如果您将“bare.o”与 ld...“ld -o bare.bin -oformat binary bare.o”(不确定语法)链接起来,您会想出更接近您期望的东西。或者......只需使用 nasm。

于 2012-06-20T13:32:03.113 回答
1

使用ld -Ttext 0x7c00 --oformat=binary boot.o -o boot.bin.

于 2020-05-05T16:09:41.440 回答