引导加载程序不会将内存从磁盘复制到地址0x10000。实际上,前几个扇区已被很好地复制,但是在某个时候,它只是停止复制并跳转到内核。
这是我的代码:
[ORG 0x00]
[BITS 16]
SECTION .text
jmp 0x07C0:START
TOTALSECTORCOUNT: dw 0x200
KERNEL32SECTORCOUNT: dw 0x05
START:
(...)
RESETDISK:
mov ax, 0
mov dl, 0
int 0x13
jc HANDLEDISKERROR
mov si, 0x1000
mov es, si
mov bx, 0x0000
mov di, word [ TOTALSECTORCOUNT ]
READDATA:
cmp di, 0
je READEND
sub di, 0x1
mov ah, 0x02
mov al, 0x1
mov ch, byte [ TRACKNUMBER ]
mov cl, byte [ SECTORNUMBER ]
mov dh, byte [ HEADNUMBER ]
mov dl, 0x00
int 0x13
jc HANDLEDISKERROR
add si, 0x0020
mov es, si
mov al, byte [ SECTORNUMBER ]
add al, 0x01
mov byte [ SECTORNUMBER ], al
cmp al, 19
jl READDATA
xor byte [ HEADNUMBER ], 0x01
mov byte [ SECTORNUMBER ], 0x01
cmp byte [ HEADNUMBER ], 0x00
jne READDATA
add byte [ TRACKNUMBER ] , 0x01
jmp READDATA
READEND:
push LOADINGCOMPLETEMESSAGE
push 2
push 0
call PRINTMESSAGE
add sp, 6
jmp 0x1000:0x0000
HANDLEDISKERROR:
push DISKERRORMESSAGE
push 2
push 0
call PRINTMESSAGE
add sp, 6
jmp $
(...)
SECTORNUMBER: db 0x02
HEADNUMBER: db 0x00
TRACKNUMBER: db 0x00
times 510 - ( $ - $$ ) db 0x00
db 0x55
db 0xAA
此代码仅复制了11个扇区,但是原来是26个扇区。
而且,它在boch中运行不稳定,但是qemu只是重新引导了虚拟机。
此代码仅复制了11个扇区...但是原来是26个扇区。
为什么要尝试加载512个扇区? (TOTALSECTORCOUNT: dw 0x200
)
您是否将DS
段寄存器设置为0x07C0吗?
您应该使用进入时从BIOS接收的DL
寄存器中的驱动器号,而不是硬编码的mov dl, 0x00
。
您确定磁盘的几何形状吗?是18个扇区和2个负责人吗?最好使用BIOS功能int 13h, ah=08h
进行查找!
START:
(...)
[以获得更好的帮助,请填写实际代码。