Вы находитесь на странице: 1из 14

Universitatea Tehnic a Moldovei

Catedra Automatic i Tehnologii Informaionale

Raport
La Sisteme de Operare: Mecanisme interne i principii de proiectare

Lucrarea de laborator Nr.1

Tema : Dezvoltarea bootloader-ului de sistem.

A efectuat:

A verificat:

st.gr. SI-131 Popov Eugen

lect. asist.Ostapenco S.

Chiinu 2015

Obiective:
Dezvoltarea propriului bootloader i nscrierea acestuia pe dischet.
Condiii:
Pentru acest lucrare de laborator vom face cunostin cu limbajul de programare
assembler, i vom utiliza ntreruperile BIOS pentru a nelege modul n care vom dezvolta
propriul nostru boot loader.
Ducem cont de modul in care BIOS-ul analizeaz sectoarele de pe dischet.
Sectorul citit de BIOS la ncrcarea FDD-ului(0:A) are adresa 0xAA55 ce reprezint un offset de
510bytes de pe dischet. Teoretic acesta reprezint primul sector, care l vom seta pentru
ncrcarea kernel-ului de sistem dezvoltat la urmtoarele lucrri de laborator.
Un exemplu de bootstrap este expus mai jos:
;**************************************
[BITS 16]
ORG

INT

0x18

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

0xAA55

;**************************************
Atunci cnd BIOS-ul va citi boot loader-ul de pe primul sector al dischetei, codul
compilat n fiierul nostru COM va fi ncrcat pe adresa
0:07C00h, de unde propriu zis, vom suprancrca regitrii.
Deci, sarcina este de a scrie un sector de boot, asamblat ntr-un fiier binar simplu
(conform unui punct de mai jos) ,care n final trebuie nscris pe primul sector al discului, cu
ajutorul aplicaiei voastre - dezvoltata n C++/C#, Java etc.
Sarcina:
Afiarea a 4 sau 6 mesaje pe centrul ecranului - citit minimum din 8 offset-uri.
Unul din aceste mesaje va clipi periodic cu un interval de minim 2 - 3s i i va schimba culoarea
(minim 4 culori).i celelalte mesaje se vor mica orizontal pe centrul ecranului de la dreapta spre
stnga n ciclu periodic.

Mersul lucrrii:
Se presupune c sistemul nostru de operare va lucra n regim DOS , de aceea e nevoie s
instalm o main virtual cu setrile corespunztoare.

Fig 1. Setrile mainei virtuale create


n continuare este nevoie s scriem codul nostru n limbaj de asamblare, care va fi citit de
pe dischet.
[BITS 16]

;Tells the assembler that its a 16 bit code

[ORG 0x7C00]

;Origin, tell the assembler that where the code will be in memory after it is bee n loaded

Prin aceast porune de cod de la nceputul programului comunicm asamblorului c


avem un cod pe 16 bii i adresa de la care va ncepe citirea codului.
Pentru realizarea sarcinii de afiare a 4 mesaje pe centrul ecranul am realizat urmtoarele
proceduri, care folosesc ntreruperile BIOS:
-

WriteString procedur de afiare a unui ir de caractere pe eran , care folosete funcia

0x13 a ntreruperii 0x10.


-

Delay procedur de realizeare a unei reineri de 800 milisecunde , care folosete


funcia 0x86 a ntreruperii 0x15.

ClearScreen curarea ecranului . Funcia 0x06 a ntreruperii 0x10

WriteMessages procedura ce afieaz string-urile din toate 8 offset-uri la coordonata


anumit a ecranului. Procedura data apeleaz procedura WriteString.

Decrement procedura decrementeaz coordonata x a tuturor mesajelor de pe ecran .

RestartMessages procedura restabilete poziia mesajelor n partea extreme din dreapta.

Divide procedura mparte contorul principal din funcia main , pentru a realiza schimba
culorii la fiecare a 8-a iteraie.

main procedura principal , care reprezint un ciclu infinit, ce const dintr-un ir de


afiri i curiri a ecranului pentru a realizara micarea mesajelor afiate.
Programul sfrete cu urmtoarea poriune :

TIMES 510 - ($ - $$) db 0 ; se umple restul sectorului cu 0


DW 0xAA55

; semntura sfritului bootloader-ului

Pentru compilarea codului am folosit compilatorul NASM .

Fig 2. Compilatorul NASM


Dup compilarea fierului nostru cu extensia .asm obinem fiierul .img , pe care l
nscriem pe dischet. Dup care pornim maina virtual.

Fig 2. Rezultatul boot-rii fiierului de pe dischet


Concluzii:
n urma efecturii lucrrii de laborator am fcut cunotin cu sintaxa FASM i cu
particularitile limbajului de asamblare pentru acest compilator. Am cptat abiliti practice n
realizarea unui bootloader i am studiat ntreruperile BIOS 10h i 15h i diverse funcii ale
acestora, care le-am folosit pentru realizarea sarcinii de afiare dinamic a mesajelor.

