我跟着<30天自制操作系统>和<orange's...>写操作系统,没想到在软盘读取就遇到了问题.
boot.asm
org 0x7c00;程序装载地址
;FAT12软盘的记述
jmp short entry
nop
%include "dec_fat12.inc"
;入口
entry:
;初始化寄存器
mov ax,cs
mov ds,ax
mov es,ax
mov bp,BootMsg
call putstr
cli
call findLoader
mov bp,FindLoaderMsg
call putstr
sti
jmp 0x0820
;进入显卡模式,现在就是黑屏而已
vga:
mov al,0x13
mov ah,0x00
int 0x10
ret
FindLoaderMsg:
db "Finding Loader..."
db 0
;将软盘的34扇区载入内存(通过cm.img和loader.bin确认,0x4400处有loader.bin)
findLoader:
mov ax,0x0820
mov es,ax
mov ch,0
mov dh,0
mov cl,17
mov ah,0x02
mov al,1
mov bx,0
mov dl,0x00
int 0x13
jc findLoader
mov bp,0x0820
call putstr_charmode
ret
;以字符模式显示字符串(临时用来检查0x0820这个地址的值的)
putstr_charmode:
mov al,[bp]
add al,48
add bp,1
mov ah,0x0e
mov bx,15
int 0x10
cmp al,48
jne putstr
ret
;显示字符串(以0x00结尾)
putstr:
mov al,[bp]
add bp,1
mov ah,0x0e
mov bx,15
int 0x10
cmp al,0
jne putstr
ret
BootMsg:
db "CM OS"
db 0x0a,0x0d
db 0
times 510-($-$$) db 0
;用0x0填满剩余的启动区空间
dw 0xaa55
;启动区标志
loader.bin(-->xxd)
00000000: b013 b400 cd10 ......
Makefile
default:
make asm
make -r cm.img
make run
make clean
run: Makefile cm.img
qemu-system-i386 -m 32 -fda cm.img
asm: Makefile boot.asm loader.asm
make -r boot.bin
make -r loader.bin
clean:
rm *.img
rm *.bin
boot.bin: boot.asm
nasm boot.asm -o boot.bin
loader.bin: loader.asm
nasm loader.asm -o loader.bin
cm.img: boot.bin loader.bin
dd if=/dev/zero of=cm.img bs=512 count=2880
dd if=boot.bin of=cm.img bs=512 count=1 conv=notrunc
sudo mount -o loop cm.img /media/ocelot/disk
sudo cp loader.bin /media/ocelot/disk/
sudo umount /media/ocelot/disk/
测试了好久,还是不对,求教大家