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

Тема в разделе "WASM.ASSEMBLER", создана пользователем Loginanton, 17 июн 2008.

  1. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Хочу попрактиковать попрограммить на чистом асме, тоесь не под какую то ОСь со своим апи, а попробовать написать прогу, которая бы пахали сама по себе :) Ближе к делу: меня интересует как сделать так, чтоб моя прога записанная к примеру на дискету запускалась при включении компа. Как сделать буд сектор, и что это такое, и в каком он формате, и можно ли его просто залить на дискету?

    P.S. меня всегда интересовал вопрос: вот есть такие вещи как прерывания, досовские и биосные, а как они (прерывания) реализованы? К примеру биосное прерывание int 10? И можно ли ваще к примеру вывести текст на монитор без прерываний?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    http://www.winasm.net/index.php?ind=downloads&op=entry_view&iden=176

    это базовые понятия для работы в ДОС - то же апи, только другой способ вызова. в двух словах сложно рассказать - нужно читать книжки.

    записать байты прямо в видеопамять
     
  3. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    можно пример?
    И хотелось бы на родном русском, да поподробнее описание процесса деланья загрузочного сектора :)
     
  4. iley

    iley Илья

    Публикаций:
    0
    Регистрация:
    28 сен 2007
    Сообщения:
    12
    Адрес:
    Москва
    С загрузочным сектором все просто: при загрузке с дискеты все содержимое первого сектора (если говорить о дискете, то это нулевая сторона, нулевой цилиндр, первый сектор) загружается в память по абсолютному адресу 7c00h. Еще последние 2 байта в загрузочном секторе должны быть равны 055h и 0AAh соответственно (правда, не все это проверяют, например в VmWare и без этих байтов все работает). То есть ты пишешь свою прогу, в начале ставишь org 7c00h, не забываешь в начале настроить стековые регистры, и компилишь ее в простой бинарник. Записываешь это дело на дискету (а проще - в образ дискеты) и - вперед.

    А насчет прерываний - да, можно все делать без вызова программных прерываний. Напрямую работать с памятью и портами ввода-вывода.
     
  5. iley

    iley Илья

    Публикаций:
    0
    Регистрация:
    28 сен 2007
    Сообщения:
    12
    Адрес:
    Москва
    Если хочешь примеров, можешь посмотреть исходники моей оси: http://victoriaos.studenthost.ru/victoriaos-0.02.zip. По поводу загрузочного сектора смотри loader.asm, а по поводу работы с видеопамятью там есть программка mandel - рисует фрактал, работает напрямую с видеопамятью.
     
  6. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    iley о спасиб :) ща попробую.

    P.S. А масм не компилит бинарники ? о_О
     
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Код (Text):
    1.     org 100h           
    2.     use16              
    3.  
    4.     mov ax,3 ; устанавливаем режим
    5.     int 10h
    6.  
    7.     push cs
    8.     pop  ds
    9.     mov  si,hello
    10.     mov  di,550 ; где-то в середине экрана
    11.     mov  ax,0B800h
    12.     mov  es,ax
    13.     mov  ah,7 ; атрибуты символа
    14. @@:
    15.     lodsb
    16.     or  al,al
    17.     je  @F
    18.     stosw
    19.     jmp @B
    20. @@:
    21.     ret    
    22.  
    23. hello db 'Hello world!',0h
    примеры для фасма
     
  8. iley

    iley Илья

    Публикаций:
    0
    Регистрация:
    28 сен 2007
    Сообщения:
    12
    Адрес:
    Москва
    Флаг DF забыл установить (выполнить cld перед циклом). А что, в фасме есть относительные метки? (в смысле @@) Это удобно, я раньше не знал.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да, есть. @@, @B (backward), @F (forward)

    Пиши прямо в 0 сектор тот код, который хочеш ьвыполнить. Только не забудь под 55 AA в конце - его иногда чекают.

    В конечном счете все прерывания биоса и доса и все виндовые драйвера сводятся к работе с аппаратурой через порты ввода-вывода и проецированные в память регистры.
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Вот только я не понимаю суть вопроса. Пишите на ассемблере и не знаете такую аппаратную структуру как прерывание! Операционные системы используют точки входа в прерывания для вызова своих функций. И Вы собрались писать на чистом ассемблере.

    С бут сектором все просто. Это простой бинарник в 1 сектор (как отмечается в документации, у этого бинарника позиция 510, 511 должна быть помечена сигнатурой $55AA). Если следовать стандарту, то в начале бинарника (начиная с 3 байта от начала сектора, как раз место под длинный джамп) расположена структура ВРВ (BIOS Parameter Block). Таким образом начать написание надо примерно так:
    Код (Text):
    1. org 7C00h
    2. jmp start
    3. BPB BPB_str <>
    4. start:
    5. ;some boot code
    поля же этой структуры можешь найти в статьях на этом сайте, хотя если уж совсем никак, то посмотри вот это http://www.wasm.ru/baixado.php?mode=src&id=284. Отличный пример для изучения.
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Прерывания это удобное средство. Оно дает средство обстракции железа от програмного уровня. Т.е на разном железе мы можем применять оди и тежи функции не задумываеь о том как реально происходит в какие порты пишется.
    К примеру без int 13h не обойтись. Так как при загрузки это прерывание в случии чего будет эмулировать работу дисковой систепмы. Т.е если даже ты загружаеь с дискетки, жесткого диска, флешки, оптического диска ты будешь иметь один общий интерфес с точки зрения програмирования. Удобно.

    Во-первых стандартов много. Что касается формата диска то он описан у майкрософт.Это ее формат, не хочишь реализуешь свой. У нее много стандартов полезных и не очень.
    Собственно хочу поправить jmp идет с нуливого байта. Подробнее можешь почитать в FATgen на wasm.ru есть переведенный.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Pavia, не совсем понятно, что ты этим хотел сказать. Было задано внутрисегментное смещение для дальнейшей работы в сегменте с нулевой базой.
    max7C4, записи с префиксом BPB_ начинаются через 11 байтов от начала бут-сектора. Если в свою структуру ты также включил OEM-строку, то через 3 байта. fasm скомпилирует твою команду jmp start в двухбайтовый опкод (я думаю, что твоя BPB_str не очень большая), поэтому следует сделать так...
    Код (Text):
    1. jmp word start
    2. ; или
    3. jmp byte start
    4. nop
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Phantom_84
    разницы особой нет, т.к. перед примером я оговариваю, что надо получить длинный джамп, а уж про фасм я ни единого слова не сказал.
     
  14. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    подскажите пожалуйста как с помощью масма компилировать бинарники? ну что написать загрузочник
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Ну не могу посоветовать ничего проще чем exe2bin.exe, tasm или fasm. С поиском всех с успехом справится google.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    при желании если найти подходящий линкер..
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Loginanton, я бы сделал com-файл с след. разметкой:

    Код (Text):
    1. org 100h
    2.  
    3. org 7C00h
    4.  
    5. db 7DFEh-$ dup (?)
    6. dw 0AA55h
    А потом с помощью какой-нибудь утилиты сохранил в отдельном файле только последние 512 байт полученного com-файла. При использовании fasm'а такой проблемы нет вообще, т.к. он позволяет генерировать чистые бинарники.
     
  18. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    а я бы так не делал. Есть масса исолдников загрузочных секторов. То что получится будет обыкновенным com со стартовым смещением 100h. а загрузочный сектор мапится далеко не по данному смещению. Поэтому будет касяк.
    Тlink позволяет слинковать просто бинарник с любым org. Ключ я точно не помню..
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Читай внимательней то, что я написал в конце. Должен получиться com-файл размером 0x7C00-0x100+512 байт, из которого нужно убрать первые 0x7C00-0x100 байт с помощью какой-нибудь утилиты.
     
  20. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    кому не сложно: напишите пожалуйста исходник загрузчика на nasm, который будет просто выводить строку (к примеру Hello World) и ждать нажатия клавиши (любой), чтобы выйти