Extras din laborator
Instructiunile LODS si STOS
Mnemonic: LODS dst,src - Muta un octet, doi octeti sau 4 octeti de la adresa la adresa DS:SI in AL, AX sau EAX. Aceasta instructiune este echivalenta cu LODSB,LODSW si LODSD care nu au insa operanzi expliciti.
Mnemonic: STOS dst,src - Muta continutul lui AL, AX sau EAX in memorie la adresa ES:DI. Aceasta instructiune este echivalenta cu STOSB,STOSW si STOSD care nu au insa operanzi expliciti.
Pentru instructiunile de transfer LODSB, LODSW si LODSW, sursa este locatia de memorie cu adresa efectiva data de registrul index sursa SI si adresa de segment data de DS.
Pentru instructiunile de transfer STOSB, STOSW si STOSD destinatia este locatia de memorie cu adresa efectiva data de registrul index destinatie DI si adresa de segment data de ES.
In urma efectuarii unei astfel de instructiuni, registrul index SI respectiv DI se modifica in functie de starea flagului DF (de directie). Daca DF este 0, registrul index va fi incrementat cu 1 la LODSB si STOSB, cu 2 la LODSW si STOSW si cu 4 la LODSD si STOSD . Daca DF este 1, registrul index va fi decrementat cu 1, 2, respectiv cu 4.
Registrul general implicit este AL la transferul de un octet, AX la transferul de doi octeti si EAX la transferul pe 4 octeti.
In exemplul urmator se arata utilizarea unor astfel de instructiuni la copierea unui bloc dintr-o zona memorie in alta
Exemplul 6.1:
.radix 16
.model small
.stack 100h
LungimeBloc equ 30
.data
BlocSursa db 40 dup(56)
BlocDest db 40 dup(?)
.code
start:
mov ax,seg BlocSursa ;Se putea folosi si mov ax,@data
mov ds,ax ;Segmentul sursa in DS
mov ax,seg BlocDst ;Necesar numai daca blocurile ;sunt in segmente diferite
mov es,ax ;Segmentul destinatie in ES
cld ;directia in sensul cresterii ;adreselor
mov si, offset BlocSursa ;AE a sursei in SI
mov di, offset BlocDest ;AE a destinatiei in DI
mov cx, LungimeBloc ;Numarul de transferuri in CX
bucla:
lodsb ;Incarca in AL un octet
stosb ;si il trimite la destinatie
loop bucla ;Decrementeaza CX si reia ;bucla pana cand CX devine 0
term:
jmp term
end start
Modul de lucru:
P 6.1 Sa se initializeze un bloc de 20h de cuvinte de forma 1122h in memorie si sa se scrie un program care sa copieze acest bloc intr-o zona incepand de la adresa 60h din segmentul de date.
Observatie: Reamintim ca dupa incarcarea lui DS, zona de memorie afisata in fereastra DUMP va fi cea a segmentului ES. Pentru a vdea segmentul de date se da comanda Dump din submeniul View, avand activa fereastra CPU.
Preview document
Conținut arhivă zip
- Instructiuni de lucru cu siruri.doc