Разбираюсь с алгоритмом работы загрузчика, экспериментирую с флоппи-дисководом, непонятны некоторые вещи. Во первых - не работает чтение с FDD в реальном режиме, пытаюсь записать код из 1-го сектора: mov ah, 0x2 mov al, 1 mov dl, 0 mov dh, 0 ; head mov ch, 0 mov cl, 1 mov ax, cs mov es, ax mov bx, 0x7e00 int 13h по адресу 0x7e00 ничего не записалось, т.е. прерывание не работает! в чем может быть дело Во-вторых - непонятно, почему при запуске первичного загрузчика он переписывает себя на другой адрес, а потом стартует уже из него. Для чего это нужно? Помогите разобраться!
1. Неплохо бы проверить, что CF поле int 0x13 сброшен. Если нет -- в ah должен быть код ошибки. Кстати, а в чем выражается, что чтение не происходит? И что содержит cs на момент выполнения кода? 2. Это нужно чтобы загрузить загрузчик файловой системы -- он тоже должен быть считан по адресу 0x7C00.
Проверяю cf, и JC на сообщение об ошибке, вот только ошибки не происходит. CS содержит 0. После выполнение int 13h в указанной области памяти считанный сектор не появляется. А в ah должен быть код ошибки даже если cf сброшен? А почему он должен быть только по этому адресу? Слышал, что int 13h позволяет считывать данные только в первые 64r - это так?
Странно, код, вроде бы, верный. А можно его целиком увидеть? ah в этом случае устанавливается в 0 -- success. Так же как и с MBR -- необходимо было договориться. Договорились на 0x7C00 . В смысле? В первые 64К? Думаю, что это не так, т.к. NTLDR, например, загружается по адресу 0x2000:0x0. Другое дело, что ah = 0x2, ah = 0x42 не могут за раз прочитать более 64К. Но никто не запрещает сменить сегментные регистры и читать дальше.
Вот код полностью, тестирую его под Bochs. Пытаюсь считать загрузочный сектор, записать его по адресу 0x7e00, и для проверки смотрю символ - он не отображается, в отличии от 7C00, не могу понять в чем дело. [bits 16] [ORG 0x7C00] mov ah, 0x2 ; read mov al, 1 mov dl, 0 mov dh, 0 ; head mov ch, 0 ; cylinder mov cl, 1 ; sector mov ax, cs mov es, ax mov bx, 0x7e00 int 13h jc error_ mov ah, 0x0E mov al, [0x7e00] int 10h mov ah, 0x0E mov al, 'O' int 10h mov ah, 0x0E mov al, 'k' int 10h jmp 0x0000:0x7e00 error_ mov ah, 0x0E mov al, 'E' int 10h mov ah, 0x0E mov al, 'r' int 10h mov ah, 0x0E mov al, 'r' int 10h jmp $ times 510-($-$$) db 0 db 0xAA, 0x55
Я решил проблему. Ошибка, как это часто бывает при программировании на ассембере, из-за невнимательности: mov ah, 0x2 mov al, 1 mov dl, 0 mov dh, 0 ; head mov ch, 0 mov cl, 1 // ax затирается mov ax, cs mov es, ax mov bx, 0x7e00 int 13h обидно что пару часов с ней возился. Спасибо за помощь!