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
7/25/2019 lab3_somipp
http://slidepdf.com/reader/full/lab3somipp 2/33
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
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
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
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
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.
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
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
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
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
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
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
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 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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:
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
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
7/25/2019 lab3_somipp
http://slidepdf.com/reader/full/lab3somipp 33/33