Проблема с загрузочным сектором

Тема в разделе "WASM.ASSEMBLER", создана пользователем al_12, 19 дек 2005.

  1. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
    На дискете имеется загрузчик, который по идее загружает остальные секторы, начиная со 2-го (делал по статье Нестандартный загрузчик). Но проблема в том, что он нихрена не загружается! Недавно начал, поэтому может что не понимаю... Вот код:



    879160342__code2.asm



    Может где ошибка? Помогите пожалуйста, заранее спасибо!
     
  2. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    Напиши, пожалуйста, поподробней, что и как ты делаешь. И еще: зачем тебе ТАКОЙ код (в смысле такой формат загрузчика, с блоком BIOS)? Что он собирается делать?
     
  3. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    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 что было бы дивно.
     
  4. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
    Спасибо всем за ответы.



    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]).

    [​IMG] 730727815__makeboot.asm
     
  5. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
  6. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    да забыл блин!!!



    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 положить
     
  7. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    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
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
  9. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    Блок BIOS не нужен, если ты записываешь код в самый первый сектор дискеты, диска и т.д. (первичный загрузчик). Этот блок может пригодится при написании вторичного загрузчика, который копируется первичным в память с самого первого сектора fat-диска ( == -раздела ).



    В аттаче код и скомпилированные бинарники загрузчиков FreeBSD. В файле boot1.s есть интересный комментарий по BPB.







    [​IMG] _956173736___13486123_boot.zip
     
  10. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
    iloq

    Спасибо, щас посмотрю...
     
  11. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
    Вот, посмотрите еще раз. По-моему загрузка секторов проходит нормально, но вот jmp-аюсь я похоже не туда.

    [​IMG] 69033023__boot.asm
     
  12. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    Может добавить mov ah,2 в блок <; start loading>?



    А ты чем компилируешь? У тебя Магические Байты действительно в конце бинарника?
     
  13. al_12

    al_12 New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2005
    Сообщения:
    8
    iloq

    Блин, ну я и ступил!!! :) Большое тебе человеческое спасибо за найденный баг. Пока вроде все работает!.

    Компилирую MASM'ом, байты действительно в конце.



    To All

    И вот еще у меня несколько вопросов:

    1) Как правильно реализовать перезагрузку или выключение компа. Пробовал int 19h - нихрена.

    2) Какие сегменты в памяти не используются? т.е. я хочу загружать код из секторов в, допустим, сегмент 0070h - не будут ли испорчены какие-нибуть служебные данные в памяти?

    Я, конечно, не ОС пишу, но все-таки...

    3) Где лучше разместить стек, чтобы ничего не попортилось?

    4) Как изменять вектора прерываний без DOS (напр. на таймер)?

    5) Посмотрите, пожалуйста, еще одну мою програмку, она по-идее должна полностью очищать дискету (забивать нули), но почему-то очищает только первые 18 секторов, может опять ступил где, не пойму...



    Заранее спасибо!



    [​IMG] _286447262__clrdisk.asm