APSC_Lab2

16
Laborator 2 – Realizarea programelor în limbaj de asamblare 17 LABORATOR 2. REALIZAREA PROGRAMELOR ÎN LIMBAJ DE ASAMBLARE 2.1 Formatul instrucţiunilor şi directive de asamblare Instrucţiunile pot avea unul sau două cuvinte de 24 de biţi: codul instrucţiunii şi, opţional, un cuvânt suplimentar care conţine un operand imediat sau o adresă. Datorită existenţei a două magistrale de date şi a funcţionării în paralel a unităţilor procesorului, majoritatea instrucţiunilor pot specifica până la trei transferuri de date: pe magistrala de date X (XDB), pe magistrala de date Y (YDB) şi în ALU. Programele scrise în limbaj de asamblare constau în linii de program care pot include până la şase câmpuri separate prin spaţii sau taburi: Etichetă operaţie operand X data transfer Y data transfer comentariu filtru mac x0,y0,a x:(r0)+,x0 y:(r4)+,y0 ; text Câmpul etichetă este opţional şi îi este asignat valoarea adresei primului cuvânt al instrucţiunii care este asamblată. Câmpul operaţie trebuie să fie precedat de cel puţin un spaţiu sau un tab şi poate reprezenta: mnemonica instrucţiunii, directivă de asamblare sau numele unui macro. Câmpul operand depinde de tipul instrucţiunii sau al directivei. Câmpurile de transfer al datelor reprezintă transferurile care pot fi executate în paralel cu instrucţiunea şi conţin modurile de adresare folosite. Comentariul este orice text precedat de ;.

description

lab2

Transcript of APSC_Lab2

Page 1: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 17

LABORATOR 2. REALIZAREA PROGRAMELOR ÎN

LIMBAJ DE ASAMBLARE

2.1 Formatul instrucţiunilor şi directive de asamblare

Instrucţiunile pot avea unul sau două cuvinte de 24 de biţi: codul

instrucţiunii şi, opţional, un cuvânt suplimentar care conţine un operand imediat

sau o adresă. Datorită existenţei a două magistrale de date şi a funcţionării în

paralel a unităţilor procesorului, majoritatea instrucţiunilor pot specifica până la

trei transferuri de date: pe magistrala de date X (XDB), pe magistrala de date Y

(YDB) şi în ALU.

Programele scrise în limbaj de asamblare constau în linii de program care

pot include până la şase câmpuri separate prin spaţii sau taburi:

Etichetă operaţie operand X data transfer Y data transfer comentariu

filtru mac x0,y0,a x:(r0)+,x0 y:(r4)+,y0 ; text

Câmpul etichetă este opţional şi îi este asignat valoarea adresei primului

cuvânt al instrucţiunii care este asamblată.

Câmpul operaţie trebuie să fie precedat de cel puţin un spaţiu sau un tab

şi poate reprezenta: mnemonica instrucţiunii, directivă de asamblare sau numele

unui macro.

Câmpul operand depinde de tipul instrucţiunii sau al directivei.

Câmpurile de transfer al datelor reprezintă transferurile care pot fi

executate în paralel cu instrucţiunea şi conţin modurile de adresare folosite.

Comentariul este orice text precedat de ;.

Page 2: APSC_Lab2

18 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

Un program scris în limbaj de asamblare poate fi structurat astfel:

• Definirea simbolurilor şi includerea diferitelor programe anexe.

• Iniţializarea constantelor şi alocarea spaţiului de stocare a datelor în

memorie

• Programul principal (poate conţine apeluri de macrouri sau subrutine)

• Declararea subrutinelor sau a macrourilor.

În continuare sunt prezentate câteva caractere şi directive speciale pentru

asamblorul DSP56300. Acestea nu aparţin setului de instrucţiuni ale procesorului

ci sunt folosite de asamblor pentru generarea codului.

Caractere speciale:

; Comentariu

# Adresare imediată

#< Adresare imediată scurtă

#> Adresare imediată lungă

Directive de control:

