You are on page 1of 9

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:
st.gr. TI-143Fiodor Alexandru

Chiinu 2016

A verificat:
lect. univer. Colesnic V.

Obiective:
Dezvoltarea propriului bootloader.
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 0
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:
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 func ia 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 :

db 510 - ($ - $$) db 0

; se umple

DW 0xAA55h

; semntura

restul sectorului cu 0
sfritului bootloader-ului

Pentru compilarea codului am folosit compilatorul emu8086 .

Fig 1. Compilatorul emu8086

Fig 2.- Rezultatul boot-rii

Concluzii:
n urma efecturii lucrrii de laborator am fcut cunotin 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 leam folosit pentru realizarea sarcinii de afiare dinamic a mesajelor.

Anex
#make_boot#
org 7c00h

; set location counter.

==========
;clear
=================
PrintMsg MACRO line, msg, color, col
mov al, 1
mov bh, 0
mov bl, color
mov dl, col
mov dh, line
push cs
pop es
mov bp, offset msg
mov ah, 13h
int 10h
ENDM
Wait_t MACRO
LOCAL delay, delay2
mov si, 0
count dw 0
coll db 34
coll2 db 39
var db 6
delay:
nop
inc si
cmp si,10
jnz delay
inc count
mov si, 0
cmp count, 6
jz delay2
clear2
mov cx, firstpart
PrintMsg 9, msg0, 11, coll
mov cx, secondpart
PrintMsg 9, msg00, 11, coll2
mov cx, firstpart
PrintMsg 10, msg1, 2, coll
mov cx, secondpart
PrintMsg 10, msg11, 2, coll2
mov cx, firstpart
PrintMsg 11, msg2, 3, coll
mov cx, secondpart

PrintMsg 11, msg22, 3, coll2


dec coll
dec coll2
cmp coll, 0
jz iterate
jmp delay
iterate:
mov coll, 35
mov coll2, 40
jmp delay
delay2:
clear
clear
mov cx, firstpart
add cx, secondpart
PrintMsg 12, msg3, var, 35
mov count, 0
inc var
cmp var,12
jz switch
jmp delay
switch:
mov var, 5
jmp delay
ENDM
clear MACRO
PUSHA
MOV AH, 7
MOV AL, 0
MOV CL, 0
MOV CH, 12
MOV DL, 80
MOV DH, 40
INT 10h
POPA
ENDM
clear2 MACRO
PUSHA
MOV AH, 7
MOV AL, 0
MOV CX, 0
MOV DL, 80
MOV DH, 11
INT 10h
POPA
ENDM
firstpart dw ?
secondpart dw ?
mov cx, size0 - offset msg0

jmp size0
msg0 db 'Mesaj'
size0:
PrintMsg 9, msg0, 11, 35
mov firstpart, cx
mov cx, size00 - offset msg00
jmp size00
msg00 db ' 0'
size00:
PrintMsg 9, msg00, 11, 40
mov secondpart, cx
mov cx, size1 - offset msg1
jmp size1
msg1 db 'Mesaj'
size1:
PrintMsg 10, msg1, 2, 35
mov cx, size11 - offset msg11
jmp size11
msg11 db ' 1'
size11:
PrintMsg 10, msg11, 2, 40
mov cx, size2 - offset msg2
jmp size2
msg2 db 'Mesaj 2'
size2:
PrintMsg 11, msg2, 3, 35
mov cx, size22 - offset msg22
jmp size22
msg22 db ' 2'
size22:
PrintMsg 11, msg22, 3, 40
mov cx, size3 - offset msg3
jmp size3
msg3 db 'Mesaj 3'
size3:
PrintMsg 12, msg3, 5, 35
Wait_t
db 510-($-clrs) dup(0)
dw 0AA55h

Bibliogfie:

1. Codenet. BIOS - INT 10H: . [Resurs electronic].- Regim de acces :


http://www.codenet.ru/progr/dos/int_0009.php
2. Cyberforum. DOS, 21 Assembler.
[Resurs electronic].- Regim de acces :
http://www.cyberforum.ru/assembler/thread724827.html