30.06.2015 Views

I Linguaggi Assembler - Politecnico di Torino

I Linguaggi Assembler - Politecnico di Torino

I Linguaggi Assembler - Politecnico di Torino

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!