DEFINE simbol expresie – atribuie constantei simbol valoarea

dată în expresie.

INCLUDE nume_fisier

ORG zona_memorie – indică adresa şi spaţiul de memorie

unde sunt stocate datele sau

instrucţiunile.

Definirea simbolurilor

label EQU expresie – alocă valoarea dată în expresie

pentru label.

SECTION nume_secţiune – defineşte o secţiune de cod în care

toate simbolurile sunt considerate ca

aparţinând aceleiaşi zone de program

ENDSEC (aceasta putând fi realocată).

Page 3: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 19

label SET expresie – la fel ca EQU cu observaţia că

valoarea etichetei poate fi redeclarată

în altă zonă de program (tot cu SET).

Iniţializarea constantelor şi alocarea spaţiului de stocare a datelor

BUFFER <M|R> expresie – indică începutul unui buffer de tip

Modulo sau bit-Reversed. Lungimea

buferrului este dată de expresie.

ENDBUFF Sfârşitul bufferului este marcat cu

ENDBUF.

label DC val1,val2 – scrie în memorie valorile val1, val2

etc. Parametrul label reprezintă

adresa curentă de memorie de la care

se începe alocarea valorilor.

label DS val – rezervă un bloc de memorie de

dimensiune egală cu val.

label DSM val – rezervă un bloc de memorie de

dimensiune egală cu val începând de

la o adresă multiplu de 2val.

2.2 Asamblarea şi linkarea programelor

Asamblorul este programul care procesează sursele scrise în limbaj de

asamblare pentru DSP-urile Motorola. Asamblorul translatează aceste surse în

coduri obiect compatibile cu alte produse software şi hardware Motorola.

asm56300 -b -a -l fişier.asm

Opţiunea -b creează fişierul obiect fişier.cln.

Opţiunea -a asamblează în mod absolut (codul nu mai poate fi realocat în

memorie) Fişierul obţinut este cod obiect absolut şi are extensia cld. În mod

curent, codul obiect obţinut este relativ şi poate fi realocat de linker la alte adrese.

Page 4: APSC_Lab2

20 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

Opţiunea -l creează fişier listă în care se pot vedea avertizările (warning)

şi erorile apărute la asamblare.

Dacă se doresc nume diferite pentru fişierele obiect şi listă, acestea trebuie

specificate după fiecare opţiune în parte.

asm56300 -bobjfile -llistfile fişier.asm

Dacă se doreşte asamblarea mai multor fişiere într-un singur fişier obiect:

asm56300 -bobjfile fişier1.asm fişier2.asm …

Linker-ul este un program care procesează fişierele obiect (realocabile)

generate de asamblor, producând un fişier absolut executabil care poate fi

încărcat direct în simulator. Se poate folosi un fişier de control pentru

specificarea poziţionării absolute a secţiunilor în memoria DSP-ului. Linker-ul

poate genera un fişier hartă (map) cu zonele de memorie alocate.

dsplnk -b fişier.asm

Opţiunea b creează fişierul executabil fişier.cld.

Alte opţiuni care se mai pot utiliza sunt:

-rctlfil trebuie citit un fişier de configurare a memoriei alocate diferitelor

secţiuni din program.

-m este creat un fişier map cu alocările făcute.

Dacă se doreşte linkarea mai multor fişiere într-un singur fişier executabil:

dsplnk –bfişier.cld fişier1.cln fişier2.cln …

Page 5: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 21

2.3 Organizarea şi adresarea memoriei

Spaţiul memoriei pentru DSP56300 este împărţit în memoria de program

P, memoria de date X şi memoria de date Y. Memoria de date este împărţită în

două zone X şi Y pentru a lucra cu cele două unităţi de calcul a adreselor şi

pentru a accesa doi operanzi simultan. Fiecare spaţiu de memorie include

memoria RAM sau ROM internă şi poate fi extins în memoria externă.

PROGRAM X-DATA Y-DATA $FFFFFF $FFFFFF $FFFFFF

$FFFF80 $FFFF80 C

