Создание вашей первой операционной системы. Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере FreeTech, или любые другие источники. FT можно взять на http://www.wisesoft.ru/ в разделе "уже не выпускающиеся" Становление Силы. Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого программного уровня. Все программы использованные в данной статье вы найдете на http://ass3mbler.narod.ru fasm можно взять на http://www.flatassembler.org Процесс загрузки компьютера: Основную работу BIOS-а мы пропускаем как не нужную на данный момент для нас. Возьмем как данность, что BIOS загружает свои процедуры на int 0x10, 10-е прерывание. Там имеются почти все необходимые нам процедуры, такие как чтение дисков, и т.п. Кто хочет подробнее узнать о этих прерываниях ищите в нете tech help (v1 есть русская, остальные - англ.) или любой другой справочник по прерываниям (можно у меня попросить, если надо, выложу). Далее BIOS загружает первый сектор загрузочного диска (дискеты, CD-Rom) на адрес 07C0:0000 или 0000:07C00 что является одним адресом. Здесь небольшая ремарка: При компиляции часто используется директива org операнд которой определяет адрес куда код(программа) будет загружен в оперативку. Сделано это потому что вместо переменных в команды подставляются их адреса от начала кода, и если не учесть что программа будет загружена не в самое начало памяти (0000:0000) то вместо переменных мы получим кашу. К адресу переменой добавляется операнд директивы org. (например org 100h) После этого на этот адрес передается управление. Тут начинается выполнение нашего загрузчика. Сей загрузчик должен вывести приветственное сообщение, загрузить и перезать управление вторичному загрузчику. Для первичного загрузчика размеры ограничены 512-ю байтами (таков размер одного сектора). Давайте напишем простейший загрузчик, который выводит hello world. Для компиляции данного примера вам потребуется fasm. org 07C00h main: jmp far 00:entry1 ; это необходимо для того, чтобы точно знать, что ; мы находимся на 0000:07C00h entry1: cli ; запрещаем прерывания mov ax,cs mov ds,ax ; устанавливаем сегмент данных sti ; разрешаем прерывания mov ah,14 ; в ah - номер процедуры (вывод знаков в режиме ; телетайпа xor bl,bl mov bx,tex ; в bx, адрес выводимой строки ; 14-я функция требует чтобы адрес был в формате 0000:xxxx ; а у нас он в формате 07c0:xxxx ; по этому к адресу надо добавить 7C00h strt: mov al,[bx] test al,al jz exit_ ; если al=0 (конец строки) то выход inc bx int 10h jmp strt exit_: cli jmp $ ; завешиваем компьютер ($ заменяется на адрес текущей команды ; следовательно эта команда будет повторятся бесконечно). tex db 'HARD Hello World',0Dh,0 times 510-($-main) db 0 ; эта директива заставляет компилятор заполнить оставшееся (до 512-и байт) место нулями db 0xAA, 0x55 ; а эти два байта нужны чтобы биос определил что это действительно ; бут сектор Компилируем получившийся файл, и с помощью программы rawrite записываем его на дискету, перезагружаемся, и радуемся. В дальнейшем рекомендую использовать виртуальную машину, чтобы каждый раз не перезагружаться (vmware, bosh, Virtual PC или др.) Если эта статья вам понравилась. и вы хотите продолжения, то напишите мне на mail, или просто оцените эту статью. Все пожелания, отзывы, и т.п. на mail: skif_q гав mail.ru Если что-то в данной статье непонятно, пишите на mail, или в форум, обязательно отвечу. Skif_Q.