Основная проблема в том, что когда вы звоните int 0x13, ah = 0x02
, вам нужен номер устройства для устройства, с которого вы хотите прочитать, в dl
.Номер устройства, с которого вы загрузились, предоставляется BIOS в dl
, но код перезаписывает это (предыдущий mov dx, 0x184F
), поэтому вы просите прочитать данные с совершенно другого устройства (которое, вероятно, не существует).).
Существует множество других проблем.Регистры сегментов установлены неправильно (например, mov ax,ds
вместо mov ds,ax
) и не установлены в нужном месте (это следует сделать до использования сегментов - например, до того, как сегмент ds
будет использоватьсяmov al,[si]
инструкция в коде для печати строки).Вы не можете просто предположить, что int 0x13, ah = 0x02
работал без проверки на наличие ошибок (и, если есть ошибка, вы должны отобразить хорошие сообщения об ошибках, читаемые конечным пользователем), которые дают пользователю некоторую надежду выяснить, что они могут сделать, чтобы исправить ошибку.проблема).
Наконец, есть концептуальная проблема.Для многораздельных устройств (жестких дисков, USB-накопителей и т. Д.) Главное, что должен делать MBR, это запускать загрузчик операционной системы из активного раздела (MBR не следует рассматривать как часть какой-либо конкретной операционной системы, начинается загрузочный код операционной системы).с 1-м сектором раздела операционной системы).Для нераспределенных устройств (дискет) по разным причинам вам необходим BPB (блок параметров BIOS) (чтобы другие операционные системы не считали диск неформатированным и чтобы BIOS считал его действительным для различных особых случаев, таких как «USB-флэш-память»).эмулирующая дискета "и" загрузочный компакт-диск эмулирующая дискета ").
ОБНОВЛЕНИЕ
Да, вопрос трансформируется, и некоторые ответы выше не применяются.Текущие проблемы:
ds
не задан до того, как он используется инструкцией mov [BOOT_DRIVE], dl
, которая его использует mov ax,cs
не может быть правильным.Когда BIOS запускает код, он может сделать jmp 0x0000:0x7C00
или jmp 0x07C0:0x0000
(или любую комбинацию), поэтому cs
не установлен на известное значение, и загрузка неизвестного значения в ax
не сильно поможет. mov ax,ds
(сразу после mov ax,cs
) не устанавливает ds
, но загружает ax
со значением, которое BIOS оставил в ds
.Я думаю, что эта инструкция должна была быть mov ds,ax
(которая могла бы или не могла бы работать, в зависимости от того, какой компьютер / BIOS используется) mov ax, ds
, mov ax, es
и mov ax, ss
(сразу после метки kernel:
имеют ту же проблему (должно быть mov ds, ax
, mov es, ax
и mov ss, ax