$FFF000 $FFF000 $FF00C0

$FF0000 $FF0000 $FF0000

maxim maxim maxim $00FFFF $00FFFF $00FFFF

$000000 $000000 $000000

REZERVATMEMORIA P

INTERNA

192-CUVINTEBOOTSTRAP

ROM

MEMORIA PEXTERNA

CACHE 1K SAUMEMORIA PINTERNA 2K

INTERNA X-I/O

INTERNA X-I/OSAU MEMORIA

X EXTERNA

REZERVATMEMORIA X

INTERNA

MEMORIA XEXTERNA

MEMORIA XINTERNA

INTERNA SAUEXTERNA I/O

INTERNA Y-I/OSAU MEMORIA

Y EXTERNA

REZERVATMEMORIA Y

INTERNA

MEMORIA YEXTERNA

MEMORIA YINTERNA

Figura 2.1. Spaţiul memoriei pentru DSP56311

În funcţie de tipul de procesor şi de setarea bitului MS (Memory Switch

Mode) din registrul OMR (Operating Mode Register) dimensiunea memoriei

interne de program şi de date poate varia până la maxim 96kwords.

2.3.1 Unitatea de generare a adreselor (AGU)

Pentru programator AGU reprezintă trei seturi de 8 registre care pot fi

folosite atât ca registre temporare de date cât şi ca pointeri pentru adresarea

indirectă. Fiecare registru de adresare Rn are asociat un registru offset Nn şi un

registru modificator Mn. Registrele Rn sunt utilizate ca pointeri pentru a localiza

Page 6: APSC_Lab2

22 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

operanzii în memorie şi pot fi programaţi pentru adresare liniară, modulo sau bit-

reverse. Registrele Nn sunt folosiţi pentru furnizarea unei valori offset pentru

actualizarea registrelor de adresă. Registrele Mn selectează tipul de actualizare

aritmetică a adresei.

N0 M0N1 M1N2 M2N3 M3

R0 R4R1 R5R2 R6R3 R7

M4 N4M5 N5M6 N6M7 N7

EI

Multiplexor Triplu

ALUAdrese

ALUAdrese

Global Data BusProgram Adresses Bus

XAB YAB PAB

Low Adresses ALU High Adresses ALU

Figura 2.2. Schema bloc a unităţii de generare a adreselor (AGU)

2.3.2 Moduri de Adresare

Familia DSP56300 oferă patru moduri principale de adresare:

- adresare directă cu registru;

- adresare indirectă cu registru;

- adresare relativă la PC;

- alte adresări speciale (adresare imediată, adresare absolută, etc.).

Adresare directă cu registru

- registre de date: move x0,a1

- registre de adresă: move a,n7

Page 7: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 23

Adresare indirectă cu registru

1 2 3 4 5 6 X X X X X XX X A2 A1 A0

ÎNAINTEA EXECUŢIEI DUPĂ EXECUŢIE

1 2 3 4 5 6 X X X X X XX X A2 A1 A0

move a1,x: (r0)

Fără actualizare (Rn)

::

X X X X X X::

0 0 1 0 0 0

X X X X X X

F F F F F F

Memoria X

23 0

$ 1000

R0

N0

M0

::

1 2 3 4 5 6::

0 0 1 0 0 0

X X X X X X

F F F F F F

Memoria X

23 0

$ 1000

R0

N0

M0

X X X X X X 6 5 4 3 2 1X X B2 B1 B0

ÎNAINTEA EXECUŢIEI DUPĂ EXECUŢIE

X X X X X X 6 5 4 3 2 1X X B2 B1 B0

move b0,y:(r1)+

Postincrementare cu o unitate (Rn)+

::

X X X X X X:

0 0 2 0 0 0

X X X X X X

F F F F F F

Memoria Y

23 0

$ 2000

R1

N1

M1

:X X X XX X

1 2 3 4 5 6:

0 0 2 0 0 1

X X X X X X

F F F F F F

Memoria Y

23 0

$ 2000

R1

