Documente Academic
Documente Profesional
Documente Cultură
Conversia numerelor din sistemul de numeratie zecimal intr-un alt sistem se realizeaza prin
efectuarea unui sir de impartiri succesive la valoarea bazei sistemului in care se doreste transformarea.
Realizarea a 4 siruri de transformari a unui numar dintr-un sistem de numeratie in celelalte sisteme de
numeratie
Transformarea din sistemul de numeratie zecimal in sistemul de numeratie binar:
29(10) = ?(2)
29 : 2 = 14, rest 1
14 : 2 = 7, rest 0
7 : 2 = 3, rest 1
3 : 2 = 1, rest 1
Se preia rezultatul ultimei impartiri (3 : 2 = 1 ) si restul sirului de impartiri in ordine inversa (rest
1, rest 1, rest 0, rest 1).
29(10) = 11101(2)
Transformarea din sistemul de numeratie zecimal in sistemul de numeratie octal:
29(10) = ?(8)
29 : 8 = 3, rest 5
Se preia rezultatul ultimei impartiri (29 : 8 = 3 ) si restul sirului de impartiri in ordine inversa
(rest 5).
29(10) = 35(8)
Sistemul hexazecimal este utilizat deoarece reprezentarea numerelor poate fi facuta cel mai restrans
(FB2C ocupa mai putin spatiu decat 64300).
Baza 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
10
Baza 0 1 2 3 4 5 6 7 8 9 A B C D E F
16
Se preia rezultatul ultimei impartiri (29 : 16 = 1 ) si se urmareste unde se gaseste nr. 13 in sistemul de
numeratie hexazecimal.
29(10) = 1D(16)
Note:
Numerele ilustrate in baza 10 pot fi scrise fara indicele 10.
Numerele in baza 16 pot fi scrise cu litera h dupa ele. - FB2C16 = FB2Ch
Desi este evident ca FB2C este un nr. hexazecimal, nu intotdeauna se intampla asa. 64 poate fi in baza 8,
in baza 10 sau in baza 16; 10 poate fi in baza 2, baza 8, baza 10 sau baza 16 s.am.d.
Necesitatea reprezentării în calculator a unui număr mare de caractere (cifre, litere, caractere
speciale) a condus la apariţia şi utilizarea unor coduri. Deoarece în calculatorul electronic orice
informaţie este reprezentată în sistemul binar, apare necesitatea translatării informaţiei externe,
accesibilă omului, în informaţie internă, accesibilă calculatorului, şi invers. Această translatare se
realizează prin operaţia de codificare.
Codurile în care sunt reprezentate numai numere se numesc coduri numerice. Codurile în care
sunt reprezentate numere, litere şi alte semne speciale se numesc coduri alfanumerice.
Dintre codurile alfanumerice, cele mai reprezentative sunt codurile ASCII şi EBCDIC. În ambele
cazuri se foloseşte octetul (opt poziţii binare) pentru reprezentarea unui caracter.
ASCII (American Standard Cod for Information Interchange) este un cod ce utilizează 7 cifre
binare cu care se pot realiza 27=128 de combinaţii. Pentru a asigura protecţia informaţiei în procesul de
transmitere a acesteia, se adaugă structurii codului din 7 biţi o poziţie pentru controlul de imparitate.
EBCDIC (Extended Binary Coded Decimal Interchange Code) este un cod ce utilizează 8 cifre
binare cu care se pot realiza 28=256 de combinaţii. O parte din combinaţii sunt utilizate pentru
codificarea anumitor comenzi. Fiecare caracter se reprezintă prin două simboluri din sistemul de
numeraţie hexazecimal.
Arhitectura calculatoarelor
Segmentarea memoriei
Procesoarele 8086 divid memoria in segmente. Standardul in DOS este de 64 KB. Segmentele sunt
numerotate, numerele lor fiind stocate in registrii de segment (vezi mai jos). Segmentele se pot
suprapune, iar pentru a accesa un anumit byte din segmentul respectiv se foloste offset.
Deci adresa 0000:0010 inseamna segmentul 0000h, offset 10h. Adresa reala se calculeaza inmultind
segmentul cu 16 si adunand offsetul: 0 * 16 + 16 = 16 (adresa liniara).
Instructiunile cerute de programatorul sau utilizatorul unui calculator sunt executate in unitatea centrala
de procesare (CPU). Pentru a asigura viteza de procesare, datele necesare instructiunilor sunt stocate in
zone de stocare speciale, numite registrii. Desi viteza de acces la datele din registrii este mai mare decat
la datele din memorie, numarul de registrii dintr-un CPU este limitat, astfel ca in registrii se regasesc
doar datele utilizate la momentul respectiv.
Segment Registers
CS
DS Data Segment 16-bit number that points to the active data-segment
Co
de
Seg
me
nt1
6-
bit
nu
mb
er
tha
t
poi
nts
to
the
act
ive
Arhitectura calculatoarelor
co
de-
seg
me
nt
SS Stack Segment 16-bit number that points to the active stack-segment
ES Extra Segment 16-bit number that points to the active extra-segment
Poi
nte
r
Re
gis
ter
s
IP
SPI
nst
ruc
tio
n
Poi
nte
r16
-
bit
nu
mb
er
tha
t Stack Pointer 16-bit number that points to the offset that the stack is using
poi
nts
to
the
off
set
of
the
ne
xt
ins
tru
cti
on
BP Base Pointer used to pass data to and from the stack
Ge
ne
ral
-
Pu
rpo
se
Arhitectura calculatoarelor
Re
gis
ter
s
AX
BX
Acc
um
ula
tor
Re
gis
ter
mo
stl
y
use
d Base Register Only register that can be used as an index
for
cal
cul
ati
ons
an
d
for
inp
ut/
out
put
CX Count Register register used for the loop instruction
DX Data Register input/output and used by multiply and divide
Ind
ex
Re
gis
ter
s
SI
DIS Destination Index used by string operations as destination
our
ce
Ind
ex
use
d
by
stri
ng
op
era
tio
Arhitectura calculatoarelor
ns
as
sou
rce
Regitrii generali pot fi impartiti. AX contine de exemplu AH si AL, unde AH contine byte-ul semnificativ
(high byte) din AX si AL contine byte-ul putin semnificsativ (Low byte). La fel vom avea: BH, BL, CH, CL,
DL, DH
Deci, daca DX contine 1234h, DH va fi 12h si DL va fi 34h.
In plus, exista registrul FLAG, ce contine 9 biti de stare (pot avea valorile SET (1) sau NOT SET (0)).
Flags Register
Abr. Name bit nº Description
OF Overflow Flag 11 indicates an overflow when set
DF Direction Flag 10 used for string operations to check direction
IF Interrupt Flag 9 if set, interrupt are enabled, else disabled
TF Trap Flag 8 if set, CPU can work in single step mode
SF Sign Flag 7 if set, resulting number of calculation is negative
ZF Zero Flag 6 if set, resulting number of calculation is zero
AF Auxiliary Carry 4 some sort of second carry flag
PF Parity Flag 2 indicates even or odd parity
CF Carry Flag 0 contains the left-most bit after calculations
Pentru a ne obisnui cu lucrul in limbaj de asamblare, vom scrie un prim program. Copiati codul de mai jos
in notepad si salvati-l cu denumirea lab1.asm in folderul continand programul tasm.
Arhitectura calculatoarelor
.model small
.stack
.data
message db "Hello world, I'm learning Assembly !!!", "$"
.code
main proc
mov ax,seg message
mov ds,ax
mov ah,09
lea dx,message
int 21h
mov ax,4c00h
int 21h
main endp
end main
Explicatii
.model small : Liniile care incep cu "." sunt folosite pentru a furniza diferite informatii catre programul
de asamblare. In acest caz, ii spunem programului ca avem un cod mic, ce nu necesita multa memorie.
.stack : Alta linie de informare. Segmentul de stiva incepe aici. Stiva este utilizata pentru stocarea
datelor temporare. In acest program stiva nu va fi folosita, dar deoarece am asamblat codul intr-un
fisier .exe, aceasta linie trebuie sa fie prezenta.
main proc : Codul trebuie scris in proceduri, intocmai ca in limbajul C. Aici indicam inceputul unei
proceduri numite main. main endp va indica finalul procedurii. Procedurile trebuie sa aiba un start si un
end. end main: indica finalul programului. De asemenea indica asamblorului de unde sa inceapa
programul, in cazul nostrum procedura main.
message db "xxxx" : DB inseamna Define Byte. Instructiunea defineste in segmentul de date o serie de
bytes. Acestia contin informatia din ghilimele. "Message" e un nume pentru a identifica acest string.
mov ax, seg message : AX e un registru (vezi mai sus). MOV este o instructiune care muta datele. In acest
caz se muta din seg message in ax. Seg message poate fi interpretat ca un numar. Este numarul ce
reprezinta segmentul in care este stocat "message". Trebuie sa stim acest numar pentru a putea incarca
Arhitectura calculatoarelor
registrul DS, altfel nu vom putea prelua sirul de caractere in memorie. Trebuie deci sa stim unde este
localizat acest sir in memorie. Acest numar il preluam in AX.
mov ds,ax : Dupa ce am trecut numarul reprezentand segmentul in care se afla sirul in ax, vom trece
aceasta informatie din ax in ds. DS nu poate fi incarcat direct, deci sunt necesare ambele instructiuni.
mov ah, 09 : Din nou MOV. In acest caz, se incarca constanta 09 in AH (parte din ax).
lea dx, message : LEA = Load Efective Address. Aceasta instructiune stocheaza offsetul din segmentul
unde avem mesajul in registrul DX. Dupa cum am precizat, pentru adresa din memorie avem nevoie si de
segment si de offset. Deci avem acum DS:DX.
int 21h : Aceasta instructiune cauzeaza un interrupt. Procesorul apeleaza o rutina in memorie, iar 21h ii
spune ce rutina, in acest caz o rutina DOS. INT este o instructiune foarte importanta despre care vom mai
discuta. Deocamdata ganditi-va ca apeleaza o procedura de DOS. Procedura se uita in AH sa vada ce are
de facut si va gasi codul 9, ceea ce indica afisarea unui string pe ecran.
int 21h : Din nou INT. De data aceasta AH va contine 4Ch (AX = 4C00 -> AH=4Ch si AL=00h), iar procedura
DOS va interpreta aceasta ca „iesire program”. Valoare din AL este utilizata ca un „cod de iesire” 00h
inseamna "fara eroare"
Tlink va crea fisierul executabil. Atentie! Tlink se aplica pe fisierul .OBJ si nu pe .ASM
Arhitectura calculatoarelor
Aplicatia2
.model tiny
include io.h ; Fisierul IO.H definit in lucrarea
; Gh. Musca - "Programare in limbaj de asamblare"
Afisarea de linii color ;
peEditura
ecran, Teora,
in mod Bucuresti
256 culori.
1997, pagina 306.
.stack
.data
.code
start: ; Definirea punctului de intrare in program
init_ds_es ; Initializarea registrelor DS si ES
mov ax,13h ; Setarea modului video, AH=00h serviciul de
; selectare a modului video, AL=13h modul 13h
int 10h ; Lansarea in lucru a serviciilor Video BIOS
mov ax,09fc0h ; Adresa zonei tampon video
mov es,ax ; Incarca registrul ES cu care se lucreaza
mov bx,200 ; Stabilire baza de desenare
mov al,36 ; Stabilirea culorii initiale