+ All Categories
Home > Documents > lab3_somipp

lab3_somipp

Date post: 26-Feb-2018
Category:
Upload: jen4ik
View: 218 times
Download: 0 times
Share this document with a friend
33
Universitatea Tehnică a Moldovei  Catedr a Autom atică ș i T ehnol ogi i Inf ormaț io nale Raport La Si st eme de Operare: Mec anisme interne și principii d e proiectare  Lucrarea de laborator Nr.3 Tema :  Tratarea excepț iilor   A efect uat: A verifi c at :  st.gr . SI- 131 Popo v Eu gen l ect. asist.Ostapenco S.  Chișinău 2015 
Transcript
Page 1: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 1/33

Universitatea Tehnică a Moldovei 

Catedra Automatică și Tehnologii Informaționale 

RaportLa Sisteme de Operare: Mecanisme interne și principii de proiectare 

Lucrarea de laborator Nr.3 

Tema : Tratarea excepțiilor  

A efectuat: A verificat: 

st.gr. SI-131 Popov Eugen lect. asist.Ostapenco S. 

Chișinău 2015 

Page 2: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 2/33

Page 3: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 3/33

Mersul lucrării 

Lucrarea de laborator constă din trei parți: elaborarea preloaderului, bootloader-ului și

elaborarea kernel-ului. Acestea trebuie înscrise pe sectorul de boot, sectorul 2 și respectiv pe

sectorul 9 (conform variantei).

În bootloader și în kernel am folosit următoarele proceduri: -  WriteString  – procedură de afișare a unui șir de caractere pe eran , care folosește funcția

0x13 a întreruperii 0x10. 

-   Delay – procedură de realizeare a unei rețineri de 5 secunde , care folosește funcția 0x86

a întreruperii 0x15. 

-  ClearScreen – curățarea ecranului . Funcția 0x06 a întreruperii 0x10 

-  WriteMessages – procedura ce afișează string-urile din toate 8 offset-uri la coordonata

anumită a ecranului. Procedura data apelează procedura WriteString. 

-   Beep – procedura ce efectuează un sunet la accesarea tastei enter. 

-   ReadSector –  procedura citește kernelul de pe sectorul dischetei și îl încarcă în memorie 

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

afișări și curățiri a ecranului pentru a realizara mișcarea mesajelor afișate.  

Pentru a înscrie fișierele pe dischetă am folosit programul Emu8086. 

Fig. 1 Folosirea Emu8086 pentru înscrierea pe floppy virtual 

Page 4: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 4/33

Această imagine a dischetei o înscriem pe floppy-ul virtual cu ajutorul softului RawWrite. 

Fig. 2 Înscrierea imaginii dischetei pe floppy-ul virtual 

La pornirea sistemului în VirtualBox vedem următoarele: 

Fig. 3 Încărcarea preloader-ului 

Page 5: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 5/33

În continuare la accesarea tastei ENTER se va încărca elemental GUI . 

Fig. 4 Încărcarea kernel-ului 

Dacă este depistată o eroare de disc, vedem următoarele.  

Fig. 5 Eroare de citire 

Page 6: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 6/33

După încărcare controlul este transmis kernel-ului. 

Fig. 5 Kernel-ul 

Page 7: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 7/33

Concluzii 

În urma efectuării lucrării de laborator am consolidat cunoștințele în lucrul cu softul

EMU 8086 și cu particularitățile limbajului de asamblare pentru acest emulator. Am căpătat

abilități practice în realizarea unui bootloader și kernel , am studiat întreruperile BIOS 10h, 12h,

13h, 16h și diverse funcții ale acestora, care le-am folosit pentru realizarea sarcinii de afișare

dinamică a mesajelor, tratarea erorilor și citire de pe sectorul dischetei. 

Page 8: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 8/33

Bibliografie 

1.  dreamincode. [ASM] Load Kernel From Bootloader. [Resursă electronică].- Regim de

