Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с
компьютером и 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 — сектора.
cм. рисунок:
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; Cегмент куда загружать будем
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 db 0Ah,'Second Loader is Loaded',0Dh,0
times 2046-($-sl) db 0
db 0xAA, 0x55
; -------------------------------------------
Прим из fasm:
Локальные метки:
sigma:
.alpha:; локальная метка (1)
jmp .alpha; пеpеход на (1)
omega:
.alpha:; локальная метка (2)
jmp .alpha; пеpеход на (2)
jmp sigma.alpha; пеpеход на (1)
Вторичный загрузчик пока ничего не делает, только выводит сообщение что он загружен.
Компилируем получившийся файл, и с помощью rawrite записываем его на дискету,
перезагружаемся. Можно просто подключить его как дискету в vmware или
Virtual PC.
На все возникшие у тебя вопросы отвечу незамедлительно, пиши на mail: skif_q[myy]mail.ru
2 комментария