На дискете имеется загрузчик, который по идее загружает остальные секторы, начиная со 2-го (делал по статье Нестандартный загрузчик). Но проблема в том, что он нихрена не загружается! Недавно начал, поэтому может что не понимаю... Вот код: 879160342__code2.asm Может где ошибка? Помогите пожалуйста, заранее спасибо!
Напиши, пожалуйста, поподробней, что и как ты делаешь. И еще: зачем тебе ТАКОЙ код (в смысле такой формат загрузчика, с блоком BIOS)? Что он собирается делать?
al_12 мужик ну ты даеш! ты хоть понял что ты читать должен минимум 63 сектора? это почему так? а потому что читать ты начинаеш по адресу 200h тоесть прямо в таблицу прерываний а джампиш ты mov ax, 07E00h jmp ax итого 07E00h/200h=3fh имхо наверно надо поменять ; начинаю чтение секторов mov ax, cs mov es, ax mov ah, 2 mov al, 1 mov bx, 200h xor ch, ch mov cl, 2 xor dx, dx на ; начинаю чтение секторов mov ax, cs mov es, ax mov ah, 2 mov al, 1 mov bx, 7e00h xor ch, ch mov cl, 2 xor dx, dx бывай. да вот еще зачем так мудро читать сектора? ведь можно твой секторс рид сразу в ал запихать если тока он не больше 256 что было бы дивно.
Спасибо всем за ответы. iloq По идее, постепенно загружаю в память сектора (количество - переменная SectorsRead, которая инициализируется при записи на дискету), затем управление переходит 2-му сектору. Ну незнаю... Говорю-же, начал писать по статье. А почему блок BIOS не нужен? doctor_Ice Блин, я вообще не шарю в этих сегментах. Думал es=cs=7C00h, а физ.адрес = es+200h=7E00h. Но даже при изменении на 7E00h чушь какая-то получается - пищит и бесконечно выводит на экран какую-то хрень. Расскажи, пожлуйста, по-подробнее! А можно-ли одним махом загрузить все сектора с дискеты? To All Не знаю, может у меня ошибка в программе, которая записывает это все на дискету. Посмотрите, пожалуйста. Смысл такой - читается 512 байт из boot.com в буфер1, затем читаю по 512 байт из kernel.com до того, как будет достигнут конец файла, при этом увеличиваю переменную в boot.com (inc word ptr [boot+512-4]). 730727815__makeboot.asm
да забыл блин!!! mov ax, 0 mov es, ax mov ah, 2 mov al, 1 mov bx, 7e00h xor ch, ch mov cl, 2 xor dx, dx в рег es нужно 0 положить
INT 13 - DISK - READ SECTORS INTO MEMORY AH = 02h AL = number of sectors to read CH = track (for hard disk, bits 8,9 in high bits of CL) CL = sector DH = head DL = drive ES:BX = address of buffer to fill Return: CF set on error AH = status (see AH=1 above) AL = number of sectors read
Блок BIOS не нужен, если ты записываешь код в самый первый сектор дискеты, диска и т.д. (первичный загрузчик). Этот блок может пригодится при написании вторичного загрузчика, который копируется первичным в память с самого первого сектора fat-диска ( == -раздела ). В аттаче код и скомпилированные бинарники загрузчиков FreeBSD. В файле boot1.s есть интересный комментарий по BPB. _956173736___13486123_boot.zip
Вот, посмотрите еще раз. По-моему загрузка секторов проходит нормально, но вот jmp-аюсь я похоже не туда. 69033023__boot.asm
Может добавить mov ah,2 в блок <; start loading>? А ты чем компилируешь? У тебя Магические Байты действительно в конце бинарника?
iloq Блин, ну я и ступил!!! Большое тебе человеческое спасибо за найденный баг. Пока вроде все работает!. Компилирую MASM'ом, байты действительно в конце. To All И вот еще у меня несколько вопросов: 1) Как правильно реализовать перезагрузку или выключение компа. Пробовал int 19h - нихрена. 2) Какие сегменты в памяти не используются? т.е. я хочу загружать код из секторов в, допустим, сегмент 0070h - не будут ли испорчены какие-нибуть служебные данные в памяти? Я, конечно, не ОС пишу, но все-таки... 3) Где лучше разместить стек, чтобы ничего не попортилось? 4) Как изменять вектора прерываний без DOS (напр. на таймер)? 5) Посмотрите, пожалуйста, еще одну мою програмку, она по-идее должна полностью очищать дискету (забивать нули), но почему-то очищает только первые 18 секторов, может опять ступил где, не пойму... Заранее спасибо! _286447262__clrdisk.asm