N1

M1

$ 2001

Page 8: APSC_Lab2

24 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

9 8 7 6 5 4 X X X X X X X1 X0

ÎNAINTEA EXECUŢIEI DUPĂ EXECUŢIE

9 8 7 6 5 4 X X X X X X X1 X0

move x1,x:(r4)+n4

Postincrementare cu offset (Rn)+Nn

::::

0 0 5 0 0 0

0 0 0 0 0 4

F F F F F F

Memoria X

23 0

$ 5000

R4

N4

M4

X X X X X::

0 0 5 0 0 4

0 0 0 0 0 4

F F F F F F

Memoria X

23 0

$ 5000

R4

N4

M4

$ 5004

X X X X X 9 8 7 6 5 4

ÎNAINTEA EXECUŢIEI DUPĂ EXECUŢIE

move y0,x:(r6+n6)

Indexare cu offset (Rn+Nn)

:X X X X X X

::

0 0 7 0 0 0

0 0 0 0 0 3

F F F F F F

Memoria X

23 0

$ 7003

R6

N6

M6

:A B C D E F

:

0 0 7 0 0 0

0 0 0 0 0 3

F F F F F F

Memoria X

23 0

$ 7000

R6

N6

M6

$ 7003

X X X X X X X X X X X X: :

X X X X X X A B C D E F Y1 Y0

X X X X X X A B C D E F Y1 Y0

$ 7000

Page 9: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 25

ÎNAINTEA EXECUŢIEI DUPĂ EXECUŢIE

move x:-(r3),b

Predecrementare cu o unitate -(Rn)

:X X X X X X

1 2 1 2 1 2:

0 0 4 0 0 0

X X X X X X

F F F F F F

Memoria X

23 0

$ 4000

R3

N3

M3

:X X X X X X

1 2 1 2 1 2:

0 0 3 F F F

X X X X X X

F F F F F F

Memoria X

23 0

$ 3FFF

R3

N3

M3

$ 4000

X X X X X X X X X X X XX X B2 B1 B0

1 2 1 2 1 2 0 0 0 0 0 00 0 B2 B1 B0

Adresare imediată.

Acest mod de adresare include valoarea imediată în cadrul instrucţiunii.

move #$123456,a0

Adresare absolută.

Adresa operandului este conţinută în codul instrucţiunii.

move y:$1000,b0

Pentru exerciţiile următoare se vor folosi şi următoarele instrucţiuni de

ciclare

REP no_loops repetă instrucţiunea următoare de no_loops ori.

no_loops: valoarea aflată la o adresă efectivă sau absolută

[x/y]:addr

orice registru intern

valoare imediată: #xxx

Page 10: APSC_Lab2

26 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

DO no_loops, end_do repetă instrucţiunile aflate până la end_do

de no_loops ori.

no_loops: valoarea aflată la o adresă efectivă sau absolută

[x/y]:addr

orice registru intern

valoare imediată: #xxx

end_do: adresă absolută

Exerciţiul 1:

Să se calculeze suma a 10N = numere. Se consideră numerele scrise sub

formă fracţionară în memoria de date X de la adresa $100.

N equ 10 ;numărul de puncte

org x:$100

data dc 0.8,-0.2,0.6,-0.4,0.5,-0.6,0.2,-0.1,0.3,-0.5

org p:$100

start

move #data,r0

move x:(r0)+,x0

clr a

rep #N

add x0,a x:(r0)+,x0

end

• În directorul /motorola/apsc/ se creează un fişier text suma.asm în

care se scrie programul anterior.

• Într-o fereastra MS-DOS deschisă în acelaşi director se dă comanda de

asamblare:

• asm56300 -a -b -l suma.asm

Page 11: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 27

• Dacă se raportează erori de asamblare se vizualizează fişierul

suma.lst.

• Dacă nu sunt erori se creează un fişier suma.cld care conţine cod

executabil care poate fi încărcat în simulator cu comanda LOAD-

Memory COFF.

• În simulator se deschide fereastra MEMORY X şi se afişează datele

