Академический Документы
Профессиональный Документы
Культура Документы
Raport
La Sisteme de Operare: Mecanisme interne i principii de proiectare
A efectuat:
A verificat:
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.
[ORG 0x7C00]
;Origin, tell the assembler that where the code will be in memory after it is bee n loaded
Divide procedura mparte contorul principal din funcia main , pentru a realiza schimba
culorii la fiecare a 8-a iteraie.
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#
#make_boot#
ORG 0x7C00
;Origin, tell the assembler that where the code will be in memory after it
is been loaded
jmp main
WriteString:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah, 0x13
mov al, 1
; Modul de afisare
ret
Delay:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax
;Salvam
push cx
;continutul
push dx
;registrelor
; Codul functiei
; in dx bitul inferior
(800 milisecunde)
int 0x15
pop dx
; Restabilim
pop cx
; continutul
pop ax
; registrelor
ret
ClearScreen:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push ax
; Salvam continutul
push bx
; |registrelor in starea
push cx
push dx
; apelarea functiei
; Codul functiei
; Numarul de rinduri care vor fi scroll-ate (al=0 -curata ecranul)
; Setarile grafice (culoarea fundalului pentru liniile curatate)
mov ch, 0
mov cl, 0
mov dh, 24
mov dl, 79
int 0x10
pop dx
; Restabilim
pop cx
; continutul
pop bx
; registrelor
pop ax
ret
WriteMessages:
push ax
; Salvam continutul
push bx
; registrelor in starea
push cx
push dx
; apelarea functiei
call WriteString
mov bp, str2
call WriteString
mov bp, str3
call WriteString
mov bp, str5
call WriteString
mov bp, str6
call WriteString
mov bp, str8
; Restabilim
pop cx
; continutul
pop bx
; registrelor
pop ax
ret
Decrement:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, cx
mov bl, 8
div bl
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FUNCTIA PRINCIPALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
mov cx, 200
et:
call WriteMessages
; Afisam mesajele
cmp byte[str2_x], 0
jnz et1
call RestartMessages
extrema dreapta
et1:
call Delay
call ClearScreen
; Curatim ecram
call Decrement
call Divide
; Impartim contorul cx la 8
cmp ah, 0
jnz et2
inc byte[color]
iteratie)
et2:
cmp byte[color], 8
jnz et3
mov byte[color], 1
et3:
cmp cx,1
jz main
LOOP et
;Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
DW 0xAA55
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