Увага, у цій статті я маю на увазі, що основи знань асемблера та роботи з
комп’ютером і fasm у вас є. Якщо ні, то читайте статтю ASM у 12-му номері
FT, або будь-які інші джерела.

Якщо що-небудь у статті незрозуміло, пишіть на mail: skif_q[sobak]mail.ru
або в форум. Обов’язково відповім на будь-які питання.

Всі програми використані у даній статті ви знайдете на ass3mbler.narod.ru
fasm можна взяти на www.flatassembler.org

В пошуках Сили.
Метою написання ОС, є не створення нової СуперОС, а вивчення «високого мистецтва
роботи на нижньому рівні» 🙂
Я постараюся в своїх статтях охопити найбільш широке кількість матеріалу, особливо про
захищеному режимі, таке як: розподіл пам’яті(gdt), переривання(idt),
багатозадачність (tss), а так само багато інших.

У цій статті ми завантажимо вторинний завантажувач, і перейдемо на нього.

Ми маємо мінімальний завантажувач, який нічого не робить.
Нам треба:
1 Завантажити вторинний завантажувач.
2 Перейти на нього так щоб він працював. 🙂

Завантажувати ми будемо його використовуючи 2-ю функцію 0x13-го переривання.

;DL — номер диска (носія)
;DH — номер головки
;CH — номер доріжки
;CL — номер сектора
;AL — кількість секторів (у сумі не більше однієї доріжки)
;ES:BX — адреса буфера пам’яті, в який будуть зчитані дані

Трохи про дискетах:
В дисководі флоппі дисків є 2 головки (тобто ми можемо читати/писати
з верхньої і нижньої сторони дискети), на дискеті є 80 доріжок, на кожній
доріжці — 18 секторів. Тому на адресу fdd зазвичай пишеться ось так x:yy:zz
де x — номер головки, yy — доріжки, zz — сектора.
см. малюнок: ass3mbler.narod.ru/IMG00001.GIF

Сектора вважаються з одиниці. Голівки і доріжки — з нуля.
Розмір вторинного завантажувача обмежимо поки 2048 байтами.

Щоб уникнути глюків, org треба писати вище коду, інакше times неправильно
вираховує розмір. див нижче.

; ——————————————-

org 07C00h
main:
jmp far 00:entry1

entry1:
cli
mov ax,cs
mov ds,ax
sti

mov ah,14
xor bl,bl

mov bx,tex1
.strt:
mov al,[bx]

test al,al
jz .exit_

inc bx
int 10h
jmp .strt

.exit_:

mov ax,0x0860
mov es,ax; Сегмент куди завантажувати будемо

sub dx,dx
sub ch,ch
; вторинний завантажувач з 0:0:2 — 0:0:5
mov cl,2; буде в пам’яті з 0x08600
mov al,4
sub bx,bx; 0x0860:00
mov ah,2
int 0x13

jmp far 0:0x08600; стрибаємо на нього

tex1 db ‘First Loader loaded’,0Dh,0

times 510-($-main) db 0
db 0xAA, 0x55

; —————————————————
; second loader
; Вторинний завантажувач

org 0x8600
sl:
cli
mov ax,cs
mov ds,ax
sti

; висновок повідомлення.

mov ah,14
xor bl,bl

mov bx,tex
.strt:
mov al,[bx]

test al,al
jz .exit_

inc bx
int 10h
jmp .strt

.exit_:
cli
jmp $

tex 0Ah db,’Second Loader is Loaded’,0Dh,0

times 2046-($-sl) db 0
db 0xAA, 0x55

; ——————————————-

Прим із fasm:

Локальні теги:

sigma:
.alpha:; локальна мітка (1)
jmp .alpha; перехід на (1)
omega:
.alpha:; локальна мітка (2)
jmp .alpha; перехід на (2)
jmp sigma.alpha; перехід на (1)

Вторинний завантажувач поки нічого не робить, тільки виводить повідомлення, що він завантажений.

Компілюємо отриманий файл, і з допомогою rawrite записуємо його на дискету,
перезавантажуємося. Можна просто підключити його як дискету в vmware або
Virtual PC.

На всі виниклі у тебе питання відповім негайно, пиши mail: skif_q[myy]mail.ru