Считывающий сектор из-за сбоя диска - PullRequest
0 голосов
/ 05 мая 2018

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

0 голосов
/ 13 мая 2018

Задача1 (решено Майклом Петчем)

BIOS возвращается с ошибкой «Invalid Command», потому что вы попросили загрузить несуществующий сектор диска 0. В записи CHS C номера ylinder начинаются с 0, H номера ead начинаются с 0, но S номера ector начинаются с 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
...