Anex
; BIOS reads 512 bytes from cylinder: 0, head: 0, sector: 1
; of bootable floppy drive, then it loads this data into
; memory at 0000:7c00h and starts the execution from the first byte.
#fasm#

; use flat assembler syntax

#make_boot#
ORG 0x7C00

;Origin, tell the assembler that where the code will be in memory after it

is been loaded
jmp main

; Salt la punctul de intrare in program

WriteString:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;

Procedura de afisare a unui sir de caractere

;;

;;

Functia 0x13 a intreruperii BIOS 0x10

;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah, 0x13
mov al, 1

; Modul de afisare

mov bh, 0x00


int 0x10

; Codul functiei de afisare a unui sir


; Numarul paginii

; Call video interrupt

ret
Delay:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;

Procedura de efectuare a unei retineri

;;

Functia 0x86 a intreruperii BIOS 0x15

;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax

;Salvam

push cx

;continutul

push dx

;registrelor

mov ah, 0x86

; Codul functiei

mov cx, 0x3

; Durata pauzei in microsecunde (in cx bitul superior)

mov dx, 0x20

; in dx bitul inferior

(800 milisecunde)

int 0x15

; Apelarea intreruperii BIOS

pop dx

; Restabilim

pop cx

; continutul

pop ax

; registrelor

ret
ClearScreen:

; Ecranul are dimensiunea de 24x79 pixeli

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;

Procedura de curatare a ecranului

;;

Functia 0x06 a intreruperii BIOS 0x10

;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax

; Salvam continutul

push bx

; |registrelor in starea

push cx

; in care se aflau inainte de

push dx

; apelarea functiei

mov ah, 0x06


mov al, 0
mov bh, 0x00

; Codul functiei
; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
; Setarile grafice (culoarea fundalului pentru liniile curatate)

mov ch, 0

; Rindul din care incepe curatarea

mov cl, 0

; Coloana din care incepe curatarea

mov dh, 24

; Rindul in care sfirseste curatarea

mov dl, 79

; Coloana in care sfirseste curatarea

int 0x10

; Apelarea intreruperii BIOS

pop dx

; Restabilim

pop cx

; continutul

pop bx

; registrelor

pop ax

; in starea inainte de apelare

ret

WriteMessages:
push ax

; Salvam continutul

push bx

; registrelor in starea

push cx

; in care se aflau inainte de

push dx

; apelarea functiei

mov bp, str1

; salvam offsetul mesajului in bp (Hello World!)

mov bl, 0001

; setam codul culorii

mov cx, word[str1_len]


mov dh, 10

; incarcam in cx numarul de caractere a sirului

; rindul din care incepe afisarea

mov dl, [str1_x]

; coloana din care incepe afisarea

call WriteString
mov bp, str2

; salvam offsetul mesajului in bp (This is )

mov bl, 0001

; setam codul culorii

mov cx, word[str2_len]


mov dh, 11

; incarcam in cx numarul de caractere a sirului

; rindul din care incepe afisarea

mov dl, [str2_x]

; coloana din care incepe afisarea

call WriteString
mov bp, str3

; salvam offsetul mesajului in bp (my new )

mov bl, 0001

; setam codul culorii

mov cx, word[str3_len]


mov dh, 11

; incarcam in cx numarul de caractere a sirului

; rindul din care incepe afisarea

mov dl, [str3_x]

; coloana din care incepe afisarea (adaugam la coloana initiala lungimea

sirului afisat anterior)


call WriteString
mov bp, str4

; salvam offsetul mesajului in bp (test OS.)

mov bl, 0001

; setam codul culorii

mov cx, word[str4_len]

; incarcam in cx numarul de caractere a sirului

mov dh, 0xB

; rindul din care incepe afisarea

mov dl, [str4_x]

; coloana din care incepe afisarea (adaugam la coloana initiala lungimea

sirului afisat anterior)

call WriteString
mov bp, str5

; salvam offsetul mesajului in bp (Enjoy )

mov bl, 0001

; setam codul culorii

mov cx, [str5_len]


mov dh, 12

; incarcam in cx numarul de caractere a sirului


; rindul din care incepe afisarea

mov dl, [str5_x]

; coloana din care incepe afisarea

call WriteString
mov bp, str6

; salvam offsetul mesajului in bp (it!)

mov bl, 0001

; setam codul culorii

mov cx, [str6_len]


mov dh, 12

; incarcam in cx numarul de caractere a sirului


; rindul din care incepe afisarea

mov dl, [str6_x]

; coloana din care incepe afisarea (adaugam la coloana initiala lungimea

sirului afisat anterior)


call WriteString
mov bp, str7

; salvam offsetul mesajului in bp (Popov )

mov bl, [color]

; setam codul culorii

mov cx, [str7_len]


mov dh, 13

; incarcam in cx numarul de caractere a sirului


; rindul din care incepe afisarea

mov dl, [str7_x]

