Sunteți pe pagina 1din 7

1

Arhitectura Calculatoarelor (lucrare de laborator 5)

LUCRAREA 5
PRELUCRAREA SIRURILOR
UTILIZAREA TABELELOR PENTRU CONVERSII DE CODURI
5.1. SCOPUL LUCRARII
Se prezinta probleme legate de prelucrarea in limbaj de asamblare a irurilor. Pentru aceasta se
recomanda utilizarea instruciunilor speciale pentru tratarea irurilor. Se prezinta de asemenea tehnici
specifice limbajului de asamblare pentru realizarea conversiilor de coduri, bazate pe utilizarea tabelelor de
conversie.
5.2. CHESTIUNI TEORETICE. EXEMPLE SI REZULTATE COMENTATE.
5.2.1. Tratarea irurilor
n afar de tipurile de baz, exist i posibilitatea efecturii unor operaii de transfer, sau
operaii aritmetice i logice cu iruri de date (cu informaii aflate n zone continue de memorie).
Operaiile pe iruri pot fi efectuate individual, pentru fiecare cuvnt din ir, sau automat - cu repetare,
numrul de repetri al instruciunii fiind dictat de coninutul unui registru contor.
Operaiile tipic efectuate sunt:
transferul unui ir din zon sursa n zon destinaie;
comparare ntre dou iruri;
cutarea unei valori ntr-un ir;
ncrcarea acumulatorului cu elementele unui ir;
citirea unui ir de la un port de intrare;
scrierea unui ir la un port de ieire.
Exemple :
Instruciunile MOVSB (Move (copy) bytes)
MOVSW (Move (copy) words)
MOVSD (Move (copy) doublewords)
Transfer pe 8 (16,32) bii, din zona de memorie indicat de ESI, n zona de memorie indicat
de registrul EDI. Dup transferul primului byte (word, doubleword), dac flag-ul DF=0, se petrece
autoincrementarea ESIESI+1; EDIEDI+1 (decrementare pentru DF=1).
n operaii cu iruri sunt utilizate prefixe de repetare:
REP
REPZ, REPE
REPNZ, REPNE

Repetare pn ecx>0
Repetare pn ZF=1 i ecx>0
Repetare pn ZF=0 i ecx>0

Exemplu. Fie dat s copiem 20 de cuvinte duble din irul surs source n irul destinaie target:
.data
source DWORD 20 DUP(0FFFFFFFFh)
target DWORD 20 DUP(?)
.code
cld
; direction = forward
mov ecx,LENGTHOF source ; setam contorul REP
mov esi,OFFSET source ; incarcam ESI cu adresa soursei
mov edi,OFFSET target ; incarcam EDI cu adresa destinaiei
rep movsd
;copiem cuvinte duble
Instruciunile CMPSB (Compare bytes)
CMPSW (Compare words)
CMPSD (Compare doublewords)

Arhitectura Calculatoarelor (lucrare de laborator 5)

Comparare pe 8 (16,32) bii, din zona de memorie indicat de ESI, cu zona de memorie
indicat de registrul EDI. Dup compararea primului byte (word, doubleword), dac flag-ul DF=0, se
petrece autoincrementarea ESIESI+1; EDIEDI+1 (decrementare pentru DF=1).
Exemple:
.data
source DWORD 1234h
target DWORD 5678h
.code
mov esi,OFFSET source
mov edi,OFFSET target
cmpsd
; compare doublewords
ja L1
; jump if source > target
Dac comparm cuvinte multiple:
mov esi,OFFSET source
mov edi,OFFSET target
cld ; direction = forward
mov ecx,LENGTHOF source ; repetition counter
repe cmpsd ; repeat while equal
Prefixul REPE repet compararea, incrementnd ESI i EDI n mod automat, pn cnd
ECX=0 sau o pereche de cuvinte duble nu va fi egal.
Instruciunile SCASB (SCAS- Scans a string)
SCASW
SCASD
Instruciunile compar valoarea din AL/AX/EAX cu byte, word sau doubleword din zona de memorie
indicat de EDI. Instruciunile sunt utile la cutarea unui singur element ntr-un ir.
Exemple:
.data
alpha BYTE "ABCDEFGH",0
.code
mov edi,OFFSET alpha ; incarcam EDI cu adresa
;sirului de scanat
mov al,'F'
; cautam litera F
mov ecx,LENGTHOF alpha ; setam registrul contor
cld
; direction = forward
repne scasb ; repetam pana nu este egal
jnz quit ; iesire daca litera nu a fost gasita
Instruciunile STOSB (STOS- Store string data)
STOSW
STOSD
Instruciunile ncarc valoarea din AL/AX/EAX , n memorie cu offset-ul indicat de EDI.
Incrementarea se petrece conform flag-ului DF (DF=0- incrementarea, DF=1- decrementarea).
Exemplu. irul string1 este completat cu valoarea 0FFh.
.data
Count = 100
string1 BYTE Count DUP(?)
.code
mov al,0FFh ; valoarea de de incarcat
mov edi,OFFSET string1 ; EDI cu adresa sirului
mov ecx,Count ; numarul de elemente ale sirului
cld ; direction = forward
rep stosb ; copierea AL in string1
2

