10/04/19
1
Parte II
AND 104 I, micro-operazionic0t0: MAR PCc0t1: MBR M, PC PC +1c0t2: OPR MBR(OP), I MBR(I)q’7Ic0t3: R 1 Ciclo di fetch(q7+I’)c0t3: F 1c1t0: MAR MBR(AD); / 104 da Hex a Binc1t1: MBR M; c1t2: Ciclo di Indirizzamentoc1t3: F 1, R 0; indirettoq0c2t0: MAR MBR(AD); q0c2t1: MBR M;q0c2t2: AC AC AND MBR;c2t3 : F 0; Ciclo di Execute
10/04/19
2
ADDI 001 ADDRESS
• Esegue la somma tra l'accumulatore AC e •Se I=0: il contenuto della cella di memoria il cui indirizzo è specificato da ADDRESS •Se I=1, il contenuto della cella di memoria il cui indirizzo è contenuto nella cella di memoria specificata dal campo ADDRESS (indirizzamento indiretto)
• Il risultato è salvato in AC e l'eventuale riporto in E•Ciclo di execute:
q1c2t0: MAR MBR(AD); trasferisce la parte indirizzo dell'istruzioneq1c2t1: MBR M; legge l'operandoq1c2t2: E-AC AC + MBR; esegue la somma tra MBR e ACc2t3: F 0; passa alla fase di fetch
LDA (Load in AC)I 010 ADDRESS
•Carica nell'accumulatore AC •Se I=0: il contenuto della cella di memoria il cui indirizzo è specificato da ADDRESS
•Se I=1, il contenuto della cella di memoria il cui indirizzo è contenuto nella cella di memoria specificata dal campo ADDRESS (indirizzamento indiretto)
•Ciclo di execute:q2c2t0: MAR MBR(AD); trasferisce la parte indirizzo dell'istruzione
q2c2t1: MBR M, AC 0; legge l'operando e azzera l'accumulatoreq2c2t2: AC AC + MBR; copia MBR in AC tramite una somma
c2t3: F 0; passa alla fase di fetch
10/04/19
3
Cosa contiene AC a fine esecuzione?ORG 100/ memorizza il programma a partire dalla cella 100
-- la prima istruzione sarà caricata nella cella di memoria con indirizzo 100-- (notazione esadecimale)
LDA A / carica A in AC-- viene caricato in AC il contenuto della cella di memoria etichettata A
ADD 104 I / aggiunge ad AC la cella indirizzata dalla cella 104-- viene sommato ad AC il contenuto della cella di memoria il cui indirizzo è -- contenuto nella cella di memoria 104
HLT / termina l'esecuzione-- termina l'esecuzione del programmaA, DEC 412 / 412 in decimale, notazione modulo e segno-- cella di memoria etichettata con A contenente il numero decimale 412
HEX 101 / notazione esadecimale -- cella di memoria contenente l'indirizzo di memoria dove reperire il dato, da-- notare che la cella di memoria 101 contiene l'istruzione "ADD 104 I" che -- corrisponde al numero binario 1001000100000100=3712410=-28412 compl. 2
END
STA (Store AC)I 011 ADDRESS
•Memorizza il contenuto dell'accumulatore AC nella•Se I=0: cella di memoria il cui indirizzo è specificato daADDRESS •Se I=1, cella di memoria il cui indirizzo è contenuto nella celladi memoria specificata dal campo ADDRESS (indirizzamentoindiretto)
•Ciclo di execute:q3c2t0 : MAR MBR(AD); trasferisce la parte indirizzo dell'istruzioneq3c2t1: MBR AC; trasferisce il dato nel MBRq3c2t2: M MBR; memorizza il datoc3t3: F 0; passa alla fase di fetch
10/04/19
4
DEC (Decrease) v.1
•Vogliamo realizzare l'istruzione che decrementa di 1 ilcontenuto di una cella di memoria denominata IN e salvi il
risultato in una cella di memoria denominata OUT
•Tale istruzione non è presente nel set di istruzioni del PDP8
ORG 100
GO, LDA IN
ADD X / aggiunge X ad AC, cioè lo decrementa di 1
STA OUT / il risultato è salvato in OUT
HLT / termina l'esecuzione
X, DEC -1
IN, HEX A
OUT, DEC 0
END
Linguaggi: macchina e Assembly
Label Istruzione CommentiORG 100
GO, LDA IN /caria INADD X /decrementaSTA OUT /salva in OUTHLT
X, DEC -1IN, HEX AOUT, DEC 0
END
10/04/19
5
L’Assemblatore • In realtà per “parlare” con il PDP8 dovremmo scrivere i programmi in binario.• Su un elaboratore più avanzato, Il linguaggio simbolico Assembly sarà memorizzato in termini di codice ASCII. • Supponendo parole di memoria di 16 bit, possiamo memorizzare 2 caratteri per ogni parola.• es.: GO, LDA IN sarà memorizzata come:
G O 47 4F 0100 0111 0100 1111, 2C 20 0010 1100 0010 0000L D 4C 44 0100 1100 0100 0100
A 41 20 0100 0001 0010 0000I N 49 4E 0100 1001 0100 1110 20 0D 0010 0000 0000 1101
•Un semplice assemblatore lavora in due passi
Codice ASCII
10/04/19
6
L’Assemblatore: passo 1
• Nella prima passata viene generata una tabella che mette in corrispondenza gli indirizzi simbolici definiti dall’utente con i loro equivalenti binari•Viene utilizzato il location counter (LC), una particolare parola di memoria per tener traccia della locazione di memoria assegnata all’istruzione o operando che si sta considerando• Per convenzione LC vale zero inizialmente• Se c’e’ la pseudo istruzione ORG, LC viene modificato• Per ogni riga del programma LC viene incrementato• La vera e propria transcodifica avviene al passo 2
L’Assemblatore: passo 1
10/04/19
7
L’Assemblatore: passo 1 Tabella dei simboli:G O 47 4F 0100 0111 0100 1111, 2C 20 0010 1100 0001 0100(LC) 01 00 0000 0001 0000 0000X , 58 2C 0101 1000 0010 11002o2o 0001 0100 0001 0100(LC) 01 04 0000 0001 0000 0100I N 49 4E 0100 1001 0100 1110
, 2C 0 0010 1100 0001 0100(LC) 01 05 0000 0001 0000 0101O U 4F 55 0100 1111 0101 0101
T, 54 2C 0101 0100 0010 1100(LC) 01 06 0000 0001 0000 0110
Tre locazioni di memoria per ogni etichetta
L’Assemblatore: passo 2
• Le istruzioni vengono tradotte da linguaggio Assembly in linguaggio macchina.
• L’assemblatore utilizza quattro tabelle:• tabella pseudo istruzioni (4 entries: ORG, END, DEC, HEX)• tabella istruzioni MRI (7 entries)• tabella istruzioni non MRI (18 entries)• tabella simboli-indirizzi (ottenuta al passo 1)
• L’assemblatore svolge anche operazioni di controllo della correttezza del codice
• codice operativo inesistente• riferimenti non dichiarati•…
10/04/19
8
passo 2
BUN (Uncoditioned Bound)
I 100 ADDRESS
•Trasferisce il flusso del programma all’indirizzo specificato•Se I=0: dalla cella di memoria il cui indirizzo è specificato daADDRESS
•Se I=1, dalla cella di memoria il cui indirizzo è contenutonella cella di memoria specificata dal campo ADDRESS (indirizzamento indiretto)
•Ciclo di execute:q4c2t0 : PC MBR(AD); trasferisce la parte indirizzo dell'istruzione
q4c2t1 :
q4c2t2 :
c2t3 : F 0; passa alla fase di fetch
10/04/19
9
BSA (Bound Saving Address)I 101 ADDRESS
• Salva il contenuto del PC nella cella di memoria m il cui indirizzo•Se I=0: è specificato da ADDRESS •Se I=1, è contenuto nella cella di memoria specificata dal campo ADDRESS (indirizzamento indiretto)
•Trasferisce il flusso del programma alla cella di memoria m+1•Ciclo di execute:
q5c2t0 : MAR MBR(AD), trasferisce l'indirizzo m in MARMBR(AD) PC, trasferisce PC nella cella di memoria mPC MBR(AD)
q5c2t1 : M MBR; salva MBR nella cella di memoria m
q5c2t2 : PC PC+1; Incrementa PC, ovvero mc2t3 : F 0; passa alla fase di fetch
BSA (Bound Saving Address)
• Il circuito così schematizzato permette la realizzazione delle prime tre operazioni in parallelo• In combinazione con l’istruzione BUN, la BSA può essere utilizzata per la realizzazione di chiamate a sottoprogrammi
10/04/19
10
DEC (Decrease) v.2ORG 100LDA ADDRESS / carica ADDRESS in ACBSA ADDRESS / salva PC e salta in ADDRESS
-- Il contenuto del PC (ovvero l'indirizzo della cella di memoria che contiene l'istruzione HLT) viene salvato in ADDRESS. Contestualmente, il flusso di programma si sposta alla cella di memoria successiva a quella etichettata con ADDRESS
HLTADDRESS, DEC -1-- Inizialmente in ADDRESS è memorizzato il numero -1. Successivamente l'esecuzione dell'istruzione BSA, ADDRESS conterrà l'indirizzo della cella di memoria contenente l'istruzione HLT
ADD INBUN ADDRESS I / salto indiretto
-- INDIRIZZAMENTO INDIRETTO: viene prima eseguito un ciclo di indirizzamento indiretto, dopodichè il flusso del programma si sposta all'indirizzo di memoria contenuto in ADDRESSIN, DEC 10
END
Chiamata alla subroutine in DEC v.2
10/04/19
11
ISZ (Increment and Skip on Zero)I 110 ADDRESS
• Incrementa il contenuto della cella di memoria il cui indirizzo•Se I=0: è specificato da ADDRESS •Se I=1, è contenuto nella cella di memoria specificata dalcampo ADDRESS (indirizzamento indiretto)
• Se il risultato è 0, salta l'istruzione successiva•Ciclo di execute:
q6c2t0 : MAR MBR(AD); trasferisce la parte indirizzo dell'istruzioneq6c2t1: MBR M; legge il contenuto della cella di memoria indirizzataq6c2t2 : MBR MBR+1; incrementa il contenuto di MBRq6c2t3 : M MBR, salva nella cella indirizzata il contenuto di MBR
If (MBR=0) then PC PC+1, incrementa PC se MBR è nulloF 0; passa alla fase di fetch
Come simulare un ciclo DO -WHILEORG 100
START, LDA OUTINCSTA OUTISZ INBUN START
-- l'istruzione BUN viene eseguita soltanto se il valore contenuto nella cella di memoria etichettata X è negativo, altrimenti il flusso del programma si sposta direttamente all'istruzione successiva che termina il programma
HLTIN, DEC -10
OUT, DEC 0END
10/04/19
12
CLA (Clear AC)o 111 1000 0000 0000
•Azzera il contenuto dell'accumulatore AC
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B5: AC 0, azzera AC
F 0; passa alla fase di fetch• B5 denota il primo bit di MBR(5-16) che è pari a 1
CLE (Clear E)o 111 0100 0000 0000
•Azzera il contenuto del registro E
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B6: E 0, azzera E
F 0; passa alla fase di fetch
10/04/19
13
CMA (Complement AC)o 111 0010 0000 0000
•Complementa logicamente il contenutodell'accumulatore AC
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B7: AC AC', complementa logicamente il contenuto di AC
F 0; passa alla fase di fetch
DEC (Decrease) v.3ORG 100CLA / cancella il contenuto di AC
-- Il contenuto di AC viene annullato, cioè AC=0. In tal modo si evitano 'sorpese' dovute a valori precedentemente caricati in AC. Ciò si può verificare, per esempio, se l'istruzione DEC che stiamo definendo viene usata all'interno di un altro programma
CMA / complementa il contenuto di AC-- Il contenuto di AC complementato, ovvero AC=FFFF16=1111111111112=-110 dato che ci si riferisce alla notazione in complemento
ADD INSTA OUT
-- Il risultato stavolta è salvato in una cella di memoria etichettata con OUT anziché lasciato semplicemente in AC
HLTIN, DEC 10OUT, DEC 0
END
10/04/19
14
CME (Complement E)o 111 0001 0000 0000
•Complementa logicamente il contenuto del registro E
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B8: E E', complementa logicamente il contenuto di E
F 0; passa alla fase di fetch
CIR (Circulate Right)o 111 0000 1000 0000
• Ruota verso destra (cioè verso il bit meno significativo) ilcontenuto combinato del registro E e dell'accumulatore AC•Il bit meno significativo diventa passa al registro E
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B9: E-AC bit1-E-(AC \ bit1), ruota verso destra E-AC
F 0; passa alla fase di fetch
10/04/19
15
CIL (Circulate Left)o 111 0000 0100 0000
• Ruota verso sinistra (cioè verso il bit più significativo) ilcontenuto combinato del registro E e dell'accumulatore AC•Il bit più significativo diventa il nuovo contenuto del registro E
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B10: E-AC AC-E, ruota verso sinistra E-AC
F 0; passa alla fase di fetch
MUL2, DIV2ORG 100
LDA INCIL
-- Il contenuto dell'accumulatore (inteso in binario) viene ruotato di un bit verso sinistra. Cio' equivale ad effettuare una moltiplicazione per 2.
-- Se invece dell'istruzione CIL avessimo utilizzato CIR, allora il contenutodell'accumulatore (inteso in binario) verrebbe ruotato di un bit verso destra. Cio' equivale ad effettuare una divisione per 2 (senza considerare l'eventualeresto). Attenzione al contenuto del registro E. Potrebbe essere opportunoeffettuare prima un CLE
STA OUTHLT
IN, HEX 5OUT, DEC 0
END
10/04/19
16
INC (Increase)o 111 0000 0010 0000
• Incrementa il contenuto il contenuto combinato del registro E e dell'accumulatore AC
•Ciclo di execute:q7c2t0 : q7c2t1 :
q7c2t2 :q7I’c2t3 B11: E-AC E-AC+1, incrementa di 1 E-AC
F 0; passa alla fase di fetch
SPA (Skip on Positive AC)o 111 0000 0001 0000
• Salta l'istruzione successiva se il contenutodell'accumulatore AC è positivo
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B12: If (AC>0) then PC PC+1, incrementa PC se AC > 0
F 0; passa alla fase di fetch
10/04/19
17
SNA (Skip on Negative AC)o 111 0000 0001 0000
• Salta l'istruzione successiva se il contenutodell'accumulatore AC è negativo
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B13: If (AC
10/04/19
18
SZE (Skip on Zero E)
o 111 0000 0001 0000
• Salta l'istruzione successiva se il contenuto del registro E è 0
•Ciclo di execute:q7c2t0 :
q7c2t1 :
q7c2t2 :
q7I’c2t3 B15: If (E=0) then PC PC+1, incrementa PC se E = 0
F 0; passa alla fase di fetch
HLT (Halt)o 111 0000 0000 0001
•Arresta il sistema ponendo a o il flag di sistema
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7I’c2t3 B16: S 0; arresta il sistema
F 0; passa alla fase di fetch
10/04/19
19
INP (Input di un carattere)
1 111 1000 0000 0000
•Carica in AC un carattere dal buffer di tastiera
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7Ic2t3 B5: AC ASCII(keyboard), mette in AC il codice ASCII del
carattere digitato da tastiera:F 0; passa alla fase di fetch
OUT (Output di un carattere)
1 111 0100 0000 0000
•Visualizza sul terminale predefinito il contenuto di AC interpretato come codice ASCII
•Ciclo di execute:q7c2t0 : q7c2t1 :q7c2t2 :q7Ic2t3 B6: Terminal AC, visualizza su Terminal il carattere
rappresentato in ASCII in AC F 0; passa alla fase di fetch
10/04/19
20
SKI Salta l'istruzione successiva se il flag di ingresso è positivo
SKOSalta l'istruzione successiva se il flag di uscita è positivo
IONAbilita Interrupt
IOFDisabilita Interrupt
I/O-I
1 111 0010 0000 0000
1 111 0001 0000 0000
1 111 0000 1000 0000
1 111 0000 0100 0000
ISA del PDP 8 Memory Reference Instructions
Simbolo Ind. D/I OPR Descrizione
AND 0/1 000 And logico tra AC e cella indirizzata
ADD 0/1 001 Somma tra AC e cella indirizzata
LDA 0/1 010 Carica in AC il contenuto della cella indirizzata
STA 0/1 011 Salva nella cella indirizzata il contenuto di AC
BUN 0/1 100 Salto incondizionato alla cella indirizzata
BSA 0/1 101 Salvataggio del PC nella cella indirizzata e salto alla cella successiva a quella indirizzata
ISZ 0/1 110 Incremento di 1 del contenuto della cella indirizzata e se 0, allora salta l’istruzione successiva
10/04/19
21
ISA del PDP 8 Register Reference Instructions
Simbolo Codice Descrizione
CLA 0111 1000 0000 0000 Azzera il contenuto di AC
CLE 0111 0100 0000 0000 Azzera il contenuto del registro E
CMA 0111 0010 0000 0000 Complementa logicamente il contenuto di AC
CME 0111 0001 0000 0000 Complementa logicamente il contenuto di E
CIR 0111 0000 1000 0000 Sposta verso derso i bit in E-AC
CIL 0111 0000 0100 0000 Sposta verso sinistra i bit in E-AC
INC 0111 0000 0010 0000 Incrementa di 1 il contenuto di AC
SPA 0111 0000 0001 0000 Salta l’istruzione successiva se AC>0
SNA 0111 0000 0000 1000 Salta l’istruzione successiva se AC