; coloana din care incepe afisarea

call WriteString
mov bp, str8

; salvam offsetul mesajului in bp (Eugen)

mov bl, [color]

; setam codul culorii

mov cx, [str8_len]


mov dh, 13

; incarcam in cx numarul de caractere a sirului


; rindul din care incepe afisarea

mov dl, [str8_x]

; coloana din care incepe afisarea (adaugam la coloana initiala lungimea

sirului afisat anterior)


call WriteString
pop dx

; Restabilim

pop cx

; continutul

pop bx

; registrelor

pop ax

; in starea inainte de apelare

ret
Decrement:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;

Procedura decrementeaza coordonatele de afisare

;;

a mesajelor pentru a realiza miscarea acestora

;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov al, [str1_x]
sub al, 1
mov [str1_x], al
mov al, [str2_x]
sub al, 1
mov [str2_x], al
mov al, [str3_x]
sub al, 1
mov [str3_x], al
mov al, [str4_x]
sub al, 1
mov [str4_x], al
mov al, [str5_x]
sub al, 1
mov [str5_x], al
mov al, [str6_x]
sub al, 1
mov [str6_x], al
ret

RestartMessages:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;

Procedura restabileste coordonatele mesajeor


in pozitia extreama din dreapta

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov byte[str1_x],62

;;

;;

mov byte[str2_x],56
mov byte[str3_x],64
mov byte[str4_x],71
mov byte[str5_x],64
mov byte[str6_x],69
ret
Divide:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Procedura imparte contorul ciclului principal la 8
;; astfel la fiecare a 8-a iteratie se reseteaza
;;

contorul schimbarii culorii mesajului

;;

;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, cx
mov bl, 8
div bl
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
mov cx, 200

; Setam contorul ciclului principal

et:
call WriteMessages

; Afisam mesajele

cmp byte[str2_x], 0

; Comparam pozitia mesajelor cu pozitia extrema din stinga

jnz et1
call RestartMessages

; Daca nu am ajuns la coordonata 0 - salt la et1


; Daca am ajuns la coordonata 0 , amplasam mesajele in pozitia

extrema dreapta
et1:
call Delay

; Apelam retinerea de 800 microsecunde

call ClearScreen

; Curatim ecram

call Decrement

; Calculam coordonatele noi ale mesajelor

call Divide

; Impartim contorul cx la 8

cmp ah, 0

; Daca restul impartirii(AH) nu este 0 - salt la et2

jnz et2
inc byte[color]

; Daca restul este 0 schimbam culoarea mesajului (la fiecarea a 8-a

iteratie)
et2:
cmp byte[color], 8

; Daca codul culorii nu este 8 - salt la et3

jnz et3
mov byte[color], 1

; Daca codul culorii este 8 - il resetam la 1

et3:
cmp cx,1

; Comparam contorul cx cu 1 pentru a verifica terminarea ciclului

jz main

; Daca contorul este 1 - salt la main. Reluam ciclul.

LOOP et
;Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;

Definima: 4 mesaje in 8 offset-uri


Lungimea fiecarui string
Coordonata pe x a fiecarui string

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
str1 db 'Hello World!', 0
str1_len dw 12
str1_x db 34
str2 db 'This is ' ,0
str2_len dw 8
str2_x db 0x1C
str3 db 'my new ' ,0
str3_len dw 7
str3_x db 36
str4 db 'test OS.' ,0
str4_len dw 8
str4_x db 43
str5 db 'Enjoy ' ,0
str5_len dw 6
str5_x db 36
str6 db 'it!' ,0

;;
;;
;;

str6_len dw 3
str6_x db 41
str7 db 'Popov ' ,0
str7_len dw 6
str7_x db 34
str8 db 'Eugen' ,0
str8_len dw 5
str8_x db 40
color db 0001

TIMES 510 - ($ - $$) db 0

;Fill the rest of sector with 0

DW 0xAA55

;Add boot signature at the end of bootloader

Bibliogfie:
1. Stackoverflow. Unsigned division in nasm. [Resurs electronic].- Regim de acces :
http://stackoverflow.com/questions/26457647/unsigned-division- in-nasm
2. Asmcommunity. Looping in NASM. [Resurs electronic].- Regim de acces :
http://www.asmcommunity.net/forums/topic/?id=30742
3. Nasm.us. The Netwide Assembler: NASM . [Resurs electronic].- Regim de acces:
http://www.nasm.us/doc/nasmdoc4.html
4. Stackoverflow. Basic NASM bootstrap. [Resurs electronic].- Regim de acces :
http://stackoverflow.com/questions/10853425/basic- nasm-bootstrap
5. Codenet. BIOS - INT 10H: . [Resurs electronic].- Regim de
acces : http://www.codenet.ru/progr/dos/int_0009.php
6. Cyberforum. DOS, 21 Assembler.
[Resurs electronic].- Regim de acces :
http://www.cyberforum.ru/assembler/thread724827.html