|
Appunti informatica |
|
Visite: 1372 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:APPUNTI DI INFORMATICA TEORICA - Complessità computazionale, funzioni ricorsive, liste, alberiUNIVERSITA' DEGLI STUDI DI PISA CORSO DI INGEGNERIA INFORMATICA (NUOVO ORDINAMENTO) APPUNTI Elea 9003Elea 9003 ELEA 9003 è un calcolatore dalle grandissime dimensioni e prestazioni, La TelematicaLa Telematica La parola telematica nasce dall'unione dei termini telecomunicazioni |
ISTRUZIONI DI SALTO CONDIZIONATO
(Con l'operando G si intende un indirizzo di memoria un registro A o D)
(D = registri dati D; A = registri indirizzi A)
Flag C (riporto)
BCS Salta se c'è riporto C=1
BCC Salta se non c'è riporto C=0
Flag V (overflow)
BVS Salta se c'è overflow V=1
BVC Salta se non c'è overflow V=0
Flag Z (zero)
BEQ Salta se gli operandi sono uguali Z=1
BNE Salta se gli operandi non sono uguali Z=0
Flag N (negativo)
BMI Salta se la differenza è negativa N=1
BPL Salta se la differenza è positiva N=0
(il flag X con l'istruzione CMP non viene alterato)
ISTRUZIONI DI SALTO CONDIZIONATO
A PIU FLAG
~ SIGNED ~
BLT Salta se D<S
BGE Salta se D≥S
BGT Salta se D>S
BLE Salta se D≤S
~ UNSIGNED ~
BLS Salta se D≤S
BHI Salta se D>S (Questa istruzione in ASIM non funziona)
BLO Salta se D<S
BHS Salta se D≥S
Istruzione: CMP S,D (Sorg.,Dest.)
ISTRUZIONI CHE LAVORANO SU BIT
BTST #im,G Testa il bit puntato da im e opera sul flag Z se il bit im=0 Z=1
BCLR #im,G Opera come BTST ma in oltre azzera il bit puntato
BSET #im,G Opera come BTST ma in oltre pone il bit puntato =1
BCHG #im,G Opera come BTST ma in oltre complementa il bit puntato
ISTRUZIONI CHE LAVORANO SU: BYTE, WORD, LONGWORD
CLR G Istruzione di pulitura o azzeramento dell'operando (B,W,L)
TST G Testa l'operando e imposta opportunamente i flag N e Z
TAS G Opera come TST ma solo su dato di tipo byte, inoltre pone il bit più significativo pari a 1.
EXG Rx,Ry Scambia il contenuto dei due registri generali l'istruzione funziona solo come longword e non altera i flag dello SR.
CMP G,D Equivale al SUB opera D-G, i flag sono tutti coinvolti tranne X
Z=1 se D=G
N=1 se la sottrazione da luogo a numero negativo msb=1
C=1 per gli US indica D<G per gli US indica overflow
V=1 per i SI indica overflow
CMPA G,A Lavora solo su registri di tipo W o L funziona come il CMP.
CMPI im,G Confronta un valore immediato con G: opera G-im funziona come il CMP.
CMPM.B (Ax)+,(Ay)+ Confronta il contenuto di un registro con un altro e incrementa i puntatori di un byte, in questo caso.
La funzione EXT e SWAP
EXT.L D estende il valore del segno da B a W e da W a LW (come in questo caso).
Tale istruzione va a settare a 0 i flag V e C mentre imposta opportunamente i flag N e Z.
SWAP D Lavora su estensioni di tipo W, tale istruzione serve a scambiare la parte
più significativa del registro con quella meno significativa.
Tale istruzione va a settare a 0 i flag V e C mentre imposta opportunamente i flag N e Z.
Il 68000 prevede due tipi di moltiplicazione, una per la numerazione signed (o numerazione in complementi) ed una per la numerazione unsigned (senza segno).
MULU G,D per la numerazione unsigned
MULS G,D per la numerazione signed
Entrambe operano su 16 bit (word) e danno un risultato su 32 bit (longword).
La cosa più importante da capire è come gestire l'overflow, in quanto non esiste alcun flag che ci indica tale avvenimento in seguito ad una moltiplicazione. Allora si ragiona in questo modo, si suppone il registro destinazione D diviso in due parti ciascuna di 16 bit, la parte meno significativa, che si trova a destra, è chiamata P mentre la parte più significativa viene chiamata Q, se la moltiplicazione è piccola il risultato viene memorizzato nella parte P del registro, se la moltiplicazione è grande e il risultato occupa più di 16 bit allora c'è stato overflow e quindi la parte Q non è più = 0.
Per la moltiplicazione tra numeri con segno il discorso cambia, si divide sempre il registro D in due parti uguali, però anche se il risultato può essere contenuto in 16 bit viene esteso su tutto il registro da 32 bit con un'estensione in segno. Se il bit più significativo del risultato è 1 tutta la parte Q, e ciò che rimane della parte P vengono settati a 1, se il bit più significativo del risultato è 0 allora tutta la parte Q, e ciò che rimane della parte P vengono settati a 0.
In caso di overflow la parte Q del registro D non sarà più un'estensione in segno del risultato e quindi non sarà settata a 1 o a 0 quindi il risultato ha sconfinato nella parte Q provocando un overflow.
Segmento di codice per verificare l'overflow per i numeri signed.
ORG $8000
MOL MULS D0,D1
MOVE D1,D2 Copia la parte meno significativa di D1 in D2
EXT D2 Estendi in segno D2
CMP.L D1,D2 Confronta i due registri
BNE OVERFLOW salta se gli operandi non sono uguali
Ci sono due istruzioni di salto per subrutines:
JSR Label Decrementa lo stack di una logword e vi salva all'interno l'indirizzo di memoria dell'istruzione successiva a JSR nel programma chiamante (Salto assoluto).
BSR Label Stesso funzionamento di JSR ma meno usata (Salto relativo).
RTS Ritorna alla locazione di memoria puntata dallo stack, la quale era stata allocata dall'istruzione JSR.
E FRAMEPOINTER
Quando c'è bisogno di saltare ad un sottoprogramma, all'interno del programma chiamante, si incomincia ad allocare lo spazio nello stack per le variabili di output e di input.
Svolto il punto 1 si utilizza il comando JSR e si salta alla subrutines, tale istruzione alloca nello stack una longword che conterrà l'indirizzo dell'istruzione successiva a JSR, quello sarà l'indirizzo del PC necessario per tornare dalla subrutines.
Saltati nella subrutines si esegue subito l'istruzione di LINK che conterrà il framepointer che spiegheremo dopo.
In seguito si incominciano a salvare nello stack, tramite il MOVEM, i vari registri che utilizzeremo nella subrutines.
Prima di chiudere il sottoprogramma bisognerà ripristinare, in ordine inverso dallo stack, tutti i registri e i risultati, creati nella subrutines, anche il framepointer verrà ripristinato tramite l'istruzione UNLK .
Tornati nel programma chiamante si continuerà a ripulire lo stack da ciò che è stato creato dal programma chiamante fino a far tornare lo stack alla locazione di partenza che corrisponde a $9200.
LINK A,#im Tale istruzione incrementa lo stack di una longword e vi salva all'interno il contenuto del registro A che abbiamo scelto, ne registro A vi verrà salvato il valore dello stack pointer in quel momento, a tale punto lo stackpointer assumerà il valore del framepointer il quale resterà salvato nel registro A. Il valore #im serve a creare un ulteriore piazzamento all'interno dello stack.
UNLK A Questa istruzione servirà alla fine della subrutines per ripristinare il valore contenuto all'interno del registro A usato come framepointer.
PEA M Alloca nello stack una longword e inserisci in essa l'indirizzo di memoria M
MOVEM.L D0-D3/A0-A4,-(SP) Tale istruzione, usata nelle subrutines, salva nello stack i registri da D0 a D3 e i registri da A0 a A4 è un'istruzione molto rapida per il salvataggio dei registri.
MOVEM.L (SP)+,D0-D3/A0,A4 Istruzione inversa alla precedente che ripristina il contenuto dei registri alla fine della subrutines.
SIMBOLO |
SIGNIFICATO |
D |
D0-D7: un qualsiasi registro dati |
A |
A0-A7: un qualsiasi registro indirizzi |
R |
Un qualsiasi registro dati o indirizzi |
im |
Operando immediato |
M |
Operando in memoria |
G |
Operando generale: può essere in memoria, immediato o registri |
CCR |
Registro dei flag |
SR |
Registro di stato |
SP |
Stack pointr |
CODICE ASCII 1° |
|||||||
|
codice |
equivalente |
equivalente |
|
codice |
equivalente |
equivalente |
carattere |
ASCII |
esadecimale |
numerico |
carattere |
ASCII |
esadecimale |
numerico |
NUL |
|
|
|
spazio |
|
|
|
SOH |
|
|
|
|
|
|
|
STX |
|
|
|
|
|
|
|
ETX |
|
|
|
|
|
|
|
EOT |
|
|
|
|
|
|
|
ENQ |
|
|
|
|
|
|
|
ACK |
|
|
|
& |
|
|
|
BEL |
|
|
|
|
|
|
|
BS |
|
|
|
|
|
|
|
TAB |
|
|
|
|
|
|
|
LF |
|
4A |
|
|
|
2A |
|
VT |
|
4B |
|
|
|
2B |
|
FF |
|
4C |
|
|
|
2C |
|
CR |
|
4D |
|
|
|
2D |
|
SO |
|
4E |
|
|
|
2E |
|
SI |
|
4F |
|
|
|
2F |
|
DLE |
|
|
|
|
|
|
|
DC1 |
|
|
|
|
|
|
|
DC2 |
|
|
|
|
|
|
|
DC3 |
|
|
|
|
|
|
|
DC4 |
|
|
|
|
|
|
|
NAK |
|
|
|
|
|
|
|
SYN |
|
|
|
|
|
|
|
ETB |
|
|
|
|
|
|
|
CAN |
|
|
|
|
|
|
|
EM |
|
|
|
|
|
|
|
SUB |
|
5A |
|
|
|
3A |
|
ESC |
|
5B |
|
|
|
3B |
|
FS |
|
5C |
|
< |
|
3C |
|
GS |
|
5D |
|
|
|
3D |
|
RS |
|
5E |
|
> |
|
3E |
|
US |
|
5F |
|
|
|
3F |
|
CODICE ASCII 2° |
|||||||
|
codice |
equivalente |
equivalente |
|
codice |
equivalente |
equivalente |
carattere |
ASCII |
esadecimale |
numerico |
carattere |
ASCII |
esadecimale |
numerico |
|
|
|
|
|
|
|
|
A |
|
|
|
a |
|
|
|
B |
|
|
|
b |
|
|
|
C |
|
|
|
c |
|
|
|
D |
|
|
|
d |
|
|
|
E |
|
|
|
e |
|
|
|
F |
|
|
|
f |
|
|
|
G |
|
|
|
g |
|
|
|
H |
|
|
|
h |
|
|
|
I |
|
|
|
i |
|
|
|
J |
|
4A |
|
j |
|
6A |
|
K |
|
4B |
|
k |
|
6B |
|
L |
|
4C |
|
l |
|
6C |
|
M |
|
4D |
|
m |
|
6D |
|
N |
|
4E |
|
n |
|
6E |
|
O |
|
4F |
|
o |
|
6F |
|
P |
|
|
|
p |
|
|
|
Q |
|
|
|
q |
|
|
|
R |
|
|
|
r |
|
|
|
S |
|
|
|
s |
|
|
|
T |
|
|
|
t |
|
|
|
U |
|
|
|
u |
|
|
|
V |
|
|
|
v |
|
|
|
W |
|
|
|
w |
|
|
|
X |
|
|
|
x |
|
|
|
Y |
|
|
|
y |
|
|
|
Z |
|
5A |
|
z |
|
7A |
|
|
|
5B |
|
|
|
7D |
|
|
|
5E |
|
~ |
|
7E |
|
|
|
5F |
|
|
|
7F |
|
ORG e Program Locatio Countr PLC
Il PLC è una variabile interna, di 32 bit, del programma assemblatore. Essa si incrementa di un numero di byte, corrispondente al valore di ogni istruzione in codice macchina (comprendendo anche il valore dei dati). La direttiva ORG serve per inizializzare il PLC (che non ha nulla a che vedere con il PC). Il PC dà l'indirizzo di memoria di ogni istruzione, mentre il PLC alla fine del programma ci dice quanto occupa in memoria l'intero programma. Ritornando all'ORG si trova tipicamente all'inizio di ogni programma oppure inizializza un'area assestante del programma tipo l'area dati.
Direttive DS e DC
Direttiva DS tale direttiva serve per allocare spazio per una variabile o una costante definita da programma.
Es: ALFA DS.B 1 Tale istruzione allocherà lo spazio di un byte (.B 1) ad una precisa locazione di memoria. Il PLC durante l'assemblaggio riserverà lo spazio di un byte, in questo caso, per poi riempirlo, quando sarà fatto da programma, con il dato relativo.
Direttiva DC la direttiva DC serve per dichiarare le costanti singole o anche i vettori di tipo B, W o LW.
Es: BETA DC 1,3,5 In questo caso è stato dichiarato un vettore costante di 3 elementi che, a partire da una data locazione di memoria, ad ogni word inserirà il valore corrispondente fin che non verrà allocato in memoria tutto il vettore.
Le stringhe verranno allocate come costanti di tipo B e racchiuse da apici con un terminatore detto tappo =0.
Es : STR DC.B 'casa',0
Direttiva END
Tale direttiva messa alla fine del programma dichiara la chiusura di quest'ultimo, a tale direttiva andrà associata la label di partenza.
Es: END START
Direttiva EQU
Tale direttiva serve per assegnare un valore ad una label che potrà esse usata in seguito durante il programma, in genere essa è adoperata per assegnare i valori dell'offset dello stack pointer dal frame pointer.
Appunti su: |
|