我正在制作一个引导加载程序,但它失败并显示 %include



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

这是我的代码:(fortr_load.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!

当您%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会把它放在处理器将执行的指令之外的某个地方。

最新更新