我正在按照一个教程向您介绍引导加载程序的神奇世界。
最简单的例子,打印一个角色,有效。
显示一个字符串给我一些问题:它显示随机字符。
它应显示12个字符,从si
寄存器
这是Nasm代码(构建命令:nasm.exe bootloader.asm -f bin -o bootloader.bin
)
[bits 16]
[org 0]
start:
mov al, 68
mov ah, 0x0E
mov bh, 0x00
mov bl, 0x07
mov si, helloWorld
call printString
jmp $
printString:
mov dx, 0
._loop:
mov al, [si]
int 0x10
inc si
inc dx
cmp dx, 12
jl ._loop
ret
helloWorld:
db 'AAAAAAAAAA'
times 510 - ($ - $$) db 0
dw 0xAA55
然后我使用dd.exe if=bootloader.bin of=bootloader.img count=1 bs=512
它在QEMU(qemu-system-i386.exe
)中正确引导(好吧,它加载,因为我的引导加载程序仍无法启动)(也许这是QEMU -difficoult的问题 - )
我的代码中出现了什么问题?
答案 0 :(得分:1)
您应该使用[org 0x7c00]
,因为这是加载引导程序的地方。我建议您从this OSDev Wiki article了解有关启动顺序的更多信息。
答案 1 :(得分:0)
是的,您需要ORG 0x7C00,因此寻址从7C00h开始。 您还需要在访问[SI]上的数据之前设置DS(数据段)寄存器,因为无法保证所有BIOSES都将其设置为0。
只是做: MOV DX,CS MOV DS,DX 在你的开始:标签
设置完DS后,您可以访问那里的任何数据结构。
此处参考是Microsoft引导扇区的第一条指令(在jmp之后):
XOR CX,CX
MOV SS,CX
MOV SP,7BF4h
MOV ES,CX
MOV DS,CX