cerca
Dispense Tetty - Integrazione MIXAL
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Dispense Tetty - Integrazione MIXAL

Torna alla pagina di Programmazione degli Elaboratori


:: Integrazione: Istruzioni e direttive MIXAL ::

Indice

1 Elementi di base

1.1 Com'è composta la macchina MIX
1.2 Com'è composta un'istruzione

2 Istruzioni e direttive MIXAL


1. Elementi di base

Il MIXAL è l'assembler della macchina immaginaria MIX, inventata da Donald E. Knuth.

Nella macchina MIX il byte è composto da 6 bit, ovvero 64 valori possibili per byte.

Una parola di memoria è definita come un insieme di 5 byte più un bit di segno. E' possibile individuare sottoparole scrivendo una specifica di campo della forma (L:R), dove L è l'indice del primo byte ed R dell'ultimo (estremi inclusi). Ad esempio: (0:0) individua il solo segno; (3:5) individua gli ultimi tre byte. La specifica di campo è rappresentata internamente come risultato dell'operazione "8L + R". Ad esempio: (3:4) = 3*8 + 4 = 28 (che è sempre delle dimensioni di un byte).

La macchina MIX dispone di nove registri:

  • rA, registro A. Contiene una parola, generalmente l'operando di un'operazione aritmetica o di scrittura della memoria;
  • rX, registro X. Contiene una parola ed è generalmente usato come estensione a destra di rA;
  • rJ, registro di salto. Contiene due byte (il segno è sempre positivo) che rappresentano l'indirizzo della cella a cui il programma deve saltare;
  • rIn (dove n = 1, 2, ... , 6), sei registri indice. Contengono due byte più segno, usati per mantenere degli indici per il calcolo degli indirizzi effettivi delle celle di memoria.

Vi sono inoltre:

  • l' indicatore di overflow OV, che indica il superamento della capacità di un registro. Può avere valore "on" o "off";
  • l' indicatore di confronto CM, che può valere > (o G), = (o E) e < (o L);
  • ventuno dispositivi di input / output denotati con le sigle u0, u1, ..., u20, grazie ai quali la macchina MIX comunica con l'esterno. Per convenzione il dispositivo u19 è la console del calcolatore.

La macchina MIX ha infine 4000 celle di memoria, ognuna delle quali ha le dimensioni di una parola ed è caratterizzata da un indirizzo.

1.2 Com'è composta un'istruzione

Le istruzioni della macchina MIX sono parole così strutturate:

0 1 2 3 4 5
+ / - INDIRIZZO INDICE MOD COD.OP.

dove:

  • INDIRIZZO dà appunto l'indirizzo della parola;
  • INDICE è il modificatore dell'indirizzo. Se vale 0 non modifica nulla, mentre se è un numero compreso tra 1 e 6 indica uno dei sei registri indice, il cui contenuto andrà sommato a INDIRIZZO;
  • MOD. è il modificatore dell'operatore, di solito una specifica di campo (L:R). Quando è omesso, generalmente significa che l'istruzione associata si applica alla parola intera;
  • COD.OP. è il codice operativo che identifica l'istruzione vera e propria da eseguire. Ha come sintassi generale: MNEMONICO INDIRIZZO,INDICE(MOD) , dove MNEMONICO è il nome dell'istruzione.

Alcune notazioni:

  • con M s'intende l'indirizzo di memoria ottenuto sommando a INDIRIZZO il contenuto del registro indice specificato da INDICE. Essendo 4000 le celle di memoria della macchina MIX, potrà avere un valore compreso tra 0 e 3999;
  • con V ci si riferisce al valore della sottoparola indicata da MOD. nella cella di memoria di indirizzo M;
  • per riferirsi al valore contenuto in un registro o in una parola di memoria di cui si conosce solo l'indirizzo, si mette il suo nome tra parentesi quadre. Ad esempio il valore contenuto nel registro rA si richiama con [rA], mentre ad esempio [1234] indica il valore contenuto alla cella di memoria con indirizzo 1234;
  • con X ← Y si intende che X (un registro, una parola di memoria, ecc.) assumerà il valore di Y (un registro, una parola di memoria, ecc.) come effetto dell'esecuzione dell'istruzione.

Torna su

2. Istruzioni e direttive MIXAL

Abbiamo già detto che il MIXAL è l'assembler della macchina MIX, il cui compito è quello di assemblare il suo codice in una sequenza di istruzioni direttamente eseguibili dalla macchina.

Un programma MIXAL può contenere istruzioni o direttive. Le istruzioni sono quelle componenti del programma che vengono tradotte in istruzioni macchina, mentre le direttive sono quelle parti del codice che, pur non essendo direttamente tradotte in istruzioni, influenzano il modo in cui l'assemblatore effettua il suo compito. Sia le istruzioni che le direttive hanno il seguente formato:

