Boot сектор

Тема в разделе "WASM.OS.DEVEL", создана пользователем CED2011, 15 янв 2011.

  1. CED2011

    CED2011 New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2011
    Сообщения:
    8
    Как сделать загрузочный сектор, способный загружать простые стандартные COM программы.
     
  2. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    просто загрузить COM программу - легко. достаточно написать функции чтения файлов из ФС.
    другое дело то, что эти программы будут пользоваться int 0x21 для системных вызовов и вам придётся делать свою реализацию DOS.
     
  3. CED2011

    CED2011 New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2011
    Сообщения:
    8
    Напишы как ето реализовать
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Ничего трудного.
    Возьми любой код загрузчика, да хоть от виндоуса.

    Прочитать про файлы COM и DOS

    Настраиваешь стек. Читаешь сектора при помощи int 13h.

    Затем настраиваешь сегментные регистры и делаешь jmp NewCS:100h.
    А да не забудь правильно настроить с NewCS:000h по NewCS:FFh.

    А вообще возьми книгу Абель АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC
    Там расписано как загрузить COM файл.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Жи, Ши...

    Все верно, загружаешь com-файл как обычный бинарник с выравниванием минимум на 16-байтную границу, настраиваешь регистры ds, es, и ss с уменьшенным на 256 байт базовым адресом, обнуляешь sp и делаешь push 0, после чего передаешь управление в тот же сегмент по смещению 0x100, предварительно разместив в начале сегмента парковочный код. У меня есть нечто подобное, только не для бутсектора. Для бутсектора будет как-то так:
    Код (Text):
    1. org     7С00h
    2. ; здесь или дальше пишешь код загрузки com-файла по адресу 7E00h
    3. mov     ax, 7D0h
    4. xor     bx, bx
    5. cli
    6. mov     ss, ax
    7. mov     sp, bx
    8. sti
    9. push    bx
    10. mov     ds, ax
    11. mov     es, ax
    12. jmp     7D0h:100h
    13.  
    14. rb      7D00h-$
    15. xor     ax, ax
    16. mov     ds, ax
    17. mov     word [ds:472h], 1234h
    18. jmp     0FFFFh:0
    19.  
    20. rb      7DFEh-$
    21. dw      0AA55h