把两个ORG放在一起

时间:2010-06-28 01:05:19

标签: assembly code-organization nasm fasm

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

org 7C00h
    %include "boot.asm"

org 1000h
    %include "kernel.asm"

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

3 个答案:

答案 0 :(得分:4)

请参阅here了解您的问题的描述或我认为的内容,因为从问题中说出来有点难以理解。在发布“我遇到语法问题”的问题时,这是一个好主意,以实际显示语法问题: - )

有关解决方案,请参阅here(但可能无效,请参阅下文)。

基本上,NASM中的org语句用于设置节的基址,不能用于任意将字节插入流中。它建议你使用类似的东西:

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

但是,你有没有考虑过你要做的事情。如果您正在创建一个平面二进制文件以加载到内存中,我认为您不希望将引导扇区和内核放在一个文件中。

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

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

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:1)

虽然org在NASM bin格式源中仅允许一次,但是您可以使用其多部分支持来创建与两个FA org指令完全相同的FASM输出。请参阅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