APSC_Lab2
-
Upload
anonymous1995 -
Category
Documents
-
view
212 -
download
0
description
Transcript of 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 ;.
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ă).
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.
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 …
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
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
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
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
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
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
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).
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
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.
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.
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
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