Arhitectura Calculatoarelor (lucrare de laborator 5)

Instruciunile LODSB (LODS- Load Accumulator from String)


LODSW
LODSD
Instruciunile ncarc valoarea din byte, word sau doubleword din memorie idicat de ESI, n
AL/AX/EAX respectiv. Instruciunile sunt utile la cutarea unui singur element ntr-un ir.
Exemplu: Multiplicarea fiecrui element a unui ir cu o constant.
INCLUDE Irvine32.inc
.data
array DWORD 1,2,3,4,5,6,7,8,9,10 ; test data
multiplier DWORD 10
.code
main PROC
cld
; direction = forward
mov esi,OFFSET array ; sirul sursa
mov edi,esi
; sirul destinatie
mov ecx,LENGTHOF array ; setarea contorului
L1: lodsd
; incarcarea [ESI] in EAX
mul multiplier ; multiplicarea cu constanta
stosd ; copie din EAX in [EDI]
loop L1
exit
main ENDP
END main
Exemplul 1. {Mutarea unui bloc de memorie de la o adresa sursa la o adresa destinaie} Vom prezenta o
prima variant a acestei probleme care nu utilizeaz intruciuni pentru iruri.
.DATA
sir1
sir2

DB
DB

100 DUP(7)
100 DUP(?)

mov
mov
mov
mov
mov
inc
inc
loop

esi,OFFSET sir1
edi,OFFSET sir2
ecx,LENGTHOF sir1
al,[esi]
[edi],al
esi
edi
muta

.CODE

muta:

Varianta care utilizeaz instruciunea movsb este urmatoarea:


sir1
sir2

.DATA
byte
byte

100 DUP(7)
100 DUP(?)

.CODE
mov esi,OFFSET sir1
mov edi,OFFSET sir2
mov cx,LENGTHOF sir1
cld
muta:
movsb sir1,sir2
loop muta

Utiliznd prefixul rep bucla:


muta:

movsb sir1,sir2

Arhitectura Calculatoarelor (lucrare de laborator 5)


loop muta

din exemplul 1 se poate rescrie astfel:


repmovsbsir1,sir2

Exemplul 2. {Compararea a doua siruri de octei} Varianta fr prefix rep este:


.DATA
sir1
byte
sir2
byte
.CODE
mov
mov
mov
comp:
cmpsb
jne
loop
exit:
nop

'AAAABC'
'AAAACB'
esi,OFFSET sir1
edi,OFFSET sir2
ecx,LENGTHOF sir1
sir1,sir2
exit
comp

Dac la terminarea secvenei de program avem (zf)=1, atunci irurile sunt identice, altfel nu sunt
identice.
In varianta cu prefix rep bucla:
compar:
ies:

cmpsb
jne
loop
nop

sir1,sir2
ies
compar

se inlocuieste cu:
exit:

repe cmpsb
jne exit
nop

sir1,sir2

Instruciunile pentru iruri sunt in special utilizate pentru prelucrarea irurilor de caractere. irurile de
caractere sunt iruri de octei, fiecare octet reprezentnd codul unui caracter alfanumeric. In toate
exemplele prezentate pn acum, cit si in cele care vor fi prezentate de acum ncolo vom folosi pentru
reprezentarea caracterelor alfanumerice codul ASCII.
Dndu-se un ir de caractere reprezentat sub forma unui sir de coduri ASCII, se pune problema
stabilirii unei condiii de terminare a irului. Acest lucru se poate face cel puin in doua moduri:
prin plasarea la sfritul unui sir de caractere a unui caracter special, de exemplu caracterul '$' sau
caracterul nul (cu codul ASCII zero);
prin gestionarea lungimii irului de caractere respectiv. In acest caz pentru reprezentarea interna a
unui sir de caractere se poate adopta urmtoarea structura de date:

