Общее·количество·просмотров·страницы

четверг, 31 октября 2013 г.

простой загрузчик и ядро

Попробуем написать загрузчик и ядро.Ядром у нас будет обычный битмап.Пишем на fasm, т.к. он позволяет устанавливать код в разных местах сегмента.Т.е. можно написать код стартующий с 7с00, а потом стартующий с 0h.

Для начала подготовим ядро.Что мы знаем о битмапе?он состоит к верху дном проще говоря,по этому и рисовать будем к верху дном.и сохранять в 256 цветах (по 1 байту как раз) и размерами 320*200 пикселей (равному режиму 0x13). получается у меня такая няша:

(фуууу, слабак!)))

далее смотрим по структуре: битмап это тупо рисунок с заголовками и палитрой.Их надо откусить.


-Заголовок файла (BITMAPFILEHEADER)
-Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
-Палитра (может отсутствовать)

1-й заголовок -14 байт
2-й заголовок -40 байт
палитра - это 256 записей RGB (4 байта) что составит еще 1кб.
всего надо откусить 1078 байт. открываем в любом хекс редакторе и откусываем.

должен получиться размер картинки 64000 байт.

терь собсна код:

первое загрузочный сектор.тут все как "обычно"

USE16

org 7C00h
EntryPoint:
mov ax, cs
cli
mov ss, ax
mov ds, ax
mov es, ax
mov sp, EntryPoint  ; настраиваем сегменты и т.д. и т.п.
sti
cld

push dx ; запоминаем какой диск


mov ax, 3
int 10h

xor dx, dx
mov bx, 15
mov ax, 1301h   ; выдаем , мол все зер гут
mov bp, BootMsg
mov cx, BootMsgEnd - BootMsg 
int 10h
pop dx

mov ax, 9000h  ; сегмент куда будут кидаться данные 
mov es, ax

mov ah, 2 ;2 сектор 
mov al, (KernelEnd - KernelStartCode) / 512 ; кол-во секторов, отведенных под ядро
xor dh, dh
mov cx, 2h
xor bx, bx
int 13h ; читаем 

jc Error
jmp 9000h:0000h ; передаем управление на заданный адрес


Error:
;если ошибка- че то там делаем


BootMsg db "Boot Sector Loaded"
BootMsgEnd:

TIMES 510-($-$$) DB 0
DW 0AA55h

Теперь идет непосредственно ядро:

KernelStart:
org 0h
KernelStartCode:
jmp KernelCode

BootDisk DB ?
KernelMsg db "Kernel Started"
KernelMsgEnd:


; процедура чтения сектора по номеру.
; вход ax= номер сектора
; es:bx= куда кинуть

ReadSectors:
push ax
push cx
cwd
mov cx, 18
div cx
mov cx, dx
inc cx

xor dh, dh
shr ax, 1
rcl dh, 1

mov ch, al
shl ah, 4
or cl, ah

mov dl, [BootDisk]

mov ax, 0201h   
int 13h

pop cx
pop ax
ret

KernelCode:
;извещаем что мы подгрузились

mov [BootDisk], dl
mov dx, 0100h
mov bx, 15
mov ax, 1301h
mov bp, KernelMsg
mov cx, KernelMsgEnd - KernelMsg 
int 10h

xor ax, ax ; ждем нажатия клавиши и устанавливаем режим 320*200*256
int 16h

mov ax, 13h
int 10h

mov ax, 0A000h ; начало непосредственно прямого вывода в видеобуффер 
mov es, ax

xor bx, bx
mov ax, 2
m1:
call ReadSectors ;читаем сектора пока не выведем все
add bx, 512
inc ax
cmp ax, 125
jne m1

xor ax, ax
int 16h ;ждем нажатия и ребутим ПК

jmp 0FFFFh:0000h

  TIMES  0 - ($-KernelStart) mod 512 DB 0 ; уравниваем размеры
KernelEnd:
   file '2.bmp' ; инклюдим наше ядро

Вот собсно и все. проверить как оно работает можно в боше.



ЭХЭХЭ)
ну вот собсно и усе).

А ТЕПЕРЬ БУДЕТ ТАКОЙ СЕ НАБОЛЕВШИЙ ПОСТ СКРИПТУМ))))))))

Я тут размышлял.на самом деле,сегодня уже 31 октября, лето вспоминаю как будто неделю назад,время бежит просто очень быстро, представить трудно что через 8-9 месяцев я буду говорить не "о черт,завтра на пары",а "о черт,завтра на работу", хотя без работы жизнь бы вообще была хер знает какой, если ни деньги ни хера материальное не приносит стимула и удовольствия.Надо искать свою нишу.И надо стараться держать рядом с собой только проверенных и лучших друзей,заниматься своим делом.Играйте музыку, программируйте аццкую хрень,бухайте в конце концов, читайте что нибудь стоящее (лично я прочел некоторые вещи Кафки,хотя еще в школе наотрез отказывался читать это).в общем не теряйте время.

пысышки:
уже целая коллекция гугл нексусов). подумываю 7 поменять на 10 теперь)
а это я учусь)



еще кое что: этот код мы как то давно со slesh-em чудили, он даже где то выкидывал его кажется.однако разобраться че он там грузит и как трудновато,так что я решил (давно хотел)его сюда закинуть и рассказать как применить и как работает).

Комментариев нет:

Отправить комментарий