aflate la adresa $100 în format fracţionar.

• Registrele x0 şi a vor fi schimbate în modul fracţionar.

• Se rulează instrucţiune cu instrucţiune şi se verifică rezultatul.

Exerciţiul 2:

Să se modifice programul anterior pentru calculul mediei a N=2n numere.

Exerciţiul 3:

Să se realizeze un program pentru calculul sumei pătratelor modulelor a 8

numere complexe. Stabiliţi organizarea optimă în memorie a datelor şi optimizaţi

programul pentru un timp de execuţie minim.

2.4 Adresarea modulo

Adresarea modulo (sau circulară) asigură că adresa rămâne într-un interval

de lungime M (unde M este între 2 şi 32768). Valoarea 1−M este stocată în

registrul modificator Mn. Adresa inferioară a cadrului (adresa de bază) trebuie să

aibă k zerouri în biţii LSB, unde Mk ≥2 .

Să considerăm un cadru de lungime 20=M ca în figura 2.3. Datele sunt

scrise sau citite din 3 în 3. Adresa de start este $29 (stocată în R0). Se doreşte o

adresare modulo (să nu se depăşească limitele cadrului).

Page 12: APSC_Lab2

28 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

LungimebufferM=20

OffsetN=3

$33$32

$2f

$2c

$29

$21$20Începutul

cadrului

Sfârşitulcadrului

MemoriaX sau Y

Adresade start

Figura 2.3. Adresarea circulară pe un cadru de lungime 20.

1. Pentru adresarea modulo 20=M rezultă valoarea registrului modificator:

13$1M0 =−= M

2. Offsetul este egal cu 3 şi este scris în registrul N0.

R0 N0 M0 $000029 $000003 $000013

3. Adresa de bază a cadrului trebuie aleasă o putere a lui 2 care să îndeplinească

condiţia:

Mk ≥2 .

Rezultă 5=k , deci adresa este 32 care în hexazecimal este $000020.

4. Adresa de sfârşit este:

000033$12 =−+ Mk

Page 13: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 29

Exerciţiul 3:

Realizaţi un program care să calculeze determinantul următoarei matrice

de dimensiuni 3x3, folosind adresarea circulară.

0.3 0.25 0.10.6 0.5 0.2

0.2 0.4 0.1A

−⎡ ⎤⎢ ⎥= − −⎢ ⎥⎢ ⎥−⎣ ⎦

Elementele matricei sunt stocate în memorie pe linii.

Exerciţiul 4: Înmulţirea matricelor

Matricele sunt folosite pentru stocarea datelor multidimensionale în

procesarea semnalelor, pentru sisteme de control (la stocarea coeficienţilor

ecuaţiilor diferenţiale) şi în aplicaţiile de prelucrare a imaginilor. Fie exemplulu

următor de înmulţire a matricelor:

Dimensiunile matricelor A, B şi C sunt N x M, M x P şi, respectiv, N x P,

unde N=2, M=4 şi P=3.

Definirea spaţiului de memorie

Matricele sunt stocate linie cu linie aşa cum se arată în figura 2.4. Când se

accesează date din matricele A sau C (pe linie), pointerul trebuie post

incrementat cu o unitate. La înmulţirea matricilor, datele din matricea B sunt

accesate pe coloană, aşa că pointerul trebuie postincrementat cu trei. Pentru

implementarea incrementării adreselor se folosec buffere modulo pentru

matricele A şi B.

Page 14: APSC_Lab2

30 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

0.6460.4740.3020.3460.2540.1620,.230.220.210.200.130.120.110.10

0.780.580.380.760,560.360.740.540.340.720.520.32Matricea A Matricea B

Matricea C

Memoria YMemoria X

$100 $100

$108

Figura 2.4. Organizarea datelor în memorie pentru înmulţirea matricelor.

Repetarea operaţiilor specifice înmulţirii pe linii şi coloane

Pentru implementarea înmulţirii a două matrice, trei cicluri intercalate sunt