n = numarul de componente

caracter 1

caracter n

Astfel irul de caractere 'ABC' va avea urmtoarea reprezentare interna:

'A'

'B'

'C'

Pentru generarea unui sir de caractere cu reprezentarea de mai sus propunem urmtoarea tehnica:
.DATA
lung
sir
l1

DB
DB
EQU

l1
'acesta este un sir'
sizeof sir

Arhitectura Calculatoarelor (lucrare de laborator 5)

O alta modalitate eleganta ar fi construirea unei macroinstruciuni care primete numele unui sir de
caractere si coninutul acestuia si genereaz reprezentarea interna corespunztoare acestuia.
Exemplul 3. {Generarea reprezentrii interne a unui sir de caractere cu ajutorul unei macroinstruciuni}
gen_sir
l&nume
nume
et
.DATA

MACRO
LOCAL
DB
DB
EQU
ENDM

nume,continut
et
et
continut
sizeof nume

gen_sir
gen_sir
gen_sir

sir1,<'sirul 1'>
sir2,<'sirul 22'>
sir3,<'sirul 333'>

Efectul celor trei apeluri consta in generarea variabilelor octet lsir1, lsir2 si lsir3 care contin la initializare
lungimile sirurilor de caractere generate si a variabilelor sir1, sir2 si sir3 care vor contine sirurile de
caractere respective.
5.2.2. Utilizarea tabelelor de conversie.
Se considera n entitati si doua coduri binare C1 si C2. De exemplu entitatile pot fi considerate
caracterele alfanumerice, C1 codul ASCII si C2 codul EBCIDIC. Prin conversia unei entitati din codul C1
n codul C2 se intelege determinarea codului entitatii respective in C2 cunoscind codul sau n C1.
Principial, acest lucru se poate realiza astfel: se considera o tabela T numita tabela de conversie, de
dimensiune n. Al k-lea element al tabelei contine codul in C2 al entitatii care are in C1 codul k. Astfel,
fiind dat o entitate cu codul k1 in C1, codul k2 al acesteia in C2 va fi k2=T(k1). C1 se numeste cod sursa
si C2 se numeste cod destinatie.
Limbajul de asamblare conine o instructiune ce permite efectuarea rapid a conversiei de cod ntre
dou coduri ce implica cel mult 256 de entitati, adic codificarea se face pe cel mult 8 biti. Aceasta este
instructiunea xlat, cu sintaxa urmatoare:
xlat OPR
xlatb

(al) <-- ((bx)+(al))

Astfel daca registrul bx contine adresa de inceput a tabelei de conversie si registrul al contine codul
unei entitati in codul sursa, dupa executarea instructiunii xlat, in al se va obtine codul entitatii in codul
destinatie.
Exemplul 4. {Determinarea codului ASCII al unei cifre hexa} Urmatorul program (pe 16 bii) determina
si afiseaza cifrele hexa sub forma unei secvente de caractere ASCII. Pentru aceasta se foloseste tabela de
conversie asc_tbl care memoreaza codurile ASCII ale tuturor cifrelor hexa.
.DATA
asc_tbl
DATA
CODE
start:

bucl:

CODE

SEGMENT
DB
'0123456789ABCDEF'
ENDS
SEGMENT
ASSUME cs:CODE, ds:DATA
mov
ax,DATA
mov
ds,ax
mov
cx,10h
xor
al,al
mov
bx,OFFSET asc_tbl
mov
dh,al
xlatb
mov
dl,al
mov
ah,06h
int
21h
mov
al,dh
inc
al
loop
bucl
mov
ax,4c00h
int
21h
ENDS
END
start

Arhitectura Calculatoarelor (lucrare de laborator 5)

Un exemplu tipic de conversie intre doua coduri l ofer circuitele logice combinaiunile. Tehnica
tabelelor de conversie poate fi folosita pentru simularea software a acestor circuite. In acest caz tabela de
conversie este tocmai tabela de adevr a circuitului combi naional respectiv.
Tehnica tabelelor de conversie se poate folosi si in cazurile in care in funcie de valoarea unei variabile
trebuie determinata o adresa de memorie. Aceasta adresa poate reprezenta adresa unui sir de caractere (a
unui mesaj de eroare spre exemplu), sau adresa unei poriuni de cod sau a unei proceduri. In acest caz
ns, deoarece reprezentarea unei adrese se face pe 16 bii, pentru realizarea propriu zis a conversiei nu se
mai poate folosi instruciunea xlat.

