Хочу попрактиковать попрограммить на чистом асме, тоесь не под какую то ОСь со своим апи, а попробовать написать прогу, которая бы пахали сама по себе Ближе к делу: меня интересует как сделать так, чтоб моя прога записанная к примеру на дискету запускалась при включении компа. Как сделать буд сектор, и что это такое, и в каком он формате, и можно ли его просто залить на дискету? P.S. меня всегда интересовал вопрос: вот есть такие вещи как прерывания, досовские и биосные, а как они (прерывания) реализованы? К примеру биосное прерывание int 10? И можно ли ваще к примеру вывести текст на монитор без прерываний?
http://www.winasm.net/index.php?ind=downloads&op=entry_view&iden=176 это базовые понятия для работы в ДОС - то же апи, только другой способ вызова. в двух словах сложно рассказать - нужно читать книжки. записать байты прямо в видеопамять
можно пример? И хотелось бы на родном русском, да поподробнее описание процесса деланья загрузочного сектора
С загрузочным сектором все просто: при загрузке с дискеты все содержимое первого сектора (если говорить о дискете, то это нулевая сторона, нулевой цилиндр, первый сектор) загружается в память по абсолютному адресу 7c00h. Еще последние 2 байта в загрузочном секторе должны быть равны 055h и 0AAh соответственно (правда, не все это проверяют, например в VmWare и без этих байтов все работает). То есть ты пишешь свою прогу, в начале ставишь org 7c00h, не забываешь в начале настроить стековые регистры, и компилишь ее в простой бинарник. Записываешь это дело на дискету (а проще - в образ дискеты) и - вперед. А насчет прерываний - да, можно все делать без вызова программных прерываний. Напрямую работать с памятью и портами ввода-вывода.
Если хочешь примеров, можешь посмотреть исходники моей оси: http://victoriaos.studenthost.ru/victoriaos-0.02.zip. По поводу загрузочного сектора смотри loader.asm, а по поводу работы с видеопамятью там есть программка mandel - рисует фрактал, работает напрямую с видеопамятью.
Code (Text): org 100h use16 mov ax,3 ; устанавливаем режим int 10h push cs pop ds mov si,hello mov di,550 ; где-то в середине экрана mov ax,0B800h mov es,ax mov ah,7 ; атрибуты символа @@: lodsb or al,al je @F stosw jmp @B @@: ret hello db 'Hello world!',0h примеры для фасма
Флаг DF забыл установить (выполнить cld перед циклом). А что, в фасме есть относительные метки? (в смысле @@) Это удобно, я раньше не знал.
Да, есть. @@, @B (backward), @F (forward) Пиши прямо в 0 сектор тот код, который хочеш ьвыполнить. Только не забудь под 55 AA в конце - его иногда чекают. В конечном счете все прерывания биоса и доса и все виндовые драйвера сводятся к работе с аппаратурой через порты ввода-вывода и проецированные в память регистры.
Вот только я не понимаю суть вопроса. Пишите на ассемблере и не знаете такую аппаратную структуру как прерывание! Операционные системы используют точки входа в прерывания для вызова своих функций. И Вы собрались писать на чистом ассемблере. С бут сектором все просто. Это простой бинарник в 1 сектор (как отмечается в документации, у этого бинарника позиция 510, 511 должна быть помечена сигнатурой $55AA). Если следовать стандарту, то в начале бинарника (начиная с 3 байта от начала сектора, как раз место под длинный джамп) расположена структура ВРВ (BIOS Parameter Block). Таким образом начать написание надо примерно так: Code (Text): org 7C00h jmp start BPB BPB_str <> start: ;some boot code поля же этой структуры можешь найти в статьях на этом сайте, хотя если уж совсем никак, то посмотри вот это http://www.wasm.ru/baixado.php?mode=src&id=284. Отличный пример для изучения.
Прерывания это удобное средство. Оно дает средство обстракции железа от програмного уровня. Т.е на разном железе мы можем применять оди и тежи функции не задумываеь о том как реально происходит в какие порты пишется. К примеру без int 13h не обойтись. Так как при загрузки это прерывание в случии чего будет эмулировать работу дисковой систепмы. Т.е если даже ты загружаеь с дискетки, жесткого диска, флешки, оптического диска ты будешь иметь один общий интерфес с точки зрения програмирования. Удобно. Во-первых стандартов много. Что касается формата диска то он описан у майкрософт.Это ее формат, не хочишь реализуешь свой. У нее много стандартов полезных и не очень. Собственно хочу поправить jmp идет с нуливого байта. Подробнее можешь почитать в FATgen на wasm.ru есть переведенный.
Pavia, не совсем понятно, что ты этим хотел сказать. Было задано внутрисегментное смещение для дальнейшей работы в сегменте с нулевой базой. max7C4, записи с префиксом BPB_ начинаются через 11 байтов от начала бут-сектора. Если в свою структуру ты также включил OEM-строку, то через 3 байта. fasm скомпилирует твою команду jmp start в двухбайтовый опкод (я думаю, что твоя BPB_str не очень большая), поэтому следует сделать так... Code (Text): jmp word start ; или jmp byte start nop
Phantom_84 разницы особой нет, т.к. перед примером я оговариваю, что надо получить длинный джамп, а уж про фасм я ни единого слова не сказал.
Ну не могу посоветовать ничего проще чем exe2bin.exe, tasm или fasm. С поиском всех с успехом справится google.
Loginanton, я бы сделал com-файл с след. разметкой: Code (Text): org 100h org 7C00h db 7DFEh-$ dup (?) dw 0AA55h А потом с помощью какой-нибудь утилиты сохранил в отдельном файле только последние 512 байт полученного com-файла. При использовании fasm'а такой проблемы нет вообще, т.к. он позволяет генерировать чистые бинарники.
а я бы так не делал. Есть масса исолдников загрузочных секторов. То что получится будет обыкновенным com со стартовым смещением 100h. а загрузочный сектор мапится далеко не по данному смещению. Поэтому будет касяк. Тlink позволяет слинковать просто бинарник с любым org. Ключ я точно не помню..
Читай внимательней то, что я написал в конце. Должен получиться com-файл размером 0x7C00-0x100+512 байт, из которого нужно убрать первые 0x7C00-0x100 байт с помощью какой-нибудь утилиты.
кому не сложно: напишите пожалуйста исходник загрузчика на nasm, который будет просто выводить строку (к примеру Hello World) и ждать нажатия клавиши (любой), чтобы выйти