acces : 

http://www.dreamincode.net/forums/topic/262898-asm-load-kernel-from-bootloader/  

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.  Codenet. Функции BIOS - INT 13H: дисковый ввод-вывод. [Resursă electronică ]. -

Regim de acces : http://www.codenet.ru/progr/dos/int_0012.php 

7.  Codenet. Функции BIOS - INT 12H: размер используемой памяти. [Resursă

electronică].- Regim de acces : http://www.codenet.ru/progr/dos/int_0011.php 

Page 9: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 9/33

Anexă 

Anexa A. Codul sursă a preloader-ului

#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, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10 

; Call video interrupt 

ret 

WriteMessages: 

 push ax ; ? Salvam continutul 

 push bx ; | registrelor in starea

 push cx ; | in care se aflau inainte de 

 push dx ; L apelarea functiei 

mov bp, str1 ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 0ch ; setam codul culorii 

mov cx, word[str1_len] ; incarcam in cx numarul de caractere a sirului 

mov dh, 10 ; rindul din care incepe afisarea 

mov dl, [str1_x] ; coloana din care incepe afisarea 

Page 10: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 10/33

call WriteString 

mov bp, str2 ; salvam offsetul mesajului in bp (This is ) 

mov bl, 0ch ; setam codul culorii 

mov cx, word[str2_len] ; incarcam in cx numarul de caractere a sirului 

mov dh, 11 ; rindul din care incepe afisarea 

mov dl, [str2_x] ; coloana din care incepe afisarea 

call WriteString 

 pop dx ; ? Restabilim

 pop cx ; | continutul 

 pop bx ; | registrelor  

 pop ax ; L in starea inainte de apelare

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  

Page 11: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 11/33

 pop dx ; Restabilim 

 pop cx ; continutul 

 pop ax ; registrelor

ret

 beep:

mov ah, 02h 

mov dl, 07h 

int 21h 

ret

ReadSector: 

 push ax 

 push bx 

 push cx 

 push dx

call beep 

call Delay

 pop dx 

 pop cx 

 pop bx 

 pop ax 

mov ah, 02h 

mov al, 1 

mov ch, 0 

mov cl, 9 

mov dh, 0 

Page 12: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 12/33

;mov dl, 0 

mov bx, 0800h 

mov es, bx

mov bx, 0

int 13h

; integrity check: 

;cmp es:[0000],0E9h ; first byte of kernel must be 0E9 (jmp). 

;je integrity_check_ok

integrity_check_ok: 

; pass control to kernel: 

 jmp 0800h:0000h 

ret 

;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

main: 

call WriteMessages

mov ah , 00h 

int 16h

cmp al, 1bh 

 jnz here

int 19h

here: 

cmp al,13

 je ReadSector

Page 13: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 13/33

;Data

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

;; Definima: 4 mesaje in 8 offset-uri ;; 

;; Lungimea fiecarui string ;; 

;; Coordonata pe x a fiecarui string ;; 

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

str1 db 'Restart-ESC', 0 

str1_len dw 11 

str1_x db 34 

str2 db 'Load kernel-ENTER' ,0

str2_len dw 17

str2_x db 34

TIMES 510 - ($ - $$) db 0  ;Fill the rest of sector with 0 

DW 0xAA55  ;Add boot signature at the end of bootloader  

Page 14: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 14/33

Anexa B. Codul sursă al kernel-ului 

#make_bin#

; 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.  

mov ax, 0 

mov bx, 0 

mov cx, 0 

mov dx, 0 

 jmp main ; Salt la punctul de intrare in program

WriteString1: 

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

;; Procedura de afisare a unui sir de caractere ;; 

;; Functia 0x13 a intreruperii BIOS 0x10 ;; 

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

mov ah, 0x13  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt 

ret 

Delay1: 

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

;; Procedura de efectuare a unei retineri ;; 

;; Functia 0x86 a intreruperii BIOS 0x15 ;; 

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

