Sunteți pe pagina 1din 9

Arhitectura calculatoarelor

Laborator 1: Introducere in ASM

1.1. SISTEME DE NUMERATIE

Necesitatea reprezentarii caracterelor numerice s-a materializat in aparitia si existenta simultana


a unor diferite sisteme de numeratie.
Un sistem de numeratie este format din totalitatea regulilor de reprezentare a numerelor cu
ajutorul unor simboluri numite cifre. Sistemele de numeratie sunt de doua feluri: pozitionale si
nepozitionale.
In sistemele de calcul se folosesc in special sisteme de numeratie pozitionale, datorita simplitatii
de reprezentare si de efectuare a calculelor aritmetice. Acestea se definesc ca sisteme de numeratie, in
valoarea unei cifre din cadrul unui numar este determinata de pozitia ei in cadrul numarului. Fiecare
sistem de numeratie pozitional contine un alfabet format din cifre si litere al caror numar este egal cu
baza sistemului respectiv.

Sistemul de numeratie pozitional poate fi:


- binar - este format numai din doua cifre, 0 si 1.
- octal - format din opt cifre:0,1,2,3,4,5,6,7.
- zecimal - format din zece cifre: 0,1,2,3,4,5,6,7,8,9.
- hexazecimal – sunt utilizate simbolurile 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.

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 foloseste cifrele de la 0 la 9 si literele de la A la F (16 caractere), A fiind


echivalentul numarului 10 (in sistem zecimal), B = 11, C=12 samd. Valoarea se poate calcula folosind
puterile lui 16.

FB2C16 = 12 * 160 + 2 * 161 + 11 * 162 + 15 * 163 = 12 + 32 + 2816 + 61440 = 64300


Arhitectura calculatoarelor

Sistemul hexazecimal este utilizat deoarece reprezentarea numerelor poate fi facuta cel mai restrans
(FB2C ocupa mai putin spatiu decat 64300).

Transformarea din sistemul de numeratie zecimal in sistemul de numeratie hexazecimal:


29(10) = ?(16)
29 : 16 = 1, rest 13

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)

Intelegerea limbajului assembler se bazeaza pe intelegerea sistemelor numerice. Daca in general


oamenii utilizeaza sistemul decimal, calculatorul utilizeaza sistemul binar (cu 2 cifre – 0 si 1) iar in
anumite cazuri este mai utila folosirea sistemului hexazecimal (16 caractere, de la 0 la 9 si de la A la F).

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.

1.2 CODURI DE REPREZENTARE A DATELOR

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

1.3. Utilizarea memoriei


Cea mai mica unitate a memoriei este bitul. Un bit stocheaza in memoria calculatorului un
caracter (1 sau 0).
Unitatea de baza este insa un set de 8 biti ce formeaza un octet (byte). Aceasta este cea mai mica
unitate adresabila a memoriei. Bitii dintr-un byte se numeroteaza de la dreapta spre stanga, de la 0 la 7,
0 fiind cel mai putin semnificativ.

Alte grupari comune a octetilor sunt:


word – cuvant: 2 bytes (16 octeti)
double word : 4 bytes, 32 biti
quad word: 8 bytes, 64 biti
paragraph: 16 bytes, 128 biti

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

1.3. Registrii procesorului

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.

Procesoarele 8086 au 14 registrii pe 16 biti, dupa cum observati mai jos:

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

1.4. “Hello world”

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

Pentru a asambla acest cod, urmati pasii de mai jos:


1. De la meniul start, alegeti optiunea run si tastati cmd
2. Navigati spre folderul unde se regaseste programul tasm (ex.: cd c:\asm)
3. Scrieti in consola edit lab1.asm
4. Scrieti codul si apoi salvati fisierul
5. Scrieti in consola: tasm /zi /la lab1.asm
6. Scrieti in consola tlink lab1.obj
7. Rulati fisierul lab1.exe

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.

.data : indica inceputul segmentului de date, si sfarsitul segmentului de stiva

.code : indica inceputul segmentului de cod si sfarsitul segmentului de date

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.

mov ax, 4c00h : Incarca registrul AX cu valoarea 4c00h

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"

Tasm este Turbo assambler – asamblor al firmei Borland.


Pentru o lista de comenzi posibile tastati tasm /? In mod consola
Tasm lab1.asm asambleaza fisierul de cod lab1.asm si genereaza fisierul lab1.obj. optiunea /zi afiseaza
toate informatiile de debug (utile in cazul unor erori de sintaxa).

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

iar: ; Revenire in bucla


mov cx,320 ; Numarul de repetari ale lui STOSB
rep stosb ; Memoreaza in mod repetat (de 320 ori)
; continutul lui AL la adresa
; ES:DI din memoria video
inc al ; Incrementeaza numarul culorii
dec bx ; Decrementeaza continutul lui BX
jnz iar ; Salt daca nu-i rezultat nul in BX

mov ah,08h ; Functia de citire fara


int 21h ; ecou de la tastatura
mov ax,03h ; Functia de citire a
int 10h ; pozitiei si dimensiunii cursorului
mov ah,4ch ; Functia de
int 21h ; terminare program end start ; Sfarsit
sursa si precizarea pt. de intrare

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