Чтение сектора из-за сбоя диска

Я пытаюсь сделать очень простой двухэтапный загрузчик и сталкиваюсь с проблемами при чтении второго этапа. Когда я пытаюсь использовать 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
Другие вопросы по тегам