![Page 1: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/1.jpg)
H = LVMAR = MBRU + H; rdMAR = SP = SP + 1PC = PC + 1; fetch; wrTOS = MDR; goto Main1
0x15
Control store
23212320
0x15 0x02 0x15 ILOAD varnum ILOAD
Area dei metodi
Stack
1000
1005 37 / /25 / /
Esempio
![Page 2: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/2.jpg)
MAR
MDR
PC
MBR
CPP
LV
SP
H
OPC
TOS
/ /2321 1510051000 /
37 / /
/ /2321 0210051000 /
37 /1000
1002 /2321 0210051000 /
37 /1000
1006 252321 0210061000 /
37 /1000
1006 252322 0210061000 /
37 /1000
1006 252322 1510061000 /
25 /1000
1 2 3 4 5
![Page 3: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/3.jpg)
Programma Java: … …
A = B + C …
...
Compilatore
Programma IJVM: ……ILOAD2ILOAD5IADDISTORE4...
![Page 4: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/4.jpg)
23212320 0x15 0x02 0x15 0x05 0x60 0x36 0x04 ILOAD varnum ILOAD varnum IADD ISTORE varnum
Area dei metodi
Stack
1000
1005 37 / /25 / /
2326
![Page 5: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/5.jpg)
H = LVMAR = MBRU + H; rdMAR = SP = SP + 1PC = PC + 1; fetch; wrTOS = MDR; goto Main1
MAR = SP = SP - 1; rdH = TOSMDR = TOS = MDR - H; wr; goto Main1
H = LVMAR = MBRU + HMDR = TOS; wrSP = MAR = SP -1; rdPC = PC + 1; fetchTOS = MDR; goto Main1
ILOAD
ISTORE
IADD
![Page 6: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/6.jpg)
MAR
MDR
PC
MBR
CPP
LV
SP
H
OPC
TOS
/ /23210x1510051000 /
37 / /
1006 2523230x1510061000 /
25 /1000
1007 3723240x6010071000 /
37 /1000
1007 3723250x6010071000 /
37 /1000
1006 2523220x1510061000 /
25 /1000
5cicli 1ciclo 5cicli 1ciclo 3cicli 1ciclo 6cicli
1006 6223250x3610061000 /
62 / 37
1006 6223260x3610061000 /
62 / 37
1005 3723270x0410051000 /
37 /1000
1cicloMain1
![Page 7: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/7.jpg)
BIPUSH byteDUPIADDIANDIINC varnum constILOAD varnumIORISTORE varnumISUBNOPPOPSWAPLDCW index
GOTO offsetIFEQ offsetIFTL offsetIF_ICMPEQ offsetWIDE
INVOKEVIRTUAL dispIRETURN
![Page 8: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/8.jpg)
0xA7 GOTO offset
PCA7xxyy offset
Area dei metodi
opcode
opcode
Main1 PC = PC + 1; fetch; goto 0xA7
PCA7xxyy
opcode
opcode
![Page 9: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/9.jpg)
goto1 OPC = PC - 1goto2 PC = PC + 1; fetchgoto3 H = MBRU << 8goto4 H = MBRU OR H
PC
A7xxyy
opcode
opcode
0xA7
PCA7xxyy
opcode
opcode
OPC
H = xxyy
![Page 10: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/10.jpg)
goto5 PC = OPC + H; fetchgoto6 goto Main1
PC
A7xxyy
opcode
opcode
OPC
PC
A7xxyy
opcode
opcode
OPC
opcode
opcode
![Page 11: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/11.jpg)
0x9F IF_ICMPEQ offset
PC9Fxxyy offset
Area dei metodi
opcode
opcode
PC = PC + 1; fetch; goto (MBR)
PC9Fxxyy
opcode
opcode
![Page 12: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/12.jpg)
ificmpeq1 MAR = SP = SP - 1; rdificmpeq2 MAR = SP = SP - 1 ificmpeq3 H = MDR; rd
(MBR)
PC9Fxxyy
opcode
opcode
stack
LV
SP
operando1
operando2
TOS contiene operando1, H contiene operando2,i due operandi sono stati eliminati dallo stack ed è iniziata lalettura dell’elemento che affiora sullo stack
![Page 13: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/13.jpg)
ificmpeq4 OPC = TOSificmpeq5 TOS = MDRificmpeq6 Z = OPC - H; if Z goto T else goto F
Viene aggiornato TOS, in Z si ha zero se operando1 (ora in OPC)è uguale a operando2.
F PC = PC + 1F2 PC = PC + 1; fetchF3 goto Main1
Se i due operandi sono diversi:
PC
9Fxxyy
opcode
opcode
![Page 14: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/14.jpg)
T OPC = PC - 1; fetch; goto goto2
Se i due operandi sono uguali:
goto2 PC = PC + 1; fetchgoto3 H = MBRU << 8goto4 H = MBRU OR Hgoto5 PC = OPC + H; fetchgoto6 goto Main1
Si calcola il valore del nuovo PC sommando l’offset all’indirizzo in cui si trova il codice dell’istruzione
![Page 15: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/15.jpg)
Ci deve essere una relazione tra gli indirizzi di T e di F nel “control store”?Ricordiamo che il salto è controllato dalla linea di controllo Z: se JAMZ and Z è 1, il micro program counterMPC avrà il bit 8 a 1.
La microistruzione “ificmpeq6” avra’ JAMZ abilitato per poter utilizzare nel calcolo dell’indirizzo della microistruzione seguente il valore di Z.
![Page 16: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/16.jpg)
Ificmpeq6 Z = OPC - H; if Z goto T else goto F
addr jam
alu C mem B0 0 1 0 1 1 0 1 0 0 0 1
0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
high bit: (JAMZ AND Z) OR (JAMN AND N) OR (NEXTADDRESS[8])
Se Z = 1 MPC contiene 101011010 0x15A (346 in base 10)Se Z = 0 MPC contiene 001011010 0x5A (90 in base 10)
Nel “control store” la prima microistruzione da eseguire nel caso Z = 1 (T) dovrà trovarsi in un indirizzo che inizia con 1, e la prima microistruzione da eseguire nel caso Z = 0 (F) nell’indirizzo inferiore al precedente di 256.
![Page 17: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/17.jpg)
WIDE : l’istruzione seguente ha un indice di 16 bit
0xC4 PC = PC + 1; fetch; goto (MBR OR 0x100)
addr jam
alu C mem B1 0 0 0 0 0 0 0 0 1 0 0
0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1
Supponiamo che l’istruzione seguente WIDE sia ILOAD (0x15).0x15 sarà allora il contenuto di MBR nel momento in cui il circuito O esegue l’OR bit a bit tra MBR e NEXTADDRESS, in quanto JMPC = 1.
L’ indirizzo della prossima microistruzione è il risultato dell’OR:000010101 OR 100000000 = 100010101 0x15 OR 0x100 = 0x115
![Page 18: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/18.jpg)
WIDE ILOAD varnum
0x115 PC = PC + 1;fetchH = MBRU << 8H = MBRU OR HMAR = LV + H; rd; goto iload3
iload3 MAR = SP = SP + 1(0x17?) PC = PC + 1; fetch; wr
TOS = MDR; goto Main1
0xC4 0x15 0x01 0x03
I microprogrammi per eseguire una ILOAD o una WIDE ILOADsi trovano nel “control store” ad indirizzi distanti 256
![Page 19: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/19.jpg)
23212320 0x15 0x02 0x15 0x05 0x60 0x36 0x04 ILOAD varnum ILOAD varnum IADD ISTORE varnum
Area dei metodi
2326
0xB6 0x00 0x1E INVOKEVIRTUAL disp
. . .
45774576. . .0x00 0x02 0x00 0x04 0x84
1^istruzioneNum. parametri Spazio var. loc.
2331 2332 2334
56215620. . .0xAC. . .
4580
Esempio
![Page 20: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/20.jpg)
Stack
1000
1005 3762 /25 / /
OBJREF621007
(CPP) = 500
Constant pool
530 4576
(LV) = 1000 (SP) = 1007
500
situazione all’atto della chiamata
![Page 21: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/21.jpg)
Stack
1000
1005 3762 /25 / /
1012621007
MAR
MDR
PC
MBR
CPP
LV
SP
H
OPC
TOS
10131006 5001000
10002334
10131012
4580
dopo la INVOKEVIRTUAL
![Page 22: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/22.jpg)
Stack
1000
1005 3762 /25 / /
38441006
MAR
MDR
PC
MBR
CPP
LV
SP
H
OPC
TOS
10061000 5003844
2334
situazione dopo IRETURN, supponendo che il metodo chiamato restituisca al chiamante il quadrato del valore del parametro alla chiamata
![Page 23: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/23.jpg)
0xB6 INVOKEVIRTUAL displacement
PCB6xxyy
Indirizzo di ritorno
Disp. Da CPP
Area dei metodi
Constant pool
CPP
CPP + xxyyzzttuuvv
opcodeopcode
zztt: numero dei parametri
uuvv: spazio per le variabili locali
![Page 24: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/24.jpg)
Invokevirtual1 PC = PC + 1; fetchInvokevirtual2 H = MBRU <<8Invokevirtual3 H = MBRU OR HInvokevirtual4 MAR = CPP + H; rdInvokevirtual5 OPC = PC + 1Invokevirtual6 PC = MDR; fetchInvokevirtual7 PC = PC + 1; fetchInvokevirtual8 H = MBRU <<8Invokevirtual9 H = MBRU OR H
Main1 PC = PC + 1; fetch; goto (MBR)
(MBR)
H = xxyySi legge l’indirizzo di zz
H = zztt
In OPC si ha l’indirizzo di ritorno
![Page 25: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/25.jpg)
stack
Invokevirtual10 PC = PC + 1; fetchInvokevirtual11 TOS = SP - HInvokevirtual12 TOS = MAR = TOS + 1
LV
OBJREF
Par. 1
Par. n. . .
zztt = n+1
SP
TOS, MAR
![Page 26: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/26.jpg)
stack
Invokevirtual13 PC = PC + 1; fetchInvokevirtual14 H = MBRU <<8Invokevirtual15 H = MBRU OR H
LV
OBJREF
Par. 1
Par. n. . .
H = uuvv = numero di variabili locali
SP
TOS, MAR
![Page 27: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/27.jpg)
Invokevirtual16 MDR = SP + H + 1; wrInvokevirtual17 MAR = SP = MDR
LV
Par. 1
Par. n. . .
TOS
Variabili locali
LV
Par. 1
Par. n. . .
SP
TOS, MAR
SP + H + 1
Variabili locali
MAR, SP
![Page 28: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/28.jpg)
Invokevirtual18 MDR = OPC; wrInvokevirtual19 MAR = SP = SP + 1Invokevirtual20 OPC = MDR = LV; wrInvokevirtual21 PC = PC + 1; fetchInvokevirtual22 LV = TOSInvokevirtual23 TOS = OPC; goto Main1
Par. 1
Par. n. . .
LV
SP
Variabili locali
Salva il vecchio PC
Salva il vecchio LV
LV
Par. 1
Par. n. . .
TOS
SP, MAR
Variabili locali
PC precedente
LV precedente
![Page 29: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/29.jpg)
ireturn1 MAR = SP = LV; rd legge l’indirizzo in cui è
ireturn2 memorizzato il PC da ripristinare
ireturn3 LV = MAR = MDR; rd legge il PC precedente
Par. 1
Par. n. . .
LV
SP
Variabili locali
PC precedente
LV precedente
valore
MAR
0xAC IRETURN
1
1
3
3
![Page 30: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/30.jpg)
ireturn4 MAR = LV + 1ireturn5 PC = MDR; rd; fetch
Par. 1
Par. n. . .
SP
Variabili locali
PC precedente
LV precedente
valore
MAR
PC assume il valore di ritornosi legge il precedente LV e si iniziail fetch della prima istruzione del metodo chiamante al rientro
LV
![Page 31: H = LV MAR = MBRU + H; rd MAR = SP = SP + 1 PC = PC + 1; fetch; wr TOS = MDR; goto Main1 0x15 Control store 23212320 0x15 0x02 0x15 ILOAD varnum ILOAD](https://reader036.vdocument.in/reader036/viewer/2022062404/5542eb6a497959361e8d6821/html5/thumbnails/31.jpg)
ireturn6 MAR = SPireturn7 LV = MDRireturn8 MDR = TOS; wr; goto Main1
Par. 1
Par. n. . .
SP
Variabili locali
PC precedente
LV precedente
valore
MAR
LV
LV assume il valore di ritorno
SPvalore
LV
si scrive “valore” sullo stack in quanto (TOS) = valore
1007
1007 1000