Sunteți pe pagina 1din 8

Universitatea Tehnica a Moldovei

Filiera Francofona „Informatica”

Rapport
La SOMIP

Lucrare de laborator nr.1

Dezvoltarea bootloader-ului de sistem

Efectuat de st. gr. FI-131

Verificat de profesorul:

Chişinău 2015
Obiective: Dezvoltarea peopriului bootloader si inscrierea acestuia pe discheta.

Condiții: Pentru acestă lucrare de laborator vom face cunostință cu limbajul de programare
assembler,
și vom utiliza întreruperile BIOS pentru a înțelege modul în care vom dezvolta propriul nostru boot
loader.
1. Afișarea pe centrul  ecranului - a unui mesaj,  ce va fi citit într-un singur offset.
2. Afișarea a 2 sau 3  mesaje pe centrul ecranului - citit minimum din 3 offset-uri.
Unul din aceste mesaje va clipi periodic cu un interval de 2 - 3s.
3.Afișarea 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 mișca orizontal pe centrul ecranului de la dreapta spre stînga în ciclu
periodic. 

Conideratii teoretice
O dischetă obişnuită foloseşte un sistem de fişiere denumit FAT( de la File Allocation Table – Tabel de alocare a
fişierelor). în urma formatării spaţiul de stocare al unei dischete este divizat în următorul fel:
Având în vedere că o dischetă are două feţe, se adună în total un număr 2880 de sectoare, care pot stoca
1,457,560 de baiţi (2880×512).
Dacă un fişier de 4 KB (4096 de baiţi) va ocupa 8 sectoare, un fişier de 500 KB (512.000 baiţi) va ocupa 1000 de
sectoare din cele disponibile.
In cel mai simplist mod putem spune ca bootloaderul este programul/codul executat in momentul în care un
computer pornește. Orice mașinărie care rulează un sistem de operare are implementat un bootloader. Bootloaderul
este o componentă foarte importantă în funcționarea oricărei astfel de mașinării și fără bootloader nu poate porni. În
bootloader pot exista anumite programe de securitate care verifică dacă sistemul ce urmează să fie încărcat este unul
autentic sau nu.
Sectorul citit de BIOS la încărcarea 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 încărcarea kernel-ului de sistem dezvoltat la
următoarele lucrări de laborator.
Atunci când BIOS-ul va citi boot loader-ul de pe primul sector al dischetei, codul compilat în fișierul nostru
ASM va fi încărcat pe adresa 0:07C00h, de unde propriu zis, vom supraîncărca regiștrii.

Crearea unui loader ce va afişa un mesaj


Datele sectorului 1 al pistei 0, dispozitivul de citire-scriere 0 şi suportul de disc 0, pentru
primul disc, care a răspuns (dischetă sau hard disc) sunt încărcate la adresa absolută 0000:7c00, iar
controlul va fi transmis la această adresă. Pentru un hard disc, acest cod din „sectorul rădăcină”
determină în realitate compartimentul activ al discului, după care încarcă şi execute sectorul rădăcină al
acestui compartiment. Prin acesta controlul este transmis si stemului de operare activ al discului.

Pentru a utiliza doar 5 culori am Pentru a deplasa mesajele in dreapta


utilizat o secventa de cod care functionezaa ecranlui atunci cind ajung la pozitia zero am
ca o instructiune «if»: utilizat un cod similar:
cmp bl,5 cmp pozitie,0
jb incrementeaza jle setCol
anuleaza: decr: mov dx,pozitie
mov bl,1 sub dl,5
jmp endifblock jmp endifpoz
incrementeaza: setCol: mov pozitie,65
inc bl; mov dx,pozitie
jmp endifblock jmp endifpoz
endifblock: endifpoz: nop
nop

Pentru inscrierea bootloaderului pe floppy se folosesc programele RawWrite, ImDisk si VirtualBox.

Fig.1- Rularea programului in emulator

Fig. 2 - Rularea programului in VirtualBox


