Загрузчик не копирует память с диска по адресу 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 секторов.
Кроме того, он работает нестабильно в bochs, но qemu просто перезагружает виртуальную машину.