Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с
компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере
FT, или любые другие источники.
Становление Силы.
Написание своей ОС является наилучшим способом изучить работу компьютера, и самого низкого
программного уровня.
Все программы использованные в данной статье вы найдете на
ass3mbler.narod.ru
fasm можно взять на
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 'Real 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, или в форум, обязательно отвечу.
3 комментария