I Linguaggi Assembler - Politecnico di Torino
I Linguaggi Assembler - Politecnico di Torino
I Linguaggi Assembler - Politecnico di Torino
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
M. Sonza Reorda<br />
<strong>Politecnico</strong> <strong>di</strong> <strong>Torino</strong><br />
Dip. <strong>di</strong> Automatica e Informatica<br />
1<br />
M. Sonza Reorda - a.a. 2001/02<br />
Processo <strong>di</strong> Assemblaggio<br />
Utente<br />
E<strong>di</strong>tor<br />
Co<strong>di</strong>ce<br />
Sorgente<br />
Co<strong>di</strong>ce<br />
Oggetto<br />
Assemblatore<br />
Debugger<br />
CPU<br />
Linker<br />
Co<strong>di</strong>ce<br />
Eseguibile<br />
Loader<br />
Co<strong>di</strong>ce<br />
Macchina<br />
2<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 1
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Assemblaggio<br />
Il file sorgente viene trasformato in file oggetto tramite:<br />
• Rimozione dei commenti<br />
• Associazione <strong>di</strong> ciascuna variabile simbolica ad una<br />
adeguata locazione <strong>di</strong> memoria<br />
• Traduzione in co<strong>di</strong>ce macchina <strong>di</strong> ciascuna istruzione.<br />
Alcune operazioni non possono ancora essere completate,<br />
ad esempio quelle che riguardano:<br />
• Le variabili definite in altri moduli<br />
• Le procedure definite in altri moduli.<br />
3<br />
M. Sonza Reorda - a.a. 2001/02<br />
Link<br />
Procede alla creazione del file eseguibile a partire da più<br />
file oggetto.<br />
Provvede a verificare la correttezza dei richiami a variabili<br />
e procedure definite in altri moduli e a generare gli<br />
in<strong>di</strong>rizzi opportuni.<br />
Il file prodotto non è <strong>di</strong> solito imme<strong>di</strong>atamente eseguibile in<br />
quanto<br />
• Risiede su <strong>di</strong>sco anziché in memoria<br />
• Deve essere in<strong>di</strong>pendente dalla posizione in memoria in<br />
cui verrà caricato.<br />
4<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 2
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Loader<br />
Fa parte del Sistema Operativo.<br />
Provvede a<br />
• reperire il file eseguibile su <strong>di</strong>sco<br />
• caricarlo in memoria, eseguendo le eventuali mo<strong>di</strong>fiche<br />
rese necessarie dopo che è stata decisa la sua posizione<br />
in memoria<br />
• Fare in modo che il processore inizi l’esecuzione del<br />
programma.<br />
5<br />
M. Sonza Reorda - a.a. 2001/02<br />
Debugger<br />
Interagisce con i processi <strong>di</strong> assemblaggio, link ed<br />
esecuzione, permettendo al programmatore <strong>di</strong> <strong>di</strong>sporre <strong>di</strong><br />
facilities quali:<br />
• Breakpoint<br />
• Esecuzione passo passo<br />
• Accesso a variabili e registri (in lettura e scrittura)<br />
• …<br />
6<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 3
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Caratteristiche <strong>di</strong> un linguaggio<br />
<strong>Assembler</strong><br />
• Operazioni Permesse<br />
• Tipi <strong>di</strong> dato<br />
• Formato delle Istruzioni<br />
• Registri Utilizzabili<br />
• Mo<strong>di</strong> <strong>di</strong> In<strong>di</strong>rizzamento<br />
• Facilità d’uso<br />
• ...<br />
7<br />
M. Sonza Reorda - a.a. 2001/02<br />
Formato delle Istruzioni<br />
A livello <strong>di</strong> co<strong>di</strong>ce macchina, le istruzioni sono formate <strong>di</strong> 2<br />
parti:<br />
• il co<strong>di</strong>ce dell’operazione da svolgere (opcode)<br />
• gli operan<strong>di</strong>.<br />
A seconda del numero tipico <strong>di</strong> operan<strong>di</strong> ammesso in ogni<br />
istruzione si possono avere processori a 0, 1, 2 o 3 operan<strong>di</strong>.<br />
opcode operando 1 operando 2<br />
8<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 4
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Mo<strong>di</strong> <strong>di</strong> In<strong>di</strong>rizzamento<br />
Rappresentano i mo<strong>di</strong> attraverso i quali è specificato il tipo<br />
ed il valore o la posizione <strong>di</strong> ciascun operando.<br />
I più frequenti sono:<br />
• in<strong>di</strong>rizzamento imme<strong>di</strong>ato<br />
• in<strong>di</strong>rizzamento <strong>di</strong>retto<br />
• in<strong>di</strong>rizzamento in<strong>di</strong>retto.<br />
Laddove compare come operando un in<strong>di</strong>rizzo, questo può<br />
essere specificato in 2 mo<strong>di</strong>:<br />
• in<strong>di</strong>rizzamento assoluto<br />
• in<strong>di</strong>rizzamento relativo.<br />
9<br />
M. Sonza Reorda - a.a. 2001/02<br />
In<strong>di</strong>rizzamento Imme<strong>di</strong>ato<br />
Il valore dell’operando è specificato <strong>di</strong>rettamente<br />
nell’istruzione.<br />
Esempio<br />
MVI A, 99<br />
In<strong>di</strong>rizzamento<br />
imme<strong>di</strong>ato<br />
10<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 5
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
In<strong>di</strong>rizzamento Diretto<br />
Nell’istruzione è specificato l’in<strong>di</strong>rizzo della cella <strong>di</strong><br />
memoria ove si trova l’operando.<br />
Esempio<br />
MOV xxxx, 57<br />
xxxx<br />
57<br />
In<strong>di</strong>rizzamento<br />
<strong>di</strong>retto<br />
11<br />
M. Sonza Reorda - a.a. 2001/02<br />
In<strong>di</strong>rizzamento In<strong>di</strong>retto<br />
Nell’istruzione è specificato l’in<strong>di</strong>rizzo <strong>di</strong> una cella <strong>di</strong><br />
memoria, in cui è scritto l’in<strong>di</strong>rizzo dell’operando.<br />
Esempio<br />
MOV [xxxx], 57<br />
xxxx<br />
yyyy<br />
In<strong>di</strong>rizzamento<br />
in<strong>di</strong>retto<br />
yyyy<br />
57<br />
12<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 6
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
In<strong>di</strong>rizzamento Assoluto<br />
L’in<strong>di</strong>rizzo dell’operando è specificato per esteso<br />
nell’istruzione.<br />
Esempio<br />
MOV xxxx, 57<br />
xxxx<br />
57<br />
In<strong>di</strong>rizzamento<br />
assoluto<br />
13<br />
M. Sonza Reorda - a.a. 2001/02<br />
In<strong>di</strong>rizzamento Relativo<br />
L’istruzione specifica dove si trova un valore, che<br />
corrisponde ad uno spiazzamento rispetto ad un certo<br />
in<strong>di</strong>rizzo <strong>di</strong> riferimento (base).<br />
Esempio<br />
R+D<br />
R<br />
D<br />
base<br />
spiazzamento<br />
14<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 7
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
In<strong>di</strong>rizzamento Relativo (II)<br />
Vantaggi:<br />
• minor lunghezza dell’istruzione<br />
• rilocabilità<br />
• facilità <strong>di</strong> scansione <strong>di</strong> vettori.<br />
Svantaggi:<br />
• complessità dell’hardware<br />
• maggiore tempo <strong>di</strong> esecuzione.<br />
15<br />
M. Sonza Reorda - a.a. 2001/02<br />
Autoindexing<br />
Consiste nella possibilità <strong>di</strong> specificare una operazione <strong>di</strong><br />
incremento (o decremento) da eseguirsi su un registro<br />
in<strong>di</strong>ce prima (o dopo) il suo uso.<br />
Esempio<br />
Nell’assembler 68000 un operando nella forma -(A3)<br />
in<strong>di</strong>ca che il registro A3 deve essere decrementato prima <strong>di</strong><br />
essere usato come in<strong>di</strong>ce. Analogamente esiste la forma <strong>di</strong><br />
autoincremento (A3)+.<br />
L’entità dell'incremento/decremento è <strong>di</strong>versa a seconda<br />
della lunghezza dell’operando cui si riferisce.<br />
L’autoincremento/decremento è particolarmente utile<br />
nell’implementazione delle operazioni su stack.<br />
16<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 8
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Operan<strong>di</strong> Multipli<br />
Taluni linguaggi assembler possiedono istruzioni in grado<br />
<strong>di</strong> operare su blocchi <strong>di</strong> dati anzichè su un singolo<br />
operando.<br />
In tali casi all’istruzione devono venire specificati:<br />
• l’in<strong>di</strong>rizzo <strong>di</strong> partenza del blocco<br />
• la sua lunghezza<br />
• il tipo dei dati su cui lavorare.<br />
17<br />
M. Sonza Reorda - a.a. 2001/02<br />
Mo<strong>di</strong> <strong>di</strong> In<strong>di</strong>rizzamento:<br />
modalità d’uso<br />
Il modo <strong>di</strong> in<strong>di</strong>rizzamento desiderato per ciascun operando<br />
può venire specificato in mo<strong>di</strong> <strong>di</strong>versi, a seconda del<br />
linguaggio assembler utilizzato:<br />
• possono esistere istruzioni <strong>di</strong>verse a seconda del modo<br />
<strong>di</strong> in<strong>di</strong>rizzamento desiderato; ad esempio nell’8085<br />
sono permesse le 2 istruzioni MOV A, B e MVI A, 99<br />
• ogni operando può assumere forme <strong>di</strong>verse a seconda<br />
del modo ad esso relativo; nell’<strong>Assembler</strong> 68000 si<br />
possono scrivere le seguenti istruzioni: MOVE D2, D1 e<br />
MOVE #99, D1.<br />
18<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 9
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Ortogonalità<br />
È una caratteristica <strong>di</strong> alcuni linguaggi <strong>Assembler</strong>, tale per<br />
cui ogni operando <strong>di</strong> ogni istruzione può essere espresso<br />
attraverso uno qualsiasi dei mo<strong>di</strong> <strong>di</strong> in<strong>di</strong>rizzamento.<br />
L’ortogonalità riduce i costi <strong>di</strong> programmazione, ma<br />
aumenta quelli dell’hardware.<br />
19<br />
M. Sonza Reorda - a.a. 2001/02<br />
Numero <strong>di</strong> Operan<strong>di</strong><br />
I processori possono essere classificati in base al numero <strong>di</strong><br />
operan<strong>di</strong> esprimibili nella singola istruzione.<br />
Se il numero <strong>di</strong> operan<strong>di</strong> è minore, il tempo <strong>di</strong> deco<strong>di</strong>fica<br />
ed esecuzione dell’istruzione è minore, come pure la<br />
memoria richiesta dal co<strong>di</strong>ce.<br />
D’altro canto una stessa operazione richiede un numero <strong>di</strong><br />
istruzioni maggiore per essere eseguita, se queste hanno un<br />
numero ridotto <strong>di</strong> operan<strong>di</strong>.<br />
20<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 10
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Processori a 3 operan<strong>di</strong><br />
Ogni istruzione contiene l’in<strong>di</strong>cazione dei 2 operan<strong>di</strong> e del<br />
risultato.<br />
Esempio<br />
Si supponga <strong>di</strong> voler eseguire l’operazione<br />
X=AxB+CxC<br />
Co<strong>di</strong>ce:<br />
MULT<br />
MULT<br />
ADD<br />
T, A, B<br />
X, C, C<br />
X, X, C<br />
21<br />
M. Sonza Reorda - a.a. 2001/02<br />
Processori a 2 operan<strong>di</strong><br />
Ogni istruzione contiene l’in<strong>di</strong>cazione dei 2<br />
operan<strong>di</strong>; il risultato coincide con uno dei 2.<br />
Esempio<br />
MOV<br />
MULT<br />
MOV<br />
MULT<br />
ADD<br />
T, A<br />
T, B<br />
X, C<br />
X, C<br />
X, T<br />
22<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 11
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Processori ad 1 Operando<br />
Il secondo operando ed il risultato<br />
corrispondono al registro accumulatore.<br />
Esempio<br />
LOAD<br />
MULT<br />
STORE<br />
LOAD<br />
MULT<br />
ADD<br />
STORE<br />
A<br />
B<br />
T<br />
C<br />
C<br />
T<br />
X<br />
23<br />
M. Sonza Reorda - a.a. 2001/02<br />
Processori a 0 operan<strong>di</strong><br />
Ogni istruzione preleva i 2 operan<strong>di</strong> dallo stack<br />
tramite 2 operazioni <strong>di</strong> push, e memorizza il<br />
risultato nello stack tramite una pop.<br />
Esempio<br />
PUSH<br />
PUSH<br />
MULT<br />
PUSH<br />
PUSH<br />
MULT<br />
ADD<br />
POP<br />
A<br />
B<br />
C<br />
C<br />
X<br />
24<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 12
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Notazione Polacca<br />
L’or<strong>di</strong>ne con cui vengono eseguite le operazioni in un<br />
processore a 0 operan<strong>di</strong> corrisponde a quello della<br />
notazione polacca inversa.<br />
La notazione polacca (inventata da J. Lukasiewicz) prevede<br />
che la generica istruzione X*X venga rappresentata come<br />
*XX (notazione polacca prefissa) o XX* (notazione polacca<br />
suffissa o inversa).<br />
La notazione polacca permette <strong>di</strong> rappresentare<br />
qualsivoglia espressione senza l’uso <strong>di</strong> parentesi.<br />
25<br />
M. Sonza Reorda - a.a. 2001/02<br />
Co<strong>di</strong>ce Operativo<br />
Serve ad identificare l’istruzione. Può occupare un numero<br />
variabile <strong>di</strong> bit, tipicamente 8 o 16.<br />
In taluni casi una parte <strong>di</strong> questi bit viene utilizzata per<br />
specificare gli operan<strong>di</strong>.<br />
Non necessariamente i co<strong>di</strong>ci operativi <strong>di</strong> tutte le istruzioni<br />
hanno la stessa lunghezza.<br />
26<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 13
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Formato delle Istruzioni nell’8085<br />
1 byte<br />
ADD r<br />
co<strong>di</strong>ce operativo<br />
operando 2<br />
(registro)<br />
2 byte<br />
ADI d<br />
co<strong>di</strong>ce operativo<br />
operando imme<strong>di</strong>ato o in<strong>di</strong>rizzo<br />
3 byte<br />
JMP addr<br />
co<strong>di</strong>ce operativo<br />
operando imme<strong>di</strong>ato o in<strong>di</strong>rizzo<br />
27<br />
M. Sonza Reorda - a.a. 2001/02<br />
Formato delle Istruzioni nel PDP-11<br />
15 0<br />
Opcode Source Destination<br />
Byte/<br />
Parola<br />
Modo Registro Modo Registro<br />
Il co<strong>di</strong>ce operativo può essere espanso scrivendo il co<strong>di</strong>ce<br />
x111 nei primi 4 bit e utilizzando i 6 bit successivi (istruzioni<br />
ad 1 operando).<br />
Le istruzioni che in<strong>di</strong>rizzano la memoria hanno 1 o 2 parole<br />
ad<strong>di</strong>zionali da 16 bit.<br />
28<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 14
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Tipi <strong>di</strong> Istruzioni<br />
Ogni processore ha il suo linguaggio <strong>Assembler</strong>.<br />
Esistono tuttavia forti somiglianze tra i linguaggi<br />
<strong>Assembler</strong> dei vari processori.<br />
Le caratteristiche <strong>di</strong> un buon linguaggio sono:<br />
• completezza<br />
• efficienza<br />
• regolarità (ortogonalità)<br />
• compatibilità rispetto a precedenti versioni.<br />
29<br />
M. Sonza Reorda - a.a. 2001/02<br />
Classi <strong>di</strong> Istruzioni<br />
• Istruzioni <strong>di</strong> Trasferimento dati<br />
• Istruzioni Aritmetiche<br />
• Istruzioni Logiche<br />
• Istruzioni per il Controllo del Programma<br />
• Istruzioni <strong>di</strong> Input/Output.<br />
30<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 15
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Istruzioni <strong>di</strong> Trasferimento Dati<br />
MOVE<br />
STORE<br />
LOAD<br />
EXCHANGE<br />
CLEAR<br />
SET<br />
PUSH<br />
POP<br />
31<br />
M. Sonza Reorda - a.a. 2001/02<br />
Istruzioni Aritmetiche<br />
ADD<br />
SUBTRACT<br />
MULTIPLY<br />
DIVIDE<br />
ABSOLUTE<br />
NEGATE<br />
INCREMENT<br />
DECREMENT<br />
32<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 16
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Istruzioni Logiche<br />
AND<br />
OR<br />
NOT<br />
EXOR<br />
EQUIVALENCE<br />
SHIFT<br />
ROTATE<br />
CONVERT<br />
33<br />
M. Sonza Reorda - a.a. 2001/02<br />
Istruzioni per il Controllo del<br />
Programma<br />
JUMP (BRANCH)<br />
JUMP CONDITIONAL<br />
CALL (BRANCH-AND-LINK)<br />
RETURN<br />
EXECUTE<br />
SKIP<br />
SKIP CONDITIONAL<br />
TEST<br />
COMPARE<br />
SET CONTROL<br />
VARIABLES<br />
HALT<br />
WAIT (HOLD)<br />
NO OPERATION<br />
34<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 17
I <strong>Linguaggi</strong> <strong>Assembler</strong><br />
Istruzioni <strong>di</strong> I/O<br />
INPUT (READ)<br />
OUTPUT (WRITE)<br />
START IO<br />
TEST IO<br />
HALT IO<br />
35<br />
M. Sonza Reorda - a.a. 2001/02<br />
Matteo SONZA REORDA 18