boot.asm:
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded
INT 0x13
JMP $ ;infinite loop
TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0
DW 0xAA55 ; add boot signature
start.asm:
[BITS 16]
MOV AL, 72
CALL PrintCharacter
MOV AL, 101
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 111
CALL PrintCharacter
MOV AL, 44
CALL PrintCharacter
MOV AL, 32
CALL PrintCharacter
MOV AL, 87
CALL PrintCharacter
MOV AL, 111
CALL PrintCharacter
MOV AL, 114
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 100
CALL PrintCharacter
MOV AL, 33
CALL PrintCharacter
PrintCharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07
INT 0x10
RET
TIMES 512 - ($ - $$) db 0
我使用以下命令将它们编译成 .bin 文件:
nasm boot.asm -f bin -o boot.bin
nasm start.asm -f bin -o start.bin
然后使用以下命令将它们添加到软盘映像中:
dd if=boot.bin bs=512 of=MyOS.img count=1
dd if=start.bin bs=512 of=MyOS.img count=2
当我在VirtualBox中从软盘映像启动时,它显示两个感叹号而不是一个,并且甚至在QEmu(Q.app)中也无法启动。我对操作系统开发很新,所以如果有人能告诉我我做错了什么,并给我一些指针来更好地设置我的操作系统,那就太好了。
INT 0x13h
)是罪魁祸首。可能QEMU在启动时设置了寄存器,中断调用没有达到你想要的效果。尝试显式地设置寄存器(AH = 02,AL = 01,...
)。或者QEMU没有仿真软盘驱动器,因此无法加载引导程序。--我必须承认我不太理解你在boot.asm
中具体在做什么。难道你不应该将start.asm
加载到内存中,然后跳转到它吗? - stakx - no longer contributingboot.asm
中,从而将包含在start.asm
中的代码扇区加载到内存中(例如通过调用INT 13h
函数)。将其加载到某个固定地址(在start.asm
中使用ORG
指定该地址)。然后,在加载该代码之后,进行远跳转。 - stakx - no longer contributing