Задача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