我正在做一个引导程序,但是

问题描述

我在制作引导加载程序时遇到一些问题。 我有点不确定这是否是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,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将其置于处理器将不执行的指令之外。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...