LINGUAGGIO ASSEMBLY Come semplificare la stesura di codice

LINGUAGGIO ASSEMBLY
DAL LINGUAGGIO MACCHINA
VERSO LINGUAGGI DI ALTO
LIVELLO
Come semplificare la stesura di
codice macchina?
L’ASSEMBLY propone di sostituire i codici binari in PAROLE
CHIAVE che possono essere “ricordate” dal programmatore e
che quindi hanno più senso per lui.
Per questo motivo si parla spesso di “codice mnemonico”.
Si può scrivere il codice in un linguaggio più umano…
E poi farlo TRADURRE in linguaggio macchina.
Il programma che traduce si chiama ASSEMBLER.
1
Quali gli elementi
dell’Assembly?
-Utilizzo di nomi simbolici per indicare locazioni di
memoria;
-Utilizzo di nomi simbolici per indicare le istruzioni di
base eseguibile dalla CPU.
COMMENTO:
Si trarra di istanze estremamente elementari e “povere” dei concetti
fondamentali della programmazione imperativa:
VARIABILI, OPERATORI, FUNZIONI
Indirizzi Simbolici
Una locazione di memoria viene indicata
attraverso un nome simbolico anziché un
indirizzo effettivo.
Esempio: l’indirizzo di memoria 01010101
viene indicato con il nome simbolico: “casa”.
Ogni qualvolta la macchina incontrerà il
simbolo “casa” andrà ad “allocare” la parte di
memoria che inizia dal punto 01010101
2
I COMANDI
UN ELENCO PER TIPI
• TRASFERIMENTI DI DATI DA UNA
LOCAZIONE DI MEMORIA AD
UN’ALTRA;
• OPERAZIONI ARITMETICHE;
• CONFRONTO;
• CODICI DI CONDIZIONE ED
ETICHETTA DI ISTRUZIONE.
TRASFERIMENTI DI DATI DA UNA
LOCAZIONE DI MEMORIA AD
UN’ALTRA
RAPPRESENTEREMO UNA LOCAZIONE DI
MEMORIA VUOTA COME COSTITUITA DA 8 BIT IN
QUESTO MODO:
FFFGHKKKKKKKK
3
ESEMPIO DEL PASSAGGIO DEL DATO 00001111
DALLA LOCAZIONE DI MEMORIA A ALLA
LOCAZIONE DI MEMORIA VUOTA B
0 0 0 0 11 1 1
KKKKKKKK
A
KKKKKKKK
0 0 0 0 11 1 1
A
KKKKKKKK
B
KKKKKKKK
0 0 0 0 11 1 1
B
SE LA MEMORIA DI ARRIVO NON E’ VUOTA?
SEMPLICEMENTE RISCRIVE IL
DATO SOPRA IL PRECEDENTE
CANCELLANDONE MEMORIA!
4
ESEMPIO DEL PASSAGGIO DEL DATO 00001111
DALLA LOCAZIONE DI MEMORIA A ALLA
LOCAZIONE DI MEMORIA B CHE CONTIENE
01010110
0 0 0 0 11 1 1
KKKKKKKK
A
KKKKKKKK
0 0 0 0 11 1 1
A
KKKKKKKK
0 1 0 10 1 1 0
B
KKKKKKKK
0 0 0 0 11 1 1
B
ELENCO DEI COMANDI DI
ASSEMBLER PER IL
TRASFERIMENTO DATI
• LOAD <indirizzo simbolico> <nome registro>;
• STORE <nome registro> <indirizzo simbolico>;
• MOVE <nome registro> <nome registro>;
5
ESEMPIO DI LOAD: copia il contenuto della
memoria indicata con indirizzo simbolico “casa”
nel registro “R ”
0 0 00 1 1 1 1
KKKKKKKK
casa
0 0 00 1 1 1 1
KKKKKKKK
casa
KKKKKKKK
R
0 0 00 1 1 1 1
KKKKKKKK
R
ESEMPIO DI STORE: copia il contenuto del
registro “R” nella memoria indicata con
indirizzo simbolico “casa”
0 0 00 1 1 1 1
KKKKKKKK
KKKKKKKK
R
casa
0 0 00 1 1 1 1
KKKKKKKK
R
0 0 00 1 1 1 1
KKKKKKKK
casa
6
ESEMPIO DI MOVE: copia il contenuto del
registro “R” nel registro “M”
0 0 00 1 1 1 1
KKKKKKKK
R
0 0 00 1 1 1 1
KKKKKKKK
R
KKKKKKKK
M
0 0 00 1 1 1 1
KKKKKKKK
M
OPERAZIONI ARITMETICHE
• ADD <operando><registro>(somma l’operando al
contenuto del registro)
• SUB <operando><registro>>(sottrae l’operando al
contenuto del registro)
• MULT<operando><registro>>(moltiplica
l’operando al contenuto del registro)
• DIV<operando><registro>>(divide l’operando al
contenuto del registro)
7
ESEMPIO1
(1)LOAD x,R1
(2)ADD #2,R1
(3)STORE R1,risultato
Aggiunge 2 a x
ISTRUZIONE DI CONFRONTO
COMPARE<registro1><registro2>
Confronta il contenuto dei due registri ed
agisce sul contenuto dei codici condizione
8
STATO DEI CODICI CONDIZIONE
Esempio:
COMPARE R,M
EQ
NE
LT
LE
GT
GE
R=M
1
0
0
1
0
1
R<M
0
1
1
1
0
0
R>M
….
….
….
….
….
….
…….
….
….
….
….
….
….
…….
….
….
….
….
….
….
…….
….
….
….
….
….
….
ISTRUZIONI DI SALTO
• BREQ<etichetta>
(salta all’etichetta indicata se EQ=1)
• BRNE<etichetta>
• BRLT<etichetta>
• BRLE<etichetta>
• BRGT<etichetta>
• BRGE<etichetta>
• BRANCH<etichetta>
(salto incondizionato all’etichetta indicata)
9
ESEMPIO2
(1)LOAD a, R1
(2)LOAD b,R2
(3)COMPARE R1,R2
(4)BRGE etich1
(5)ADD R2,R1
(6)STORE R1,a
(7)BRANCH etich2
(8)etich1:SUB R2,R1
(9)STORE R1,B
(10)etich2:
Se a<b somma “b” ad “a”, altrimenti lo
sottrae
Osservazioni
È facile sbagliare nella stesura del codice. Il programma
precednete è lungi dall’essere un esempio ideale!
Nel codice della slide precedente il risultato va a
finire nella locazione “a” in un caso e nella locazione
“B” in un altro.
Ma quale è la locazione “B”? Essa è diversa dalla
“b” introdotta all’inizio?
Ancora: abbiamo usato nomi poco significativi “a”,
“b”, “etichetta1” etc. Questo rende la correzione di
eventuali errori e la comprensione del codice più
complicata. Meglio usare nomi espressivi!
10
Un supporto grafico alla comprensione
di un programma
LOAD a,R1
LOAD b,R2
ADD R1,R2
COMPARE
R1,R2
NOT
BRGE
STORE R1,a
BRGE
END
SUB R1,R2
STORE R1,b
Confronto:
dal basso all’alto livello
LOAD
a,R1
LOAD
b,R2
ADD
R1,R2
COMPARE
R1,R2
…
00000010
00110010
00001000
00011000
….
….
00000100
00100010
LOAD a, R1
LOAD b,R2
COMPARE R1,R2
BRGE etich1
ADD R2,R1
STORE R1,a
BRANCH etich2
etich1:SUB R2,R1
STORE R1,B
etich2:
NO
T
BR
GE
BR
GE
STORE
R1,a
END
SUB
R1,R2
STORE
R1,b
IF (a<b) THEN a+b
ELSE a-b
Se a<b
allora restituisci a+b
altrimenti
restituisci a-b
11