Sunteți pe pagina 1din 8

2.

STOSB (STOSW) DST ; Store String


Instrucþiunea memoreazá conþinutul registrului AL (AX) ín octetul
LUCRAREA NR. 7 (cuväntul) din ßirul destinaþie DST adresat prin ES:DI, cu actualizarea
corespunzátoare a registrului DI. Conþinutului registrului AL (AX) nu se
Grupul instrucþiunilor de lucru pe ßiruri de caractere
modificá.
Scopul lucrárii Exemplu:
STOSB ; Memoreazá continutul registrului AL la adresa
Lucrarea prezintá succint grupul de instrucþiuni pe ßiruri de ; ES:DI si incrementeaza continutul lui DI cu 1
caractere ale limbajului de asamblare al microprocesoarelor I8086/I8088. STOSW ; Memoreazá continutul registrului AX la adresa
Dupá o scurtá prezentare a sintaxei acestor instrucþiuni, urmeazá o serie ; ES:DI si incrementeaza continutul lui DI cu 2
de exemple care sá evidenþieze modul de utilizare al acestora.
3. MOVSB (MOVSW) DST, SRC ; Move String
Grupul instructiunilor pe ßiruri de caractere Transferá un octet (o pereche de octeþi) íntre ßirul sursá SRC
Pentru toate instrucþiunile pe ßiruri de caractere, se considerá cá adresat prin DS:SI ín octetul (perechea de octeþi) din ßirul destinaþie DST
ßirul sursá este conþinut ín segmentul curent de date (a cárui adresá de adresat prin ES:DI, cu actualizarea corespunzátoare a registrelor index SI
ínceput este conþinutá ín registrul DS), iar adresa relativá a ßirului ín ßi DI. Conþinutului ßirului sursá nu se modificá.
segment este conþinutá ín registrul SI. §irul destinaþie este conþinut ín
segmentul de date suplimentare (a cárui adresá de ínceput este conþinutá Observatie: Este clar cá ínaintea operatiei de transfer trebuie íncarcate ín
ín registrul ES), iar adresa relativá a ßirului ín segment este conþinutá ín registrele SI ßi DI adresele de ínceput ale celor douá ßiruri (sursá,
registrul DI. Pentru ßirul sursá se poate considera ßi alt registru de respectiv destinatie), iar ín CX numárul elementelor ce trebuie
segment utilizänd un prefix de registru adecvat. Flagul DF indicá sensul transferate. Pentru claritate prezentám urmátorul exemplu:
de parcurgere ín memorie al ßirurilor sau, altfel spus, modul ín care se ..................................
actualizeazá registrele SI ßi DI dupá execuþia operaþiei. Astfel, dacá mov ax, extra_sgm ; Se íncarcá registrul ES cu adresa de
flagul DF are valoarea zero, atunci se considerá cá ßirurile se vor mov es, ax ; bazá a segmentului de date suplimentare
parcurge de la adrese mici cátre adrese mari. Actualizarea registrelor SI mov si, OFFSET SRC
ßi DI se face prin incrementarea acestora cu 1 sau cu 2 dupá cum ceea ce mov di, OFFSET DST
se executá este o operatie care implicá un octet sau un cuvänt. Dacá mov cx, numar_elem
flagul DF are valoarea unu, atunci se considerá cá ßirurile se vor parcurge cld ; DF = 0 - ßirurile se vor parcurge ín sens crescátor
de la adrese mari cátre adrese mici. Actualizarea registrelor SI ßi DI se MUTA:movsb ; Transferul octetilor de la sursa SRC la
face prin decrementarea acestora cu 1 sau cu 2 dupá cum se executá o loop MUTA ; destinatiaDST se executá päná cänd CX = 0
operatie care implicá un octet sau un cuvänt. ....................................

