Upload
vlad-ittu
View
29
Download
1
Embed Size (px)
DESCRIPTION
fata transfet
Citation preview
Laborator Limbaj de Asamblare
Lucrare de laborator nr. 6
Instruciuni pentru transferul datelorScopul lucrrii: Studiul instruciunilor de transfer ale microprocesorului I8086, inclusiv instruciunile de intrare-ieire.Consideraii teoretice:Transferul datelor este una dintre cele mai comune sarcini din programarea n limbaj de asamblare. Data poate fi transferat ntre registre sau ntre registre i memorie. Datele imediate pot fi ncrcate n registre sau memorie. Transferul se poate face pe octet sau pe cuvnt. Cei doi operanzi trebuie s aib aceeai dimensiune. Instruciunile de transfer a datelor nu afecteaz indicatorii de condiie (cu excepia celor destinate acestui scop). Ele se clasific n urmtoarele tipuri:
instruciuni de transfer de tip clasic instruciuni de transfer pentru adrese
instruciuni de transfer pentru indicatori de condiie
instruciuni de intrare / ieire (transfer cu registrele periferice)
Instruciuni de transfer de tip clasic
Cuprind urmtoarele instruciuni:
MOV,
XCHG ,
XLAT
PUSH
POP
Copierea datelor se realizeaz cu instruciunea MOV. Sintaxa acestei instruciuni este urmtoarea:
MOV {registru | memorie}, {registru | memorie | dat imediat}
Aceast instruciune copiaz operandul surs n destinaie. Imediat dup execuia unei instruciuni MOV operandul surs i cel destinaie au aceeai valoare. Vechea valoare a operandului destinaie este pierdut.Exemplu:
datasegment
memlabel
byte
;octet i
memwdw
?
;cuvnt
vctdb
100 dup (?);vector
dataends
codesegment
assume cs:code, ds:data
mov ax, 7
;dat imediat n registru
mov mem, 7
;octet imediat n memoria adresat direct
mov memw, 7
;cuvnt imediat n memoria adresat direct
mov vct[bx], 7
;octet imediat n memoria adresat indirect
mov memw, ds
;registru segment n memorie
mov memw, ax
;registru general n memorie adresat direct
mov vct[bx], al
;registru general n memorie adresat indirect
mov ax, memw
;memorie adresat direct n registrul general
mov al, vct[bx]
;memorie adresat indirect n registru general
mov ds, memw
;memorie adresat direct n registru segment
mov ax, bx
;registru general n registru general
mov ds, ax
;registru general n registru segment
mov cx, es
;registru segment n registru general
codeends
Nu se pot executa direct urmtoarele copieri: dat imediat n registru segment, locaie de memorie n locaie de memorie, registru segment n registru segment i copiere n registrul segment CS.
n continuare se prezint copieri care necesit dou instruciuni
Exemplu:
;copiere dat imediat n registru segment
mov ax, 1000h
mov ds, ax
;locaie de memorie n locaie de memorie
mov ax, mem1
mov mem2, ax
;registru segment n registru segment
mov ax, ds
mov es, ax
Interschimbarea datelor respectiv a operanzilor surs i destinaie se realizeaz cu instruciunea XCHG. Sintaxa acestei instruciuni este urmtoarea:
XCHG {registru | memorie}, {registru | memorie}
Exemplu
xchg ax, bx
;interschimb ax cu bx
xchg mem16, ax;interschimb cuvntul de memorie mem16 ;cu registrul ax
xcgh dl, mem8;interschimb octetul de memorie mem8 ;cu registrul dl
xcgh ah, cl;interschimb ah cu cl
Instruciunea XLAT convertete coninutul registrului al utiliznd o tabel a crei adres de nceput este coninut n registrul bx. Coninutul registrului al este interpretat ca adres relativ n tabel. Rezultatul conversiei este dat de valoarea octetului aflat n tabel la aceast adres. Sintaxa instruciunii este urmtoarea:
XLAT [registru segment : deplasament]
Utilizarea referirii la o adres n instruciunea XLAT este necesar atunci cnd tabela nu se afl n segmentul de date, care este segmentul implicit pentru aceast instruciune. Permite asamblorului s determine registrul de segment ce trebuie s fie utilizat n execuia instruciunii.
Se prezint un exemplu care determin codul ASCII corespunztor unei cifre hexazecimale.
Exemplu
;conversie hexazecimal ASCII
;intrare : al = cifr hexazecimal
;ieire : al = codul ASCII corespunztor
convproc near
mov bx, offset tabel
xlat cs:tabel
ret
conv endp
tabel db 0123456789ABCDEF
;tabel de coduri ASCII
Instruciunile PUSH i POP sunt destinate transferului de date n i din stiv.
Stiva este o zon de memorie destinat memorrii temporare a datelor. Generarea adreselor de lucru cu stiva se face automat, prin gestionarea hardware a registrului indicator al vrfului stivei SP, de ctre instruciunile care folosesc stiva. Din aceast cauz, aceste instruciuni permit accesul numai la vrful stivei. Datele introduse se pot accesa n ordinea invers introducerii lor (sistemul LIFO Last In First Out). Iniial stiva nu conine nici o dat. Pe msura introducerii de date, n timpul rulrii programului, dimensiunea stivei crete, ntinzndu-se spre adrese mai mici. Pe msura extragerii datelor din stiv, dimensiunea ei se micoreaz, prin eliberarea succesiv a locaiilor cu adresa cea mai mic.
Instruciunile destinate apelului de subrutin CALL, INT precum i cele de revenire din aceste subrutine RET, IRET folosesc n mod automat stiva pentru salvarea i regsirea adreselor de revenire.
Instruciunea PUSH este folosit pentru introducerea n stiv a unui operand pe 2 octei. Instruciunea POP este folosit pentru extragerea din stiv a ultimului operand introdus. Sintaxa acestor instruciuni este urmtoarea :
PUSH {registru | memorie}
POP {registru | memorie}
n cazul introducerii n stiv, prima operaie care se realizeaz este decrementarea indicatorului de stiv SP cu 2, urmat de memorarea operandului conform acestui indicator. n cazul extragerii din stiv prima operaie care se realizeaz este citirea operandului conform indicatorului de stiv urmat de incrementarea cu 2 a indicatorului.
Instruciunile PUSH i POP sunt apropare ntotdeauna folosite pereche. n mod normal trebuie s se execute acelai numr de introduceri i de extrageri n i din stiv pentru a readuce stiva la starea iniial. Cuvintele se extrag din stiv n ordinea invers introducerii.
Exempluint proc far
push ds
push ax
push cx
push si
push bp
pop bp
pop si
pop cx
pop ax
pop ds
iret
int endp
Sunt situaii n care readucerea stivei la starea sa iniial se face prin adunarea unui numr corespunztor la registrul SP (descrcarea stivei).
Exemplu:
push ax
push bx
push cx
add sp, 6
Valorile care nu sunt n vrful stivei pot fi accesate totui prin adresare indirect, folosind registrul BP ca registru de baz:
Exemplu:
push ax
push cx
push dx
mov bp, sp
mov ax, [bp+4]
mov cx, [bp+2]
mov dx, [bp+0]
add sp, 6
Se prezint un exemplu de realizare a unei bucle inclus n alt bucl cu folosirea registrului CX drept contor n ambele situaii.
Exemplu:
mov cx, 10
;ncrcare contor bucla exterioar
et1:
;nceputul buclei exterioare.
push cx
;salvare contor bucl exterioar
mov cx,20
;ncrcare contor bucl interioar
et2:
;nceputul buclei interioare
loop et2
pop cx
;refacere contor bucl exterioar
;continuare bucl exterioar
loop et1
Instruciuni de transfer pentru adrese
Se folosesc pentru ncrcarea adreselor efective (pe 16 bii) sau fizice (pe 32 bii) n registre sau perechi de registre. Exist 3 instruciuni destinate acestui scop:
LEA ,
LDS ,
LES ,
Instruciunea LEA ncarc adresa efectiv a operandului surs care ntotdeauna trebuie s fie o locaie de memorie n registrul general specificat ca destinaie. Sintaxa acestei instruciuni este urmtoarea:
LEA {registru}, {memorie}
Instruciunile LDS i LES ncarc adresa fizic coninut n operandul surs, care ntotdeauna trebuie s fie un dublu cuvnt de memorie n registrul segment specificat de mnemonica instruciunii, ds respectiv es, i n registru general specificat drept destinaie. Mnemonica acestor instruciuni este:
LDS {registru}, {memorie}
LES {registru}, {memorie}
Instruciunea LEA poate fi folosit pentru ncrcarea adresei efective a unui operand aflat n memorie adresat direct sau indirect.
Exemplu:
lea dx, alfa
lea dx, alfa[si]
Efectul primei instruciuni poate fi obinut i prin folosirea instruciunii:
mov dx, offset alfa
Aceast variant este mai rapid, dar nu poate fi obinut dect n cazul operanzilor specificai prin adresare direct.
Exemplu:
datasegment
stringdbacesta este un sir
fpstringddstring
pointers dd100 dup (?)
dataends
codesegment
les di, fpstring
;se ncarc adresa coninut n locaia surs n
; perechea es:di
lds si, pointers[bx];se ncarc adresa coninut n locaia surs n
;perechea ds:si
codeends
Instruciuni de transfer pentru indicatorii de condiie
n setul de instruciuni al microprocesorului I8086 exist instruciuni pentru ncrcarea si memorarea indicatorilor de condiie. Sintaxa este urmtoarea:
LAHF
SAHF
PUSHF
POPF
Octetul mai puin semnificativ al registrului indicatorilor de condiie poate fi ncrcat n registrul ah folosind instruciunea LAHF, respectiv poate fi nscris cu coninutul registrului ah folosind instruciunea SAHF. Structura octetului care se transfer este urmtoarea :
bitul
76543210
SFZFAFPFCF
Dac se dorete salvarea sau refacerea ntregului registru al indicatorilor de condiie se folosesc instruciunile PUSHF i POPF. Structura cuvntului care se transfer n acest caz este urmtoarea:
Bitul15 14 13 12 11 10 9 8 7 654321 0
.. OF DF IF TF SF ZF ..AF..PF.. CF
Exemplu:
moval, 0
lahf
xchgah, al
orah, 100h;se poziioneaz indicatorul TF
pushax
popf
nop
Ca efect dup poziionarea indicatorului TF dup execuia instruciunii nop se va genera o ntrerupere de nivel 1. Dac se dorete ca n continuare (la ieirea din procedura de tratare a ntreruperii) s se lucreze n regim de funcionare normal (fr ntreruperi dup execuia fiecrei instruciuni) atunci n procedura de tratare a ntreruperii trebuie s se modifice valoarea salvat n stiv .
Structura stivei dup intrarea n procedura de tratare a ntreruperii de nivel 1 este:
Operaia de modificare a valorii indicatorului TF salvat n stiv se poate face de exemplu cu ajutorul instruciunii:
mov bp, sp
and word ptr [bp+4], 0FEFFH
La intrarea n procedura de tratare a ntreruperii, dup salvrile automate n stiv, indicatorii TF i IF sunt resetai, pentru a permite execuia normal a acestei secvene.
Instruciuni de intrare/ieire
Registrele periferice, numite i porturi, sunt elemente constituente ale interfeelor. Ele asigur legtura ntre unitile centrale i dispozitivele periferice.
Fiecare registru periferic are o adres proprie prin care poate fi selectat de unitatea central. Din punct de vedere al unitii centrale registrele periferice pot fi de intrare sau de ieire. Pentru efectuarea transferului datelor spre registre se folosete instruciunea OUT, iar pentru preluarea datelor instruciunea IN. Sintaxa acestor instruciuni este urmtoarea:
IN{AX | AL}, {adresa imediat periferic | DX}
OUT{adresa imediat periferic | DX }, {AX | AL}
Adresa registrului periferic poate fi specificat prin intermediul unei date imediate pe 8 bii sau prin intermediul registrului dx. Folosirea registrului dx permite utilizarea unei adrese mai mari de 255.
Transferul datelor se realizeaz ntre acumulatorul unitii centrale i registrele periferic. Acest transfer poate s fie pe 8 bii sau pe 16 bii, dup cum n instruciune folosim registrul al sau ax.
Exemplul 1:
Magistrala de adrese
Magistrala de date
selecie port
IOW/
x
portoequ60h
moval, 50
outporto, al
Exemplul 2:
Magistrala de adrese
Magistrala de date
selecie port
IOR/
x
portiequ80h
inal, porti
Instruciunile IN i OUT sunt singurele instruciuni propriu-zise care pot realiza interaciunea procesorului cu alte dispozitive. Unele arhitecturi de calculatoare au organizat memoria n aa fel nct zonele din spaiul adresabil sunt dedicate unor echipamente periferice i nu unor zone propriu-zise de memorie. Accesul la zonele respective de memorie va nsemna de fapt un acces la echipamentul periferic. Asemenea sisteme de intrare / ieire se numesc de tip memory-mapped (intrri / ieiri organizate ca spaiu de memorie).
S considerm c un echipament periferic necesit un port de stare i un port de date, ambele pe 8 bii. ntr-un sistem de intrare / ieire obinuit, vor exista dou porturi de intrare, de exemplu 0F8H i 0F9H, dedicate perifericului respectiv. ntr-un sistem de tip memory-mapped vor exista dou adrese, de obicei adiacente, de exemplu c800:0000 i c800:0001, corespunztoare porturilor de stare i de date. Secvenele de citire stare i respectiv date, n cele dou tipuri de intrri / ieiri vor fi:
inal, 0F8H
;citire stare
inal, 0F9H
;citire date
moves, 0C800H
moval, es:[0]
;citire stare
moval, es:[1]
;citire date
Un exemplu concret: ntr-un sistem de tip PC-AT primul port serial folosete porturile ncepnd de la 3F8H, dar n acelai timp accesul la port se poate face i prin memorie, la adresa 40:0000. Analog pentru COM2: porturi ncepnd de la 2F8H sau prin memorie de la 40:0002.
Mersul lucrrii
1. Se vor studia exemplele prezentate.
2. S se scrie un program care copiaz un ir de valori din locaii consecutive de memorie n alt locaie aflat n alt segment de date dect primul ir.
3. S se scrie un program care duplic ultimele dou elemente ale stivei fr a folosi instruciuni push sau pop, ci doar prin adresarea stivei folosind regitrii bp i sp.
4. Difuzorul calculatorului PC se programeaz n felul urmtor:
a) se programeaz frecvena sunetului prin urmtoarea secven:
mov al, 36H
;cuvnt de mod al circuitului 8253
out 43H, al
mov ax, frecventa;se ncarc frecvena n ax
out42H, al
;se trimite octetul mai puin semnificativ
moval, ah
out42h, al
;se trimite octetul mai semnificativ
b) se valideaz sunetul prin secvena:
inal, 61h
oral, 3
;sau logic ntre al i dat imediat
;s-au poziionat biii de validare
out61h, al
c) se invalideaz sunetul prin secvena:
inal, 61h
andal, 0fcH;i logic ntre al i dat imediat
;s-au ters biii de validare
out61h,alS se ncerce programarea unor sunete de frecvene diferite.
5. S se scrie un program care umple o zon de memorie de 5 octei aflai la adrese consecutive cu o valoare ncrcat prin adresare imediat n al. S se realizeze mai multe variante de program, folosind mai multe moduri de adresare. Care variant este cea mai eficient?
6. S se scrie un program care transfer dou cuvinte de memorie aflate la adrese succesive la o alt adres, folosind instruciunile de lucru cu stiva.
7. S se scrie cel mai scurt program care duplic n stiv ultimele 10 cuvinte introduse n aceasta.Probleme propuse i rezolvate:
S se modifice coninutul a dou cuvinte din memorie folosind adresele lor far (pe 32 bii). Indicaie: se vor utiliza instruciunile LDS i LES.
Rezolvare:
_data segment public 'DATA'
xdw 10
ydw 15
adr_xdd x
adr_y dd y
_data ends
_code segment para public 'code'
assume cs:_code
start :
movax,_data
;iniializare registru segment
movds,ax
ldssi, adr_x;ncarc adresa lui x in DS:SI -> adresa far ;pe 32 bii
lesdi, adr_y;ncarc adresa lui y in ES:DI -> adresa far ;pe 32 biimovword ptr [si], 20;modifica variabila x, prin adresare indexata
movword ptr es:[di], 30;modifica variabila y, prin adresare indexata
mov ah,4ch
;ieire in DOS
int21h
_code ends
end start
Se citesc prin program toate tastele apsate (pn se apas tasta 0). S se afieze codurile ASCII ale tastelor citite. Se va utiliza instruciunea XLAT.
_data segment
tab_conv db 0123456789ABCDEF'
;tabela de conversie
mesaj db'-are codul ASCII'
tasta db2 dup (?) ,0dh,0ah, '$'_dataends
_cod segment para public 'code' assume cs:_cod,ds:_data
start :
movax,_data
;iniializare registru segment de date
movds,ax
iar:
movah, 1
;citire cu ecou a unei taste
int21h
cmpal, 0
jz gata
movah al
;salvare cod tast
leabx, tab_conv;offset-ul tabelei de conversie n bx
andal, 0fh
;se rein doar primii 4 bii
xlattab_conv;conversia celei de-a doua tetrade (cmps 4 bii)
movtasta+1, al;este cea de-a doua cifr a codului
moval, ah
;codul iniial al tastei
movcl, 4
;ne vom deplasa la dreapta cu 4 bii
shral, cl
;deplasare
xlattab_conv
;conversia primei tetrade
movtasta, al
;codul ASCII al primei tetrade (cms 4 bii)
leadx, mesaj
movah, 9h
;se tiprete codul tastei
int21h
jmp iar
gata :
movah, 4ch
;ieire n DOS
int21h
_cod ends
end start
S se scrie un program care scrie i citete date de la portul serial. Se vor utiliza instruciuni de lucru cu porturile. Se recomand utilizarea TechHelp-ului pentru nelegerea detaliat a modului n care a fost conceput programul.. n programul dat ca exemplu n cele ce urmeaz sunt incluse instruciuni detaliate de trasare (debug). Sunt testate posibilele erori care pot aprea i sunt afiate mesaje corespunztoare pe ecran. Programul prezint modul de lucru (iniializare, citire i scriere) cu portul serial.
Listingul TESTSERIAL.ASM
include port.h
.stack 1024
_data segment public
ms1 db 00000010b
ms2 db 11111011b
ms3 db 11110111b
ms4 db 11101111b
ms5 db 11111110b
ms6 db 11011111b
m1 db 'Eroare depaire viteza.$'
m2 db 'Eroare de paritate.$'
m3 db 'Eroare cadru.$'
m4 db 'Eroare detecie break.$'
m db 'Intru n bucla.$'
mes2 db 'Datele nu sunt recepionate pentru a fi citite.$'
mes3 db 'Bufferul de transmisie gol. Transmit caracterul.$'
mes4 db 'Am transmis caracterul i m ntorc napoi bucla.$'
mes5 db 'Datele sunt recepionate pentru a fi citite. Am citit urmtorul caracter valid :$,CR,LF'
mes6 db 'si urmeaz s nchei execuia programului.$'
_data ends
_cod segment para public 'code'assume cs:_cod,ds:_data
start:
mov ax, _data ;iniializare registru date
mov ds ,ax
mov es, ax
trim 80h, 2fbh
trim 60h, 2f8h
trim 00h, 2f9h
trim 0ah, 2fbh ;iniializare UART (rata de transfer, dezactivare ntreruperi)
trim 13h, 2fch
trim 0h, 2f9h
citire_afiare:
;bucla
mov ah, 09h
lea dx, m
int 21h
citi 2fdh ;citire registru stare linie
mov bl, al
and bl, ms1
cmp bl, ms1
jz lin_er1
mov bl ,al
not ms2
and bl ms2
cmp bl, ms2
jz lin_er2
mov bl, al
not ms3
and bl, ms3
cmp bl, ms3
jz lin_er3
;sari la eroare
mov bl, al
not ms4
and bl, ms4
cmp bl, ms4
jz lin_er4
;sari la tratare eroare
mov bl, al
not ms5
and bl, ms5
cmp bl, ms5
jz cit_afis_caracter;s-a reinut, atunci l afiez
lea dx, mes2
mov ah, 09h
int 21h
mov bl, al
not ms6
and bl, ms6
cmp bl, ms6
jnz citire_afiare ;daca nu, continui ciclul
lea dx, mes3
mov ah, 09h
int 21h
mov al, 'D' ;daca da, trimit caracterul la port
mov dx, 2f8h
out dx, al
afis mes4
jmp citire_afiare ;continui bucla
lin_er1:;cod pentru tratare eroare depire viteza
mov ah, 09h
lea dx, m1
int 21h
jmp lin_er
lin_er2:;cod er de paritate
mov ah, 09h
lea dx, m2
int 21h
jmp lin_er
lin_er3:
mov ah, 09h
lea dx, m3
int 21h
jmp lin_er
lin_er4:;cod er detecie break
mov ah, 09h
lea dx, m4
int 21h
jmp lin_er
lin_er:
;tratare erori pe registrul stare linie
citi 2f8h
;dac s-au nregistrat erori, nseamn c se citesc
mov ah, 02h;caractere eronate, deci afiare la terminal '?'
mov dl, '?'
int 21h
jmp gata
;continum bucla pn se atinge valoarea din cx
cit_afis_caracter:
;afiare caracter citit
afis mes5
citi 2f8h
mov ah, 02h
mov dl, al
int 21h
jmp gata
gata:
mov ah, 4ch
;ieire n DOS
int 21h
_cod ends
end start
Listingul PORT.H:
.xlist
trim macro reg_al, reg_dx
mov al, reg_al
mov dx, reg_dx
out dx, al
endm
citi macro regdx
mov dx, regdx
in al, dx
endm
afis macro mes
lea dx,mes
mov ah, 09h
int 21h
endm
.sall
.list
SP
IP
CS
indicatori condiie
decodificator adrese
OR
CLKDI0-DI7
- - I8282
OED00-D07
decodificator adrese
OR
OE/D00-D07 I8282
CLKDI0-DI7
PAGE 1