Чтение сектора из-за сбоя диска
Я пытаюсь сделать очень простой двухэтапный загрузчик и сталкиваюсь с проблемами при чтении второго этапа. Когда я пытаюсь использовать int 13h
с ah = 2
, Прерывание завершается ошибкой с кодом возврата 1 (недопустимая команда). Я компилирую с nasm и тестирую с помощью qemu. Я проверял, работает ли он с помощью консоли qemu для проверки адреса. 0x8C00
и посмотреть ax
и нести флаг. Я всегда вижу, что память вокруг 0x8C00
обнуляется, ax = 0x0101
и флаг переноса установлен.
bootloader.s
[org 0x7c00]
[bits 16]
mov [driveNum], dl
mov ah, 0x0A
mov al, '-'
mov cx, 80
int 0x10
;read drive
mov ax, 0
mov es, ax
mov ah, 2
mov al, 1 ;sectors to read
mov ch, 0 ;cylinder
mov cl, 0 ;sector
mov dh, 0 ;head
mov dl, byte [driveNum] ; drive
mov bx, 0x8c00
int 13h
hang:
jmp $
driveNum: db 0xAA
times (510 - ($ - $$)) db 0
db 0x55
db 0xAA
secondstage.s
jmp $
times 512 db 0xFF
Скомпилировано с
nasm -f bin bootloader.s -o bootloader
nasm -f bin secondstage.s -o secondstage
cat bootloader secondstage > boot
Запустить используя
qemu-system-x86_64 -fda boot
1 ответ
Задача 1 (решена Майклом Петчем)
BIOS возвращается с ошибкой "Недопустимая команда", потому что вы попросили загрузить несуществующий сектор диска 0. В обозначении CHS числа Цилиндра начинаются с 0, числа H начинаются с 0, а номера Sctor начинаются с 1.
Сектор, в котором находится ваш загрузчик, находится в точке (0,0,1). Если ваша секундная сцена находится в следующем более высоком секторе (но это может быть где-то еще, если вы выбрали это!), Тогда вам нужно запросить сектор (0,0,2).
mov cx, 0002h ;Cylinder 0, Sector 2
задачи2
Вы опасно работаете с предположением, что DS
регистр сегмента указывает на ваш загрузчик. Вы не можете доверять BIOS в этом отношении! Единственное, что вы можете предположить, это то, что ваш загрузчик находится в памяти по линейному адресу 0000h:7C00h и что DL
регистр содержит код для загрузочного диска.
Потому что ты написал [org 0x7c00]
настройка, которая отсутствует, это настройка DS=0
xor ax, ax <<===
mov ds, ax <<===
mov [driveNum], dl
проблем3
Функция видео BIOS "WriteCharacterAtCursorPosition" дополнительно требует отображения номера страницы в BH
и если режим видео является графическим, то также цвет в BL
, Пожалуйста, не полагайтесь на содержимое реестра, которое вы не проверяли. Все, что нужно, это написать:
mov ax, 0A00h + '-'
mov bx, 0007h <<===
mov cx, 80
int 10h
jmp $ times 512 db 0xFF
Это создает 514 байтов, что на 2 байта больше, чем полный сектор. Ваш загрузчик будет читать 1 сектор из 512 байт. Технически здесь нет ошибок, но это может указывать на некоторые заблуждения.
jmp $
times (512 - ($ - $$)) db 255