Page 15: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 15/33

 push ax ;Salvam 

 push cx ;continutul 

 push dx ;registrelor  

mov ah, 0x86 ; Codul functiei 

mov cx, 0x2E ; Durata pauzei in microsecunde (in cx bitul superior) 

mov dx, 0xE0 ; in dx bitul inferior (800 milisecunde) 

int 0x15 ; Apelarea intreruperii BIOS  

 pop dx ; Restabilim 

 pop cx ; continutul 

 pop ax ; registrelor

ClearScreen1:

; 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 ; L apelarea functiei 

mov ah, 0x06 ; Codul functiei 

mov al, 0 ; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul) 

mov bh, 0x00 ; Setarile grafice (culoarea fundalului pentru liniile curatate) 

mov ch, 0 ; Rindul din care incepe curatarea 

mov cl, 0 ; Coloana din care incepe curatarea 

Page 16: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 16/33

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 ; L in starea inainte de apelare 

ret 

WriteMessage: 

 push ax ; Ă Salvam continutul 

 push bx ; | registrelor in starea

 push cx ; | in care se aflau inainte de 

 push dx ; L apelarea functiei 

mov bp, str1 ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, byte[color] ; setam codul culorii 

mov cx, 8 ; incarcam in cx numarul de caractere a sirului 

mov dh, 10 ; rindul din care incepe afisarea 

mov dl, 35 ; coloana din care incepe afisarea 

call WriteString1

mov bp, str2 ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 4 ; setam codul culorii 

mov cx, 10 ; incarcam in cx numarul de caractere a sirului 

mov dh, 8 ; rindul din care incepe afisarea 

mov dl, 34 ; coloana din care incepe afisarea 

call WriteString1 

Page 17: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 17/33

mov bp, str3 ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 4 ; setam codul culorii 

mov cx, 23 ; incarcam in cx numarul de caractere a sirului 

mov dh, 9 ; rindul din care incepe afisarea 

mov dl, 27 ; coloana din care incepe afisarea 

call WriteString1 

 pop dx ; Ă Restabilim

 pop cx ; | continutul 

 pop bx ; | registrelor  

 pop ax ; L in starea inainte de apelare

ret

;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

main: 

call ClearScreen1

call WriteMessage ; Afisam mesajele

call Delay1 

cmp byte[color], 15 

 jne et 

mov byte[color], 0 

et: 

inc byte[color] 

 jmp main

;Data

Page 18: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 18/33

str1 db 'Popov OS!', 0 

str11_len db 8

color db 3 

str11_x db 34 

str2 db 'Kernel 1.0',0 

str3 db 'Release date 11.10.2015',0 

TIMES 512 - ($ - $$) db 0  ;Fill the rest of sector with 0 

Page 19: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 19/33

Anexa C. Codul sursă a loader-ului

#make_bin# 

#AX=0000h# 

#BX=0000h# 

#CX=0000h# 

#DX=0000h# 

#SI=0000h# 

#DI=0000h# 

#BP=0000h#

mov ax,0800h 

mov ds, ax

 jmp main

Delay1: 

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

;; Procedura de efectuare a unei retineri ;; 

;; Functia 0x86 a intreruperii BIOS 0x15 ;; 

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

 push ax ;Salvam

 push bx 

 push cx ;continutul 

 push dx ;registrelor  

mov ah, 0x86 ; Codul functiei 

mov cx, 0x13 ; Durata pauzei in microsecunde (in cx bitul superior)  

mov dx, 0x88 ; in dx bitul inferior (800 milisecunde) 

Page 20: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 20/33

int 0x15 ; Apelarea intreruperii BIOS  

 pop dx ; Restabilim 

 pop cx ; continutul

 pop bx 

 pop ax ; registrelor  

ret

DrawBar: 

 push ax 

 push bx 

 push cx 

 push dx 

mov bp, offset bar ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 15 ; setam codul culorii 