Concluzie
In aceasta lucrare de laborator am invatat cum sa salvam si sa citim date de pe discheta virtuala. In
limbajul de asamblare am creat un fisier .bin care care se executa la incarcarea sistemului de pe discheta
afisind 4 mesaje in centrul ecranului. Primul clipeste si iti schimba culoarea fiecare 2 secunde,
urmatoarele 3 se deplaseaza de la dreapta la stinga. Intreruperile 10h și 13h sunt folosite de funcția bios
disk pentru mai multe operații asupra discurilor, în cazul dat înscrierea pe dischetă.
Bibliografie
1.Assembly if AND.[Resursa electronica].- Regim de acces:
http://stackoverflow.com/questions/7883433/assembly-if-and
2.Assembly 8086 ,range of a 16 bit register and cmp.[Resursa electronica].- Regim de acces:
http://stackoverflow.com/questions/20873016/assembly-8086-range-of-a-16-bit-register-and-cmp
3.Timer interrupts in assembly.[Resursa electronica].- Regim de acces:
http://www.microchip.com/forums/m812420.aspx
Anexa
Anexa A
Listingul programului
#make_bin# mov bl, 01h ;
mov pozitie,65
org 7c00h ; set location counter.

iteratie:
.MODEL SMALL
.STACK 100h mov dl,33 ;coloana
.DATA mov dh,9 ;rindul
mesaj DB "SOMIPP" mov cx, lmesaj
lmesaj EQU $-mesaj mov bp,offset mesaj
mesaj2 DB mov ax,1300h
lmesaj2 EQU $-mesaj2 int 10h
mesaj3 DB "Laborator nr. 1"
lmesaj3 EQU $-mesaj3
mesaj4 DB "FI-131"
push bx;
lmesaj4 EQU $-mesaj4
mov bl,9;
buf Dw ?
pozitie dw ?
cmp pozitie,0
jle setCol
.CODE
start: ;mov ax,@data
decr: mov dx,pozitie
;mov ds,ax
sub dl,5
;mov es,ax ; registrul de segment ES
jmp endifpoz
poate fi umplut cu un numar doar ;folosind
registrul AX
;mov ax,1300h ; functia BIOS-ului - setCol: mov pozitie,65

display string mov dx,pozitie


jmp endifpoz
jb incrementeaza

endifpoz: nop anuleaza:

;mesaj2 mov bl,1

mov pozitie,dx jmp endifblock

mov dh,12 incrementeaza:

mov cx, lmesaj2 inc bl;

mov bp,offset mesaj2 jmp endifblock

mov ax,1300h endifblock:

int 10h nop

;mesej3
mov bl,9

;stergem
mov dh,13 ;rindul mov buf,bx;
mov cx, lmesaj3 mov bl,0;
mov bp,offset mesaj3
mov ax,1300h mov dl,35 ;coloana
int 10h mov dh,10 ;rindul
;mesej4 mov cx, lmesaj
mov bp,offset mesaj
mov bl,9 mov ax,1300h
int 10h

mov dh,14 ;rindul


mov cx, lmesaj4 ; stergem mesaj 2
mov bp,offset mesaj4 mov dx,pozitie
mov ax,1300h mov dh,12
int 10h mov cx, lmesaj2
pop bx; mov bp,offset mesaj2
mov ax,1300h

mov buf,0 int 10h

;timer 2s ; stergem mesaj 3

MOV AH,0x86 mov dx,pozitie

MOV CX,001eh mov dh,13

MOV DX,8480h mov cx, lmesaj3

int 0x15 mov bp,offset mesaj3


mov ax,1300h
int 10h

cmp bl,5
; stergem mesaj 4 cmp dl,200
mov dx,pozitie jne iteratie
mov dh,14
mov cx, lmesaj4 Exit: mov ax,4c00h
mov bp,offset mesaj4 END Start
mov ax,1300h
int 10h INT 19h ; reboot
mov bx,buf times 510-($-$$) db 0

S-ar putea să vă placă și