necesare cu un total de 24 de înmulţiri şi acumulări pentru acest exemplu. Două

tipuri de cicluri sunt folosite: do#n şi rep. Se foloseşte instrucţiunea dor,

echivalentă cu do, cu observaţia că adresele de sfârşit de ciclu sunt stocate ca

valori relative în loc de valori absolute. Dacă ciclul conţine o singură

instrucţiune, se foloseşte instrucţiunea rep. Numărul de cicluri poate fi o valoare

imediată sau o variabilă dintr-un registru.

După terminarea fiecărui ciclu interior (instrucţiunea rep), pointerul

pentru matricea A trebuie să indice startul aceleiaşi linii, în timp ce pointerul

pentru B trebuie să indice coloana următoare. Dacă nu s-ar fi folosit adresarea

modulo atunci ar fi fost necesare registre în plus pentru adresele de la începutul

fiecărei linii sau coloane din matricele A, respectiv B.

Page 15: APSC_Lab2

Laborator 2 – Realizarea programelor în limbaj de asamblare 31

Modalităţile de adresare a datelor în memorie

Obţinerea adresării modulo se face cu registrele modificator mx asociate

registrelor rx. Pointerul pentru matricea A (registrul r0) este modificat modulo 4

(registrul m0=3) aşa că acesta automat revine la valoarea iniţială la sfârşitul

fiecărui ciclu interior. La sfârşitul ciclului 2, r0 este incrementat cu 4 astfel ca să

indice începutul următoarei linii din A.

Pointerul matricei B (registrul r4) este modificat modulo 12 (registrul

m4=11) aşa că revine la valoarea iniţială la sfârşitul ciclului. La sfârşitul ciclului

r4 este incrementat cu 3 ca să indice coloana următoare a matricei B pentru ciclul

al doilea.

Matricea C este implementată cu un buffer simplu fără adresare modulo

folosindu-se registrul r1 ca registru adresă (registrul m1=$ffff valoare implicită

după reset)

Observaţie: Folosirea bufferelor circulare implică respectarea anumitor

reguli în plasarea datelor în memorie. De aceea la declararea variabilelor se

foloseşte directiva buffer pentru a se asigura alinierea corectă a datelor în

memorie.

M equ 4

P equ 3

N equ 2

org x:$100

; Matricea A este declarată în memoria de date X

buffer m,N*M ; buffer modulo de lungime N*M

A_ptr dc 0.10,0.11,0.12,0.13

dc 0.20,0.21,0.22,0.23

endbuf

; A_ptr este adresa primului element al matricei A

C_ptr ds N*P ;Rezervă spaţiu pentru matricea rezultat C

Page 16: APSC_Lab2

32 APLICAŢII ALE PROCESOARELOR DE SEMNAL ÎN COMUNICAŢII

org y:$100 ; Matricea B -> în memoria Y

buffer m,M*P

B_ptr dc 0.32,0.52,0.72

dc 0.34,0.54,0.74

dc 0.36,0.56,0.76

dc 0.38,0.58,0.78

endbuf

org p:$100

start

move #A_ptr,r0 ; pointer pentru matricea A

move #C_ptr,r1 ; pointer pentru matricea C

move #P,n4 ; ofset pentru adresarea matricei B

move #(M*P-1),m4 ; adresare modulo 12 pentru matricea B

move #(M-1),m0 ; adresare modulo 4 pentru matricea A

dor #N,loop1

move #B_ptr,r4 ; pointer pentru matricea B

dor #P,loop2

clr a x:(r0)+,x0 y:(r4)+n4,y0

rep #M-1

mac x0,y0,a x:(r0)+,x0 y:(r4)+n4,y0

mac x0,y0,a

move a,x:(r1)+ ; salvarea rezultatului

lua (r4+1),r4 ; r4 -> coloana urmatoare a lui B

loop2 ; sfarsitul buclei loop2

lua (r0+M),r0 ; se muta la coloana urmatoare a lui A

loop1 ; sfarsitul buclei loop1

bra loop1