我正在构建一个引导加载程序来引导位于1000h
软盘部分的内容。我是用Fasm做的(因为我的朋友只使用 Fasm,他正在帮助我),但我更喜欢使用Nasm,现在我遇到了语法问题,然后我想知道我该怎么做这在纳斯姆:
org 7C00h
%include "boot.asm"
org 1000h
%include "kernel.asm"
PS:我已经%include
使用 Nasm-syntax 样式放置了指令,在 Fasm 上它应该只是include
.
有关您的问题的描述或我认为的问题,请参见此处,因为从问题中很难分辨。发布带有“我遇到语法问题”的问题以实际显示语法问题是一个好主意:-)
有关解决方案,请参见此处(但它可能不起作用,请参见下文)。
基本上,org
NASM 中的语句是为了设置段的基地址,不能用于任意向流中插入字节。它建议你使用类似的东西:
org 1000h
%include "kernel.asm"
times 7c00h-($-$$) db 0 ; pad it out with zero bytes
%include "boot.asm"
但是,你有没有想过你想要做什么。如果您要创建一个平面二进制文件以加载到内存中,我认为您无论如何都不希望引导扇区和内核都在一个文件中。
BIOS 将希望在 7c00:0 处将引导扇区作为单个块加载,并且当它在该块的开头具有内核时几乎肯定会感到困惑。我认为您需要做的是创建两个完全独立的平面二进制文件,一个用于引导扇区,另一个用于内核。BIOS 将加载您的引导扇区,然后您的引导扇区将加载您的内核。
然后您可以将相关org
语句放在两个源文件中,希望您的问题得到解决。
简单的答案是这不能在 NASM 中完成。该org
语句在 FASM 中的工作方式与在 NASM 中的工作方式相同,但在 MASM 中的工作方式不同。在 NASM 中,示例代码必须单独组装,然后组合以创建最终图像。
令人高兴的答案是,这是一种罕见的(可能是唯一的)情况,需要将具有不同起始地址的代码组合(使用 NASM)或组装(使用 FASM)到单个图像中。7C00h
引导扇区由 BIOS传送。在媒体(软盘、硬盘驱动器、USB 闪存驱动器)上紧随其后的是有效负载,该有效负载由引导扇区 - 引导加载程序传输到其起始地址。
虽然org
在 NASM bin 格式源中只允许一次,但您可以使用它的多部分支持来创建我认为与您的 FASM 输出完全相同的两个org
指令。参考https://www.nasm.us/xdoc/2.14.02/html/nasmdoc7.html#section-7.1.3
这就是具有这样一个第二阶段的引导加载程序的样子:
org 7C00h
section BOOTSECTOR start=7C00h
; boot sector content here
times 510 - ($ - $$) db 0
dw 0AA55h
section KERNEL follows=BOOTSECTOR vstart=1000h
; kernel content here