Etichetta MNEMONICO Operando Commento

dove:

  • l'etichetta è un simbolo alfanumerico che identifica la locazione corrente e che può essere utilizzato per riferirsi ad essa;
  • lo MNEMONICO è il nome dell'istruzione. Di seguito verrà chiamato “operatore”;
  • i commenti al codice, automaticamente ignorati dall'assemblatore, necessari come documentazione interna. Si scrivono a destra dell'operatore e dell'eventuale operando, oppure cominciando una linea di programma con un asterisco.

Torna su

2.1 Direttive Mixal

Le direttive MIXAL sono le seguenti:

ORIG xxxx
specifica che l'assemblatore dovrà cominciare a inserire le istruzioni macchina in memoria a partire dalla cella di indirizzo xxxx. Ad esempio ORIG 1000 fissa l'indirizzo di partenza del caricamento del programma nella cella 1000;

EQU
definisce un simbolo e gli assegna un valore numerico. Ad esempio: GIORNO EQU 23 significa che GIORNO varrà 23 nell'assemblatore;

ALF abcde
mette il codice dei cinque caratteri “abcde” nella locazione corrente di memoria. Ad esempio: ALF GATTO;

END locazione
segnala la fine delle righe del programma. “locazione” è l'indirizzo da cui dovrebbe iniziare l'esecuzione una volta caricato il codice in memoria. Esempio: END INIZIO.

Torna su

2.2 Operatori di caricamento

Gli operatori di caricamento sono i seguenti:

LDA
"load A". Rimpiazza il contenuto di rA (o parte di rA) con [M], ovvero V. Riempie i campi di rA a partire da destra;

LDX
"load X". Si comporta come sopra, ma carica in rX;

LDi (LD1, LD2, LD3, LD4, LD5, LD6)
si comporta come sopra, ma carica in rIi. Dal momento che rI ha due byte e non cinque, si assume che i byte 1, 2 e 3 siano a zero;

LDAN - LDXN - LDiN
si comportano come sopra, ma invertendo il segno.

Torna su

2.3 Operatori di storing

Gli operatori di storing sono i seguenti:

STA
"store A". Rimpiazza [M] con il contenuto di rA (o parte di rA). I campi di rA che vengono usati sono presi a partire da destra, quindi se ad esempio stabilissi che MOD. = (2:3) , il campo 2 della cella M conterrà il campo 4 di rA, ed il campo 3 di M conterrà il campo di 5 di rA;

STX
“store X”. Si comporta come sopra, ma per rX;

STi (ST1, ST2, ST3, ST4, ST5, ST6)
si comporta come sopra, ma per rIi. Dal momento che rI ha due byte e non cinque, si assume che i byte 1, 2 e 3 siano a zero;

STJ
salva il contenuto del registro di salto nei primi due bytes di V, quelli riservati all'indirizzo. Ha quindi (0:2) come campo di specifica di default;

STZ
azzera la cella M nei campi specificati.

Torna su

2.4 Operatori aritmetici

Gli operatori aritmetici hanno MOD. (0:5) di default, e sono:

ADD
aggiunge V al contenuto del registro rA. Utilizzando le specifiche di campo è possibile individuare un particolare byte di V da aggiungere ad rA. Se il valore ottenuto è troppo grande per rA, si accenderà la spia dell'overflow. Alcuni esempi: ADD 2000, ADD 1500(4:4), ADD 3000(1:1);

SUB
sottrae V al contenuto del registro rA, o meglio, aggiunge “-V” ad rA;

MUL
moltiplica V al contenuto del registro rA e scrive il risultato su rA ed rX (modificando di conseguenza il segno di entrambi i registri);

DIV
divide il valore di rA con V e scrive il quoziente in rA ed il resto in rX. Se il divisore V è uguale a 0 o se il quoziente non ci sta in 5 byte, rA ed rX vengono riempiti con valori spazzatura e si accende la spia di overflow.

Torna su

2.5 Operatori di trasferimento di indirizzo

Gli operatori di trasferimento di indirizzo trattano M come numero con segno, e sono:

ENTA
carica la quantità M in rA. Se M è uguale a 0 ne carica solo il segno;

ENTX - ENTi
si comportano come sopra ma rispettivamente con rX ed rIi;

ENNA - ENNX - ENNi
si comportano come sopra ma caricando il segno opposto;

INCA
aggiunge M ad rA. Ad esempio: INCA 0,1 significa che viene sommato al registro rA il valore M (che ha in questo caso INDIRIZZO 0 e INDICE 1);

INCX
aggiunge M ad rX;

