assembly - 我正在制作一个引导加载程序,但它因 %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!
解决方案
当您%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
它在处理器将执行的指令之外的地方。
推荐阅读
- c++ - 为什么 std::uniform_real_distribution
产生NaN? - javascript - 如何在 node.js express 中使用 sequelize 和控制器?
- r - 返回一个没有重复的向量[不使用 unique() 或 duplicate()]
- java - 在另一个 Fragment 中创建 ArFragment 对象
- generics - 将字节数组反序列化为名称为 String 的类
- javascript - 将徽标位置固定在响应式导航栏上
- java - javafx 程序中的 java.lang.reflect.InvocationTargetException
- linked-server - Sql Server - 选择进入链接服务器
- c# - 防止从另一台机器使用 JWT cookie
- node.js - Firebase.initialize 不是函数,我是否缺少包?