Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере FT, или любые другие источники. Если что-либо в статье непонятно, пишите на mail: skif_q[sobak]mail.ru или в форум. Обязательно отвечу на любые вопросы. Все программы использованные в данной статье вы найдете на http://ass3mbler.narod.ru fasm можно взять на http://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м. рисунок: http://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 или в forum. Skif_Q. np: Dj Toxic - Its Killing Me (Original Extended Mix)