我正在尝试使用 NASM 和 gcc 编写多阶段引导加载程序。为此,我指的是 grub 引导加载程序源。
我已经写了一个 stage1 加载器,但是一直在写 MBR 的分区表。
在 grub stage1.S 中,他们使用这样的代码来跳过分区表:
. = _start + STAGE1_PARTEND
.word STAGE1_SIGNATURE
我怎样才能在 NASM 中做到这一点?
使用时间它会覆盖分区表。
所以请帮助我。
我正在尝试使用 NASM 和 gcc 编写多阶段引导加载程序。为此,我指的是 grub 引导加载程序源。
我已经写了一个 stage1 加载器,但是一直在写 MBR 的分区表。
在 grub stage1.S 中,他们使用这样的代码来跳过分区表:
. = _start + STAGE1_PARTEND
.word STAGE1_SIGNATURE
我怎样才能在 NASM 中做到这一点?
使用时间它会覆盖分区表。
所以请帮助我。
为 赋值。被视为与 .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
,实际在平面二进制输出文件中查找和填充填充。
times STAGE1_PARTEND-($-_start) db 0
dw STAGE1_SIGNATURE
对,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?
... 或者其他的东西。