我正在构建一个引导加载程序,用于引导位于软盘1000h
部分的内容。我正在使用Fasm这样做(因为我的朋友只使用Fasm,他正在帮助我),但我更喜欢使用Nasm,现在我遇到语法问题,然后我想知道我怎么能在Nasm做到这一点:
org 7C00h
%include "boot.asm"
org 1000h
%include "kernel.asm"
PS:我已经使用Nasm语法样式放置了%include
指令,在Fasm上它应该只是include
。
答案 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