Увага, у цій статті я маю на увазі, що основи знань асемблера та роботи з
комп’ютером і 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