3

我正在尝试使用 NASM 和 gcc 编写多阶段引导加载程序。为此,我指的是 grub 引导加载程序源。

我已经写了一个 stage1 加载器,但是一直在写 MBR 的分区表。

在 grub stage1.S 中,他们使用这样的代码来跳过分区表:

. = _start + STAGE1_PARTEND
.word   STAGE1_SIGNATURE

我怎样才能在 NASM 中做到这一点?

使用时间它会覆盖分区表。

所以请帮助我。

4

3 回答 3

2

为 赋值。被视为与 .org 指令相同
(见此)。

因此,您粘贴的代码将当前原点更改为_start + STAGE1_PARTEND并在其中放置一个带有该值的单词STAGE1_SIGNATURE

因此,在 NASM 代码中,您应该能够执行以下操作:

fill: times _start+STAGE1_PARTEND-$ db 0
dw    STAGE1_SIGNATURE
                     ; .word is 16 bits on x86 (regardless of .code16 / .code64)

另请参阅NASM 手册中的此示例,该示例显示了如何以这种方式填充 BIOS 引导扇区,以替代 MASM 样式org或 GAS 样式. = new_position,实际在平面二进制输出文件中查找和填充填充。

于 2013-01-12T14:40:57.477 回答
1
times STAGE1_PARTEND-($-_start) db 0
dw STAGE1_SIGNATURE
于 2018-06-25T17:36:50.020 回答
0

对,Nasm 将只接受一个“org”指令。Nasm 相当于“。” 是“$”,但我认为这对你也没有帮助。我手头没有 GRUB 代码,否则我会看。分区表“从何而来”?如果它是从磁盘读取的,则可能已经存在签名(?)。也许您可以在覆盖分区表之前简单地“停止”Nasm 代码并保留现有的签名?Nasm 几乎可以“做任何你想做的事”,但这可能是个例外。它不会像(G)一样“移动”(跳过)并在一个新的地方组装更多,就像在这里所做的那样——至少不容易。我可能需要下载 GRUB 代码来找出解决方法。可能像...

; stage1 code
; possible padding here?
%incbin "partition_table.bin"
dw (SIG) ; if not part of the .bin code?

... 或者其他的东西。

于 2013-01-12T16:53:10.807 回答