mov cx, 1 ; incarcam in cx numarul de caractere a sirului 

mov dh, 10 ; rindul din care incepe afisarea 

mov dl, 33 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

mov cx, 1 ; incarcam in cx numarul de caractere a sirului 

mov dh, 10 ; rindul din care incepe afisarea 

mov dl, 49 ; coloana din care incepe afisarea 

Page 21: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 21/33

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret 

DrawBox: 

 push ax 

 push bx 

 push cx 

 push dx 

mov bp, offset symbol ; salvam offsetul mesajului in bp (Hello World!)  

mov bl, ds:[color] ; setam codul culorii 

mov cx, 1 ; incarcam in cx numarul de caractere a sirului 

mov dh, 10 ; rindul din care incepe afisarea 

mov dl, [x] ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

mov ah, 01h ;ascundem 

Page 22: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 22/33

mov cx, 2607h ;cursorul 

int 10h

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret 

DrawPercent: 

 push ax 

 push bx 

 push cx 

 push dx 

mov bp, offset percent ; salvam offsetul mesajului in bp (Hello World!)  

mov bl, 15 ; setam codul culorii 

mov cx, 1 ; incarcam in cx numarul de caractere a sirului 

mov dh, 11 ; rindul din care incepe afisarea 

mov dl, 47 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

 pop dx 

 pop cx 

 pop bx 

Page 23: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 23/33

 pop ax 

ret

ReadSector: 

mov ah, 02h 

mov al, 1 

mov ch, 0 

mov cl, 9 

mov dh, 0 

mov bx, 0600h 

mov es, bx

mov bx, 0

int 13h 

; pass control to kernel:

 jmp 0600h:0000h 

ret

CheckSector: 

 push ax 

 push bx 

 push cx 

 push dx 

mov ah, 02h 

mov al, 1 

mov ch, 0 

mov cl, 9 

mov dh, 0 

Page 24: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 24/33

mov bx, 0400h 

mov es, bx

mov bx, 0

int 13h 

mov bx, 0800h

mov es, bx

cmp al, 0

 jne c 

call Error

 b: 

mov ah , 00h 

int 16h

cmp al, 1bh 

 jne b 

int 19h 

c: 

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

Error: 

 push ax 

 push bx 

Page 25: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 25/33

 push cx 

 push dx 

mov bp, offset err_msg ; salvam offsetul mesajului in bp (Hello World!)  

mov bl, 4 ; setam codul culorii 

mov cx, 29 ; incarcam in cx numarul de caractere a sirului 

mov dh, 8 ; rindul din care incepe afisarea 

mov dl, 28 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt 

mov bp, offset reb ; salvam offsetul mesajului in bp (Hello World!)  

mov bl, 4 ; setam codul culorii 

mov cx, 36 ; incarcam in cx numarul de caractere a sirului 

mov dh, 13 ; rindul din care incepe afisarea 

mov dl, 24 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

Page 26: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 26/33

 

Message: 

 push ax 

 push bx 

 push cx 

 push dx 

mov bp, offset msg ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 15 ; setam codul culorii 

mov cx, 9 ; incarcam in cx numarul de caractere a sirului 

mov dh, 11 ; rindul din care incepe afisarea 

mov dl, 36 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret 

LoadMess: 

 push ax 

 push bx 

 push cx 

Page 27: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 27/33

 push dx 

;mov bp, offset load25+si ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 15 ; setam codul culorii 

mov cx,2 ; incarcam in cx numarul de caractere a sirului 

mov dh, 11 ; rindul din care incepe afisarea 

mov dl, 44 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

LoadComplete: 

 push ax 

 push bx 

 push cx 

 push dx 

mov bp, offset load100 ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 15 ; setam codul culorii 

mov cx, 3 ; incarcam in cx numarul de caractere a sirului 

mov dh, 11 ; rindul din care incepe afisarea 

mov dl, 44 ; coloana din care incepe afisarea 