5.3. PROBLEME PROPUSE (Utilizai macros i proceduri)


Toate programele din exemple s fie rulate pas cu pas n debugger.
1. S se determine rsturnatul pe loc al unui ir de octei sau cuvinte. Afiai pe ecran ambele iruri.
2. S se numere toate aparitiile secvenei, de exemplu 'XX', dintr-un ir de octei reprezentnd un ir
de caractere. Afiati pe ecran irul i rezultatul.
3. Se considera trei masive sir1, sir2, sir3 fiecare ir de caractere reprezentind o linie de text. Sa se
concateneze textele din aceste iruri n sir4, separndu-le prin un blanc. Afiati pe ecran toate irurile.
4. Se considera trei masive sir1, sir2, sir3 fiecare ir de caractere reprezentnd o linie de text. Sa se
plaseze textele din aceste iruri n sir4, astfel nct n textul rezultat, blancurile s fie nlocuite cu _ .
Afiati pe ecran toate irurile.
5. Sa se scrie un macro care primete trei adrese de memorie A1, A2, A3, concateneaza sirurile de
caractere incepind de la adresele A1 si A2 in aceasta ordine, depunind rezultatul la adresa A3. blancurile s
fie nlocuite cu @. Afiati pe ecran toate irurile.
6. Sa se scrie un macro care primeste doua adrese de memorie A1 si A2 si un caracter CAR si elimina
caracterul CAR din sirul de caractere incepind de la adresa A1, depunind rezultatul incepind de la adresa
A2. Afiai pe ecran ambele iruri.
7. Sa se scrie un macro care primeste:
doua adrese S1 si S2 reprezentind adresele a doua siruri de caractere;
doua numere intregi I si J care satisfac relatia 1, ..., I, ..., J, ,,,, N , lungimea sirului de caractere
incepind de la adresa S1;
si depune ncepnd de la adresa S2 subsirul sirului de caractere incepind de la adresa S1 cuprins intre
pozitiile I si J ale acestuia. Afiai pe ecran ambele iruri.
8. Sa se scrie un macro care primete trei adrese de memorie S1, S2 si S3 i are ca efect stergerea din
irul de caractere incepind la adresa S1 a primei aparitii a sirului de caractere incepind de la adresa S2, sirul
de caractere rezultat depunindu-se incepind de la adresa S3. Afiai pe ecran toate irurile.
9. Se considera o tabela ale carei intrari au lungimea de un cuvint. Fiecare intrare este formata din
cinci cimpuri dispuse astfel:
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0

Sa se scrie un program care afiseaza continutul tabelei sub forma unui sir de linii, pe ficare linie fiind
afisate in hexazecimal continuturile cimpurilor corespunzatoare unei intrari. Spre exemplu, daca tabela
contine doar doua intrari cu structura:
15

14

13

12

11

10

Arhitectura Calculatoarelor (lucrare de laborator 5)

0
1
1 1
1
1
0 1 0
1
0
1 0
1
0 0

1
0
1 0
1
0
0
1 1
0
1
1 0
1
1 1

se vor afisa liniile urmatoare:


3
5

1D
09

5
B

2
3

0
1

10. Se considera o tabela ale carei intrari au lungimea de un cuvint. Fiecare intrare poate avea una din
formele urmatoare:
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1 0

15 14 13 12 11 10 9
8
7
6
5
4
3
2
1 0

Sa se scrie un program care afiseaza continutul tabelei sub forma unui sir de linii, pe ficare linie fiind
afisate in hexazecimal continuturile cimpurilor corespunzatoare unei intrari. Spre exemplu, daca tabela
contine doar doua intrari cu structura:
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0

0 1
1
1 1
1
0 1
0
1 0
1
0 1
0
0

1 0
1
0
1
0 0
1
1
0
1 1
0
1
1
1

se vor afisa liniile urmatoare:


0
1

7 6 5 2
0A 0D 17

5.4. CONTINUTUL REFERATULUI


1. Programele corespunzatoare exemplelor (.asm), care au fost utilizate la elaborarea sarcinii
individuale (maxim 3 exemple).
2. Programele .asm elaborate si comentate conform sarcinii individuale.

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