INCi
aggiunge M ad rIi. Se il risultato di “M+rIi” non è rappresentabile in due bytes, non verrà definito;

DECA - DECX - DECi
sottraggono M rispettivamente ad rA, rX ed rIi.

Torna su

2.6 Operatori di comparazione

Gli operatori di comparazione confrontano il contenuto di un registro con il contenuto di una cella. Il risultato viene riportato nell'identificatore di confronto.
Gli operatori di comparazione sono:

CMPA
confronta il campo specificato di rA con lo stesso campo di [M]. Se il segno non è specificato nel MOD., entrambi i valori sono presi come positivi;

CMPX
si comporta come sopra ma con rX;

CMPi
si comporta come sopra ma con rIi. Dal momento che rI ha due byte e non cinque, si assume che i byte 1, 2 e 3 siano a zero.

Torna su

2.7 Operatori di salto

Ogni volta che si salta, l'istruzione successiva a quella del salto viene salvata in rJ. Ma se i salti sono più di uno occorre salvare rJ da qualche parte in memoria.
Gli operatori di salto sono i seguenti:

JMP
salto incondizionato all'istruzione M;

JSJ
salto incondizionato all'istruzione M, ma senza modificare rJ;

JOV - JNOV
rispettivamente, saltano ad M se c'è stato o se non c'è stato un overflow;

JL - JE - JG - JGE - JNE - JLE
rispettivamente, saltano ad M se l'identificatore di confronto indica: L (minore), E (uguale), G (maggiore), “maggiore o uguale”, “diversi”, “minore o uguale”. Da notare che tali istruzioni non modificano lo stato dell'identificatore;

JAN - JAZ - JAP - JANN - JANZ - JANP
rispettivamente, saltano ad rA se l'operatore è: “negativo”, “zero”, “positivo”, “non negativo”, “non zero”, “non positivo”;

JXN - JXZ - JXP - JXNN - JXNZ - JXNP
si comportano come sopra, ma saltando ad rX;

JiN - JiZ - JiP - JiNN - JiNZ - JiNP
si comportano come sopra, ma saltando ad rIi.

Torna su

2.8 Operatori di shift

Negli shift M indica il numero di byte da shiftare. Il segno non viene mai toccato.
Gli operatori di shift sono:

SLA
shifta rA a sinistra di M bytes;

SRA
shifta rA a destra di M bytes;

SLAX - SRAX
trattano rA ed rX come se fossero un unico registro, con rX a destra di rA. SLAX shifta a sinistra di M bytes, mentre SRAX a destra;

SLL - SRC
trattano rA ed rX come se fossero un unico registro, ma unito circolarmente (ciò che esce da un lato rientra dall'altro). SLL shifta a sinistra, SRC a destra.

Torna su

2.9 Operatori vari

MOVE
il campo MOD. indica quante parole si vogliono spostare a partire dalla locazione M fino alla locazione specificata dal contenuto di rI1.
Se ad esempio ho il registro rI1 = 800 ed ho l'istruzione “MOVE 1000,3” , il contenuto della cella 1000 viene spostato alla cella 800, quello della cella 1001 nella 801 e quello della cella 1002 in 802, per un totale di 3 parole spostate;

NOP
“no operation”, ovvero nessuna operazione;

HLT
“halt”, ferma la macchina.

Torna su

2.10 Operatori di input / output

Generalmente un'istruzione di input / output coinvolge una parola alla volta. La macchina MIX ha però 20 unità I/O, e ognuna di esse ha uno specifico numero di parole che può spostare in un'unica operazione (block size). Ad esempio il block size dell'unità 19, corrispondente al terminale, vale 14.
Gli operatori di input / output sono i seguenti:

IN
riceve dati dall'unità input specificata dal MOD., e sposta un certo numero di celle (che dipende dal block size) in locazioni consecutive a partire dalla cella di memoria con indirizzo M;

OUT
il contrario di prima, restituisce un output sull'unità specificata dal MOD.;

IOL
attende che l'unità indicata dal MOD. sia libera, quindi esegue un controllo;

JRED
effettua un salto se l'unità indicata dal MOD. è ready;

JBUS
effettua un salto se l'unità indicata dal MOD. è busy.

Torna su

2.11 Operatori di conversione

Gli operatori di conversione sono:

NUM
converte da carattere a numero. Prende i 10 bytes concatenati di rA e rX considerando ognuno come se fosse un numero e li codifica secondo la tabella dei caratteri. Quindi, senza toccare i segni, rimette i singoli numeri in rA ed rX;

CHAR
converte il valore di rA in codici carattere e li rimette in rA ed rX.

Sia NUM che CHAR ignorano l'eventuale operando M.

Torna su


Torna alla pagina di Programmazione degli Elaboratori