Отправляет email-рассылки с помощью сервиса Sendsay

Ассемблер для начинающих.

  Все выпуски  

Создание простейшей операционной системы.




Создание простейшей операционной системы.

Становление Силы.
Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого программного уровня. Все программы использованные в данной статье вы найдете на Ass3mbleR fasm можно взять на FASM Процесс загрузки компьютера:

Основную работу 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, или просто оцените эту статью.

Все пожелания, отзывы, и т.п. на skif_q@mail.ru

Если что-то в данной статье непонятно, пишите на mail, или в форум, обязательно отвечу.







Автор: Skif_Q
skif_q@mail.ru

Ass3mbleR SitE


В избранное