2

我正在构建一个引导加载程序来引导位于1000h软盘部分的内容。我是用Fasm做的(因为我的朋友只使用 Fasm,他正在帮助我),但我更喜欢使用Nasm,现在我遇到了语法问题,然后我想知道我该怎么做这在纳斯姆:

org 7C00h
    %include "boot.asm"

org 1000h
    %include "kernel.asm"

PS:我已经%include使用 Nasm-syntax 样式放置了指令,在 Fasm 上它应该只是include.

4

3 回答 3

4

有关您的问题的描述或我认为的问题,请参见此处,因为从问题中很难分辨。发布带有“我遇到语法问题”的问题以实际显示语法问题一个好主意:-)

有关解决方案,请参见此处(但它可能不起作用,请参见下文)。

基本上,orgNASM 中的语句是为了设置段的基地址,不能用于任意向流中插入字节。它建议你使用类似的东西:

org 1000h
%include "kernel.asm"
times 7c00h-($-$$) db 0 ; pad it out with zero bytes
%include "boot.asm"

但是,你有没有想过你想要做什么。如果您要创建一个平面二进制文件以加载到内存中,我认为您无论如何都不希望引导扇区和内核都在一个文件中。

BIOS 将希望在 7c00:0 处将引导扇区作为单个块加载,并且当它在该块的开头具有内核时几乎肯定会感到困惑。我认为您需要做的是创建两个完全独立的平面二进制文件,一个用于引导扇区,另一个用于内核。BIOS 将加载您的引导扇区,然后您的引导扇区将加载您的内核。

然后您可以将相关org语句放在两个源文件中,希望您的问题得到解决。

于 2010-06-28T01:50:31.007 回答
1

简单的答案是这不能在 NASM 中完成。该org语句在 FASM 中的工作方式与在 NASM 中的工作方式相同,但在 MASM 中的工作方式不同。在 NASM 中,示例代码必须单独组装,然后组合以创建最终图像。

令人高兴的答案是,这是一种罕见的(可能是唯一的)情况,需要将具有不同起始地址的代码组合(使用 NASM)或组装(使用 FASM)到单个图像中。7C00h引导扇区由 BIOS传送。在媒体(软盘、硬盘驱动器、USB 闪存驱动器)上紧随其后的是有效负载,该有效负载由引导扇区 - 引导加载程序传输到其起始地址。

于 2010-08-24T23:29:33.470 回答
1

虽然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
于 2019-08-28T21:01:26.347 回答