Page 28: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 28/33

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

mov ah, 01h ;ascundem 

mov cx, 2607h ;cursorul 

int 10h 

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

PrintRAM: 

 push ax 

 push bx 

 push cx 

 push dx

mov bp, offset ram_mess ; salvam offsetul mesajului in bp

mov bl, 2 ; setam codul culorii 

mov cx, 17 ; incarcam in cx numarul de caractere a sirului 

mov dh, 0 ; rindul din care incepe afisarea 

mov dl, 0 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

Page 29: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 29/33

int 0x10  ; Call video interrupt

mov ah, 01h ;ascundem 

mov cx, 2607h ;cursorul 

int 10h 

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

DisplayRAM:

 push ax 

 push bx 

 push cx 

 push dx

int 12h

mov bl,10

div bl

or ah, 30h 

mov di,offset result

mov byte ptr[di+2],ah 

xor ah, ah 

div bl

or ah, 30h 

mov di,offset result

Page 30: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 30/33

mov byte ptr[di+1],ah 

xor ah, ah

div bl

or ah, 30h 

mov byte ptr[di],ah 

xor ah, ah 

mov bp, offset result ; salvam offsetul mesajului in bp (Hello World!) 

mov bl, 2 ; setam codul culorii 

mov cx, 3 ; incarcam in cx numarul de caractere a sirului 

mov dh, 0 ; rindul din care incepe afisarea 

mov dl, 12 ; coloana din care incepe afisarea 

mov ah, 13h  ; Codul functiei de afisare a unui sir

mov al, 1 ; Modul de afisare 

mov bh, 0x00  ; Numarul paginii 

int 0x10  ; Call video interrupt

mov ah, 01h ;ascundem 

mov cx, 2607h ;cursorul 

int 10h

 pop dx 

 pop cx 

 pop bx 

 pop ax 

ret

main:

Page 31: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 31/33

call PrintRAM 

call DisplayRAM

call DrawBar ;desanam cite o bara la inceput si sfirsit

call Message ;afisam mesajul "Loading" 

call DrawPercent ;afisam mesajul "%" 

mov bp, offset load25 ;incarcam in bp adresa ce contine valoarea 25

mov cx, 15 ; setam contorul ciclului(desenam 15 elemente) 

l:

call CheckSector  

 push bp ;salvam continutul bp pentru a incrementa valoarea acestuia

ulterior(incrementam offsetul 25, 50, 75) 

call DrawBox ;desenam un element

call Delay1 

 pop bp ;restabilim continutul bp 

mov ax, cx ;incarcam contorul in ax pentru impartirea ulterioara 

mov bl, 4

div bl ;impartim la 4 

cmp ah, 0 ;verificam daca restul inmpartirii este 0 

 jnz et2 ;daca da incrementam culoarea si offsetul pentru valoarea

 procentelor, daca nu- salt la et2 

inc color

call LoadMess

add bp, 3 

et2: 

inc x ;incrementam coordonata x pentru boxloop l

Page 32: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 32/33

call LoadComplete ;afisam mesajul "Loading 100%"

call Delay1 

call ReadSector  

 jmp $

 bar db 124

x db 34 

y db 10 

symbol db 222, 0

msg db 'Loading ',48,0

 percent db 37, 0 

load25 db 50,53,0

load50 db 53,48,0 

load75 db 55,53,0 

load100 db 49,48,48,0

ram_mess db 'Memory size: KB',0

color db 1

result db 0,0,0,0,0

err_msg db 'ERROR: Floppy disk not found!',0 

reb db 'Enter disk and press [ESC] to reboot',0 

db 512 - ($ - $$) DUP(0)  ;Fill the rest of sector with 0 

;DW 0xAA55  ;Add boot signature at the end of bootloader  

Page 33: lab3_somipp

7/25/2019 lab3_somipp

http://slidepdf.com/reader/full/lab3somipp 33/33