Funzionamento della memoria
• Porta di 32 bit indirizzabile a parola (coppia di registri MAR/MDR
• Porta di 8 bit indirizzabile a byte (coppia di registri PC/MBR)
• MAR contiene indirizzi di parole quindi:
– Se MAR contiene 0 verranno letti i byte da 0 a 3 in MDR
– Se MAR contiene 4 verranno letti i byte da 16 a 19 in MDR
• Nella realtà la memoria centrale è unica ed organizzata a byte
Stratagemma
Discarded 32-Bit MAR (counts in words)
32-Bit address bus (counts in bytes)
Disponibilità dei dati
• Operazione di lettura avviata al termine del
ciclo del data-path
• Dati disponibili al termine del ciclo
seguente
Segnali per controllare il data-path
• 9 per la scrittura dei dati dal bus C ai registri
• 4 per selezionare il registro il cui contenuto
deve essere messo sul bus B
• 8 per controllare ALU e SHIFTER
• 2 segnali per indicare la lettura o scrittura di
parole in memoria (tramite MAR/MDR)
• 1 segnale per indicare il fetch dalla memoria
della prossima istruzione (tramite PC/MBR)
Segnali per determinare la prossima
microistruzione
• 9 per il campo NEXT_ADDRESS
• 3 per il campo JAM
Bits 9 3 8 9 3 4
NEXT_ADDRESS
Addr JAM ALU C Mem B
R E A D F E T C H J A M N J M P C J A M Z S L L 8 S R A 1 F 0 F1 E N A E N B I N V A I N C O P C T O S C P P L V S P P C M D R M A R W R I T E B bus B bus registers 0 = MDR 1 = PC 2 = MBR 3 = MBRU 4 = SP 5 = LV 6 = CPP 7 = TO S 8 = OPC 9 -15 none H
Calcolo della prossimo valore per
MPC
• Dopo il primo sottointervallo
∆w (durante il
quale il contenuto del registro MIR si
stabilizza) il campo NEXT_ADDRESS
viene copiato in MPC
• Si ispeziona il campo JAM
– Se JAM vale 000 allora non si deve più far nulla e MPC=NEXT_ADDRESS
Calcolo della prossimo valore per
MPC – bit JAMN e JAMZ
• Se il bit JAMN vale 1 allora si effettua l’OR del contenuto del flip-flop N con il bit più significativo di MPC (NEXT_ADDRESS[8])
• Se il bit JAMZ vale 1 allora si effettua l’OR del contenuto del flip-flop Z con il bit più significativo di MPC (NEXT_ADDRESS[8])
• Se valgono entrambi 1 allora si effettua l’OR di entrambi con il bit più significativo di MPC (NEXT_ADDRESS[8])
Calcolo della prossimo valore per
MPC – bit JAMN e JAMZ
• La “scatoletta” High Bit calcola la funzione booleana
(JAMZ AND Z) OR (JAMN AND N) OR NEXT_ADDRESS[8]
• In ogni caso MPC può assumere solo i valori NEXT_ADDRESS o NEXT_ADDRESS con il bit più significativo a 1
• Se il bit più significativo di NEXT_ADDRESS era già pari a 1 non ha senso usare JAMN e/o JAMZ
Calcolo della prossimo valore per
MPC - esempio
depending
....
..
Address Addr Data path control bits
One of these will follow 0x44 on N JA M
J AMN bit set
0x44 0x56
0x56
0x156
Calcolo della prossimo valore per
MPC – bit JMPC
• Se il bit JMPC vale 1 allora viene fatto l’OR bit a bit degli 8 bit meno significativi del capo NEXT_ADDRESS con gli 8 bit meno significativi di MBR
• La “scatoletta” etichettata con “0” calcola l’OR
• Normalmente, se JMPC vale 1 allora i bit meno significativi di NEXT_ADDRESS sono a 0 (quello più significativo può valere 1 o 0)
• NEXT_ADDRESS=0x000 o 0x100 se JMPC=1
• Poter fare l’OR con MBR serve per implementare un Multi-way jump (lo vedremo nel micro-interprete)
H SHIFTER ALU 2 N B BUS 6 ALU CONTROL CONTROL SIGNALS MEMORY CONTROL SIGNALS (RD, WR,FETCH)
ENABLE ONTO B BUS WRITE C BUS TO REGISTER Z C BUS SP LV CPP TOS OPC PC MDR MAR MBR 9 O 3 8 4-TO-16 DECODER 2 8 4 MPC MIR ADDR J ALU C M B HIGH BIT JMPC J AMN/JAMZ 1-BIT FLIP-FLOP -512 x 36-BIT CONTROL STORE FOR HOLDING THE MICROPROGRAM
Lo stack
• Molti linguaggi di programmazione usano il concetto di procedura
• Le procedure possono avere variabili locali
• Una parte della memoria centrale (detta stack) viene usata per memorizzare le variabili locali delle procedure
• Si usa un registro (LV) che punta alla base delle variabili locali relative alla procedura in esecuzione
• Un registro (SP) punta all’ultima variabile locale
• Ci si riferisce ad una variabile tramite il suo offset da LV
• La struttura dati tra LV e SP viene detta frame delle variabili locali della procedura
Stack per gestione procedure
SP LV a3 a1 (a) 108 100 a2 104(a) Procedura A con variabili locali a1,a2,a3
SP LV a3 a1 (b) a2 b3 b4 b1 b2
(b) La procedura A chiama la procedura B con variabili locali b1,b2,b3,b4
F R A M E LV a3 a1 (d) a2 d3 d4 SP d5 d1 d2
(d) La procedura C restituisce il controllo a B che lo restituisce ad A che chiama D con variabili locali d1,d2,d3,d4,d5
F R A M E a3 a1 (c) a2 b3 b4 LV c1 SP c2 b1 b2
(c) La procedura B chiama la procedura C con variabili locali c1,c2
F R A M E
Stack per calcoli aritmetici
Supponiamo di voler calcolare a1=a2+a3 prima di chiamare B
LV a3 SP a2 a1 (a) a2
(a) Si esegue una push di a2 sullo stack
LV a3 a2 SP a3 a1 (b) a2
(b) Si esegue una push di a3 sullo stack
LV
SP a3
a2 + a3 (d)
a2
(d) Si esegue la pop dello stack memorizzando la parola in cima (top of stack) nella variabile a1
LV a3 SP a2 + a3 a1 (c) a2
Modello della memoria in IJVM
• Array di 4294967296 byte (4GB) o
1073741824 parole di 4 byte
• Le istruzioni IJVM hanno accesso alla
memoria con indirizzi espressi come offset
relativi a puntatori a speciali aree di memoria
Modello della memoria in IJVM
Constant pool
• Area delle costanti (constant pool):
si compone di costanti, stringhe e puntatori ad
altre aree di memoria. Non è scrivibile da un
programma IJVM e viene definita al momento
del caricamento del programma in memoria.
Di seguito non viene cambiata.
• Il registro implicito CPP contiene l’indirizzo
della prima parola nella constant pool
Modello della memoria in IJVM
Frame delle variabili locali
• Frame delle variabili locali: ad ogni invocazione di un metodo si abbina l’allocazione di un’area di memoria centrale per la memorizzazione dele variabili locali e dei parametri con cui viene invocato un metodo
• Il registro implicito LV contiene l’indirizzo della prima parola nel frame delle variabili locali
Modello della memoria in IJVM
Operand stack
• La dimensione del frame delle variabili locali di un metodo è nota staticamente. L’area per lo stack degli operandi (dove, ad esempio, realizzare la valutazione di espressioni aritmetiche) si trova al di sopra del frame delle variabili locali.
• Il registro implicito SP contiene l’indirizzo della parola in cima allo stack (top of stack)
• SP, a differenza di CPP e LV, può cambiare durante l’esecuzione di un metodo (ad esempio, dopo operazioni di push e pop)
Modello della memoria in IJVM
Area dei metodi
• Il codice da eseguire viene memorizzato in un’area della memoria centrale detta area dei metodi.
• Il registro implicito PC (Program Counter) contiene l’indirizzo del prossimo byte da leggere
• Quest’area della memoria centrale viene indirizzata a byte e non a parole come le precedenti
• Questa area è di sola lettura
• Può PC cambiare valore durante l`esecuzione di un metodo?
Modello della memoria in IJVM
SP LV PC CPP Constant P ool Current Operand Stack 3 Current Local Va riable Frame 3 Local Va riable Frame 2 Local Va riable Frame 1 Method AreaSet di Istruzioni IJVM
• Le istruzioni si compongono di un opcode e,
talvolta, di un operando che può essere un offset o una costante
• Ci sono istruzioni per memorizzare una parola, di varia provenienza, sullo stack o per rimuovere una parola dallo stack e/o memorizzarla in una
variabile locale
• Istruzioni logico-artimetiche • Istruzioni di salto
Set di Istruzioni IJVM
Hex Mnemonic Meaning
0x10 BIPUSH byte Push byte onto stack
0x59 DUP Copy top word on stack a n d push onto stack 0xA7 GOTO offset Unconditional branch
0x60 IADD Pop two words from stack; push their sum 0x7E IAND Pop two words from stack; push Boolean AND 0x99 IFEQ offset Pop word from stack a n d branch if it is zero
0x9B IFLT offset Pop word from stack and branch if it is less than zero 0x9F IF ICMPEQ offset Pop two words from stack; branch if equal
0x84 IINC varnum const Add a constant to a local variable 0x15 ILOAD varnum Push local variable onto stack 0xB6 INVOKEVIRTUAL disp Invoke a method
0x80 IOR Pop two words from stack; push Boolean OR 0xAC IRETURN Return from method with integer value
0x36 ISTORE varnum Pop word from stack a n d store in local variable 0x64 ISUB Pop two words from stack; push their difference 0x13 LDC W index Push constant from constant pool onto stack
0x00 NOP Do nothing
0x57 POP Delete word on top of stack
0x5F SWAP Swap the two top words on the stack