Operaþiile elementare pe ßiruri de caractere sunt: 4. CMPSB (CMPSW) DST, SRC ; Compare Strings
Compará un octet (o pereche de octeti) din ßirul destinatie DST
1. LODSB (LODSW) SRC ; Load String adresat prin ES:DI cu octetul (perechea de octeþi) din ßirul sursá SRC
Instrucþiunea íncarcá fiecare octet (cuvänt) din ßirul sursá SRC adresat prin DS:SI, cu actualizarea corespunzátoare a registrelor SI ßi DI.
adresat prin DS:SI ín registrul AL (AX), cu actualizarea corespunzátoare Comparaþia se realizeazá prin scáderea octetului (cuväntului) sursá din
a registrului SI. Conþinutului ßirului sursá nu se modificá. octetul (cuväntul) destinaþie, fárá ínscrierea rezultatului, dar cu
poziþionarea indicatorilor de condiþie conform rezultatului obþinut. SCASB (SCASW) ßi CMPSB (CMPSW) la egalitatea a douá elemente.
Conþinutul celor douá ßiruri nu se modificá. Menþionám cá dupá fiecare execuþie a operaþiei elementare conþinutul
registrului CX este decrementat cu 1.
4. SCASB (SCASW) DST ; Scan String
Scaneazá ßirul destinaþie DST adresat prin ES:DI. Instrucþiunea Observatie: Tipul prefixului este semnificativ numai pentru operaþiile
poziþioneazá indicatorii de condiþie conform diferenþei dintre conþinutul SCASB (SCASW) ßi CMPSB (CMPSW). Pentru toate celelalte
registrului AL (AX) ßi octetul (perechea de octeþi) din ßirul destinaþie instrucþiuni pe ßiruri de elemente, toate prefixele au aceeaßi semnificaþie
DST fárá ínscrierea rezultatului ßi fárá modificarea conþinutului ca ßi prefixul REP.
registrului AL (AX) ßi a continutului ßirului. Se actualizeazá Prezentám ín continuare cäteva exemple de utilizare a
corespunzátoar registrelor DI. instrucþiunilor pe ßiruri de caractere:
Pentru repetarea operaþiile elementare pe ßiruri de caractere se por Exemplul 7.1.
utiliza urmátoarele prefixe (obþinänd astfel o instrucþiune cu opcod-ul pe title TRANSFB.ASM
2 octeþi): ; TRANSFB - transfera un bloc de date dintr-o zona de memorie in alta
1. REP - Se repetá operaþia care urmeazá päná cänd conþinutul ; zona de memorie
registrului CX devine zero (nu mai este nevoie de instrucþiunea LOOP ca DOSSEG
ín exemplul anterior). Precizám cá, dupá fiecare execuþie a operaþiei .MODEL SMALL
elementare, conþinutul registrului CX este decrementat cu 1. .STACK 100h
lung_bloc EQU 2000h
Exemplu: Dorim sá transferám 100 octeþi de la adresa DS:0200h la
.DATA
adresa DS:0300h. Secvenþa de instrucþiuni va fi urmátoarea:
bloc_sursa db 2000 dup(0)
mov ax, ds
bloc_dest db 2000 dup(?)
mov es, ax
.CODE
mov si, 200h
START:
mov di, 300h
mov ax, @DATA ; Incarca in AX adresa de baza a
mov cx, 100
mov ds, ax ; segmentului de date
cld
cld ; Sterge DF (DF = 0)
rep movsb
mov cx, lung_bloc ; Se incarca CX cu lungimea blocului de
2. REPZ, REPE - Se repetá operaþia care urmeazá päná cänd date
conþinutul registrului CX devine zero sau päná cänd indicatorul ZF mov si, OFFSET bloc_sursa ; Se incarca SI cu adresa de
devine zero. Indicatorul ZF este setat numai de cátre instrucþiunile ; inceput a blocului sursa
SCASB (SCASW) ßi CMPSB (CMPSW) la egalitatea a douá elemente. mov ax, SEG bloc_sursa ; Se incarca AX cu adresa de
Menþionám cá dupá fiecare execuþie a operaþiei elementare conþinutul ; segment e blocului
registrului CX este decrementat cu 1. mov ds, ax ; sursa, care se inscrie apoi inDS
mov di, OFFSET bloc_dest ; Se incarca DI cu adresa de
3. REPNZ, REPNE - Se repetá operaþia care urmeazá päná cänd
; inceput a blocului dest
conþinutul registrului CX devine zero sau päná cänd indicatorul ZF
mov ax, SEG bloc_dest ; Se incarca AX cu adresa de
devine unu. Indicatorul ZF este setat numai de cátre instrucþiunile
mov es, ax ; segment e blocului destinatie,
; care se inscrie apoi in ES inc dx ; In DX se contorizeaza numarul locatiilor diferite
trans: movsb ; Se realizeaza transferul octet cu octet ; dintre cele doua siruri
loop trans inc cx ;
mov ax, 4c00h ; Iesire in sistem loop compb
int 21h SF1: jz SF
END START inc dx
SF: mov ax, 4c00h ; Iesire in sistem
Exemplul 7.2. int 21h
title COMPAS.ASM END START
; COMPAS - compara doua siruri de octeti, numarul locatiilor diferite
; fiind contorizat in registrul DX Exemplul 7.3.
DOSSEG title COMPAS.ASM
.MODEL SMALL ; COMPAS - compara doua siruri de octeti, numarul locatiilor diferite
.STACK 100h ; fiind contorizat in registrul DX si apoi afisarea acestui numar
lungs EQU 100h ; lungs - lungimea sirurilor de comparat DOSSEG
.DATA .MODEL SMALL
bloc_sursa db lungs DUP (0) .STACK 100h
bloc_dest db lungs/4 DUP (1) .DATA
db lungs/4 DUP (0) lungs EQU 2000 ; lungs - lungimea sirurilor de comparat
db lungs/4 DUP (5) bloc_sursa db lungs DUP (0)
db lungs/4 DUP (0) bloc_dest db lungs/4 DUP (?)
.CODE db lungs/4 DUP (0)
START: db lungs/4 DUP (5)
mov ax, @DATA db lungs/4 DUP (0)
mov ds, ax n10 dw 10
mov ax, SEG bloc_sursa .CODE
mov ds, ax START:
mov si, OFFSET bloc_sursa mov ax, @DATA
mov ax, SEG bloc_dest mov ds, ax
mov es, ax mov ax, SEG bloc_sursa
mov di, OFFSET bloc_dest mov ds, ax
cld ; Sterge DF mov si, OFFSET bloc_sursa
mov cx, lungs ; Incarca CX cu lungimea sirurilor de mov ax, SEG bloc_dest
; comparat mov es, ax
compb: cmpsb ; Bucla pentru compararea sirurilor, octet cu octet mov di, OFFSET bloc_dest
loope compb cld ; Sterge DF
jcxz SF1 ; Daca CX = 0, operatia de comparare s-a terminat mov cx, lungs
xor dx, dx ;
ASSUME cs:STRING, ds:STRING, es:STRING, ss:STIVA
compb: cmpsb ; Bucla pentru compararea sirurilor, octet cu octet
STIVA SEGMENT STACK
loope compb
DB 50 DUP (0)
jcxz SF1 ; Daca CX = 0, operatia de comparare s-a terminat
STIVA ENDS
inc dx ; In DX se contorizeaza numarul locatiilor
STRING SEGMENT
; diferite dintre cele doua siruri
DESTINATIE DB 8 DUP (0)
inc cx
SURSA DB 8 DUP ('A')
loop compb
START:
SF1: jz AFIS
mov ax, cs ; Segmentele de date si cod sunt comune
inc dx
mov ds, ax ; Incarca DS cu adresa de baza a
; Se afißazá numárul de caractere diferite conþinut ín registrul DX
; segmentului de date
AFIS: mov ax, dx
mov es, ax ; Incarca ES cu adresa de baza a
call CONVERSIE
; segmentului de date
jmp SF
mov ax, STIVA ;
CONVERSIE PROC NEAR
mov ss, ax ;
mov dx, 0 ; Extensie la 32 de biti ;
div n10 ; Citul in AX, restul in DX mov di, OFFSET DESTINATIE
cmp ax, 0 ; Citul = 0 ? mov si, OFFSET SURSA
jz GATA mov cx, LENGTH SURSA ; AX = 8
push dx ; Se salveaza in stiva restul cld ; DF = 0
call CONVERSIE REP MOVSB ; (SURSA) <-- (DESTINATIE) in
pop dx ; Se reface restul din stiva ; sensul creßterii adreselor
GATA: std ; DF = 1
mov al, dl ; AL se incarca cu cifra de afisat mov al, 0 ; AL = 0
add al, '0' ; Corectie ASCII mov cx, 3 ; CX = 3
mov ah, 14 ; Functie DOS pentru afisarea dec di ; (DI) = DESTINATIE+8 - 1
int 10h ; unui caracter pe display REP STOSB ; DESTINATIE: 'A', 'A', 'A', 'A', 'A', 0, 0, 0
ret cld ; DF = 0
CONVERSIE ENDP mov cx, LENGTH SURSA ; CX = 8
SF: mov ax, 4c00h ; Iesire in sistem mov di, OFFSET DESTINATIE
int 21h REPNE SCASB ; Cauta 0 in sisul DESTINATIE
END START ; (ultimele 3 elemente sunt nule)
mov di, OFFSET DESTINATIE
Exemplul 7.4. mov si, OFFSET SURSA
title STRING.ASM mov cx, LENGTH SURSA ; CX = 8
; STRING ilustreazaa operatii cu siruri, folosind instructiuni repetitive REPE CMPS DESTINATIE, SURSA ; Compara sirul sursa
; realizate cu prefixele REP, REPE, REPNE ; cu sirul destinatie
mov ax, 5599h ; AX = 5599h mov ax, STIVA
REP STOSW ; (DI) = (DESTINATIE+10) mov ss, ax
std ; DF = 1 mov dx, OFFSET mes12 ; Se afisaza sirul initial
sub di, 2 mov ah, 9 ; Functie DOS de afisare a unui
mov cx, 3 ; sir terminat cu caracterul $
REP STOS WORD PTR DESTINATIE+8 int 21h
; (DESTINATIE+9,DESTINATIE+8) <-- 5599h... mov dx, OFFSET sir
mov ax, 4c00h ; Iesire in sistem mov ah, 9
int 21h int 21h
STRING ENDS mov dx, OFFSET crlf
END START mov ah, 9
int 21h
Exemplul 7.5. mov bx, 0ffffh ; BX = ffffh
title STRING1.ASM count: inc bx ; La prima incrementare BX = 0
; STRING1 opereaza asupra unui sir de caractere astfel: prima jumatate cmp BYTE PTR sir[bx], '$' ; Se testeaza sfirsitul de sir (ffh)
; a sirului este lasata nemodificata, iar a doua jumatate a sirului repeta jne count
; elementele din prima jumatate in ordine inversa, folosind o procedura mov ax, bx ; AX contine numarul de caractere din sir
; recursiva numita INV mov bl, 02 ;
; div bl ; Citul in AL, restul in AH
DATA SEGMENT
and al, al
term EQU 0ffh
jz STOP ; Sirul s-a terminat
sir DB 'ABCDEFGHIJKLMNOPRSTUVXZ', '$'
push ax ; Salveaza in stiva caracterele sirului
mes11 EQU 'Sirul initial: $'
xor si, si ; SI = 0
mes12 DB mes11
call INV ; Se apeleaza procedura de inversare
mes21 EQU 'Sirul final: $' ;
mes22 DB mes21 mov sir[si+1], '$'
crlf DB 0dh, 0ah, '$' mov dx, OFFSET mes22 ; Se afisaza sirul final
DATA ENDS mov ah, 9 ; Functie DOS de afisare a unui
; sir terminat cu caracterul $
STIVA SEGMENT STACK int 21h
DB 100 DUP(0)
mov dx, OFFSET sir
STIVA ENDS mov ah, 9
CODE SEGMENT int 21h
ASSUME cs:CODE, ds:DATA, ss:STIVA mov dx, OFFSET crlf
START: mov ah, 9
mov ax, DATA int 21h
mov ds, ax pop ax
STOP: lmes2 EQU $-mesaj2
mov ax, 4c00h ; Iesire in sistem r elem < > ; Memoreaza inregistrarea curent inserata
int 21h vect elem < '30', 'C' > ; Vectorul de inregistrari care trebuie sortat
elem < '20', 'B' >
INV PROC NEAR
elem < '40', 'D' >
mov bl, sir[si]
elem < '10' >
push bx ; Salveaza caracterele din prima jumatate a sirului
n EQU ($ - vect)/(TYPE elem) ; Se calculeaza numarul de
inc si
; elemente ale vectorului
dec al
lvect EQU $-vect
jz GATA
i DW ? ; Zona variabilelor din schema logica
call INV
j DW ?
GATA:
ind DB ?
and ah, ah ; ZF=1 daca numarul caracterelor din sir este par
k DW ?
jz impar ; Sirul are un numar impar de caractere
DATA ENDS
xor ah, ah ; Se sare caracterul din mijloc
inc si STIVA SEGMENT STACK
impar: pop bx ; Reface din stiva caracterele in ordine inversa DW 100h;
mov sir[si], bl STIVA ENDS
inc si
ret CODE SEGMENT 'CODE'
INV ENDP ASSUME cs:CODE, ds:DATA, ss:STIVA
begin: mov ax, DATA
CODE ENDS
mov ds, ax
END START
mov ax, STIVA
Exemplul 7.6. mov ss, ax
mov bx, 1 ; Se afisaza vectorul vect inainte de sortare
title SORTVECT.ASM mov cx, lmes1
; SORTVECT - sorteaza elementele unui vector de structuri de un mov dx, OFFSET mesaj1
; anumit tip mov ah, 40h ; Functie DOS de afisare a unui sir al carui
int 21h ; numar de caractere este specificat in registrul CX
DATA SEGMENT 'DATA'
mov bx, 1
elem STRUC
mov cx, lvect
cheie DW ?
mov dx, OFFSET vect
info DB 'A'
mov ah, 40h
elem ENDS
int 21h
mesaj1 DB "Structura vectorului vect inainte de sortare", 0dh, 0ah ;
lmes1 EQU $-mesaj1 lea bx, vect ; Registrul BX memoreaza adresa de
mesaj2 DB 0dh, 0ah, "Structura vectorului vect dupa sortare", 0dh, 0ah ; baza a vectorului vect
mov j, 2 mov [bx+di].cheie, ax
mov cx, TYPE elem ; Reg. CX memoreaza numarul de octeti mov al, [bx+si].info
; ai unui element al vectorului. Acest mov [bx+di].info, al
; numar este necesar pentru a se adresa dec i
;usor elementele vectorului cmp i, 0 ; Se testeaza daca mai sunt elemente de comparat
bucla: mov ax, j jne skip ; Daca da, in final se va relua corpul buclei
cmp ax, n ; Compara pe j cu n (n = nr. ele mov ind, 1 ; Altfel, se seteaza ind pentru iesirea din bucla
jng cont ; Daca j <= n, se continua secventa jmp skip
jmp STOP ; Altfel, programul se termina
etich1: mov ind, 1
cont: mov ax, j
skip: cmp ind, 1 ; Test de terminare bucla
dec ax
jne repeta
mov i, ax ; Atribuie lui i valoarea j-1
mov ax, i ; Se insereaza elementul curent pe pozitia i+1
mov ax, j
mul cx
dec ax
mov di, ax
mul cx
mov ax, r.cheie
mov si, ax
mov [bx+di].cheie, ax
mov ax, [bx][si].cheie
mov al, r.info
mov k, ax ; Incarca in k cheia a-j-a
mov [bx+di].info, al
mov r.cheie, ax ; Incarca in r al-j-lea element al vectorului
inc j ; Se incrementeaza j pentru adresarea
mov al, [bx][si].info
; elementului urmator
mov r.info, al
jmp bucla ; Reluarea buclei principale
mov ind, 0
STOP: nop
repeta: mov ax, i
mov bx, 1 ; Se afisaza vectorul vect dupa sortare
dec ax
mov cx, lmes2
mul cx
mov dx, OFFSET mesaj2
mov si, ax
mov ah, 40h
mov ax, [bx][si].cheie
int 21h
cmp k, ax ; Compara pe k cu continutul cheii a-j-a
mov bx, 1
jge etich1 ; Daca k >= kj, se iese din bucla si se seteaza
mov cx, lvect
; ind, altfel, se continua secventa
mov dx, OFFSET vect
mov ax, i ; Se deplaseaza elementul i pe pozitia i+1 in vector
mov ah, 40h
dec ax
int 21h
mul cx
mov ax, 4c00h ; Iesire in sistem
mov si, ax
int 21h
mov ax, [bx][si].cheie
CODE ENDS
mov di, si
END begin
add di, cx
7
Modul de lucru
1. Se vor studia instrucþiunile din grupul instrucþiunilor de lucru pe ßiruri
de caractere.
2. Se vor edita, asambla ßi rula cele ßase programe prezentate.
3. Se vor obþine ßi analiza fißierele listing ßi de referinþe íncrucißate.
4. Se vor rula sub CV sau TD programele realizate ín modul pas cu pas.
5. Sá se deducá schema logicá a programului din exemplul 7.6.
6. Sá se alcátuiascá un program pentru ordonarea sirului
"ahre25ruy9v07c23z9" care se aflá ín segmentul de date la adresa sir.
Sirul va fi afißat atät ín ordine directá cät ßi inversá.
7. Sá se alcátuiascá un program care sá ordoneze alfabetic (atät dupá
prima literá a numelui, cät ßi dupá prima literá a prenumelui) numele
studenþilor din subgrupa din care faceþi parte ßi apoi sá afißeze aceste
nume atät ín ordine directá cät ßi inversá.

Conþinutul referatului
1. Schema logicá a programului din exemplul 7.6.
2. Listingurile programelor realizate la punctele 6 ßi 7 de la "Modul de
lucru".
3. Observaþiile ßi comentariile studentului.

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