l6 instr transferul datelor

23
Lucrare de laborator nr. 6 Instrucţiuni pentru transferul datelor Scopul lucrării: Studiul instrucţiunilor de transfer ale microprocesorului I8086, inclusiv instrucţiunile de intrare-ieşire. Consideraţii 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 încărcate în registre sau memorie. Transferul se poate face pe octet sau pe cuvânt. Cei doi operanzi trebuie să aibă aceeaşi dimensiune. Instrucţiunile de transfer a datelor nu afectează indicatorii de condiţie (cu excepţia celor destinate acestui scop). Ele se clasifică în următoarele tipuri: - instrucţiuni de transfer de tip “clasic” - instrucţiuni de transfer pentru adrese - instrucţiuni de transfer pentru indicatori de condiţie - instrucţiuni de intrare / ieşire (transfer cu registrele periferice) Instrucţiuni de transfer de tip “clasic” Cuprind următoarele instrucţiuni: MOV <d>, <s> XCHG <d>, <s> XLAT PUSH <s> POP <d> 1

Upload: vlad-ittu

Post on 08-Nov-2015

31 views

Category:

Documents


1 download

DESCRIPTION

fata transfet

TRANSCRIPT

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