首页 > 解决方案 > 我正在制作一个引导加载程序,但它因 %include 而失败

问题描述

我有一些问题......关于制作引导加载程序。我有点不确定这是否是 32 位程序集,但如果你看到它是 16 位...

这是我的代码:(fortr_foload.asm)

[ bits 16 ]
[ org 0x7c00 ]

bootstart:
    xor ax,ax
    mov bx,ax
    mov cx,ax
    mov dx,ax
    mov es,ax

    mov ax,0x8000

    mov si,fortr_loadbOutp
    call fortr_outpf
    
    fortr_loadbOutp db 'booted!!!'

fortr_outpf:
    mov ah,0x0E
    %include "fortr_kernel.asm"
    call fortrk_start
.repboot_fortr:
    lodsb
    cmp al,0
    je .rebboot
    int 0x10
    jmp .repboot_fortr

.rebboot
    ret

times (510 - ($ - $$)) db 0x00
DW 0xAA55

这是第二个:(fortr_kernel.asm)

[ bits 16 ]

fortrk_start:
    xor ax,ax
    mov bx,ax
    mov cx,ax
    mov dx,ax
    mov bx,0x7000

    mov si,fortr_outp
    call fortr_printf

    fortr_outp db 'Stage 2... Done!'

fortr_printf:
    mov ah,0x0E

但是,如果我使用以下代码编译它:

nasm -f bin -o "fortr_foload.asm" "fortrSt.iso"

在 QEMU 中播放它不会启动它只会输出一个白色光标,好吧,什么也没有。

但是如果我删除这些行:

%include "fortr_kernel"
call fortrk_start

我什至尝试重新排列线条,但遗憾的是,它甚至不起作用:(它会成功启动!我该如何解决这个问题?提前 TYSM!:D 哦!顺便说一下,我真的很新组装所以请帮帮我:D!

标签: assemblynasmx86-16bootloader

解决方案


当您%include创建一个文件时,它会准确地放置在您包含它的位置。

所以,

[...]
fortr_outpf:
    mov ah,0x0E
    %include "fortr_kernel.asm"
    call fortrk_start
.repboot_fortr:
[...]

变成

[...]
fortr_outpf:
    mov ah,0x0E
[ bits 16 ]

fortrk_start:
    xor ax,ax
[...]
    call fortr_printf

    fortr_outp db 'Stage 2... Done!'

fortr_printf:
    mov ah,0x0E
    call fortrk_start
.repboot_fortr:
[...]

您直接在代码路径的中间注入包含的文件。如果你想以这种方式做事(你可能想重新考虑,组装和链接单独的源文件),%include它在处理器将执行的指令之外的地方。


推荐阅读