В этой статье мы загрузим вторичный загрузчик, и перейдем на него.
Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с
компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере
FT, или любые другие источники.
Если что-либо в статье непонятно, пишите на skif_q@mail.ru
или в форум. Обязательно отвечу на любые вопросы.
Все программы использованные в данной статье вы найдете на Ass3mbleR
fasm можно взять на FASM
В поисках Силы.
Целью написания ОС, является не создание новой СуперОС, а изучение "высокого исскуства
работы на нижнем уровне" :)
Я постараюсь в своих статьях охватить наиболее широкое количество материала, особенно о
защищенном режиме, такое как: распределение памяти(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м. рисунок:
Сектора считаются с единицы. Головки и дорожки - с нуля.
Размер вторичного загрузчика ограничим пока 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.
На все возникшие у тебя вопросы отвечу незамедлительно, пиши на skif_q@mail.ru
или в forum.
np: Dj Toxic - Its Killing Me (Original Extended Mix)