Upload
amadore-chiesa
View
223
Download
0
Tags:
Embed Size (px)
Citation preview
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
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
Programma Java: … …
A = B + C …
...
Compilatore
Programma IJVM: ……ILOAD2ILOAD5IADDISTORE4...
23212320 0x15 0x02 0x15 0x05 0x60 0x36 0x04 ILOAD varnum ILOAD varnum IADD ISTORE varnum
Area dei metodi
Stack
1000
1005 37 / /25 / /
2326
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
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
BIPUSH byteDUPIADDIANDIINC varnum constILOAD varnumIORISTORE varnumISUBNOPPOPSWAPLDCW index
GOTO offsetIFEQ offsetIFTL offsetIF_ICMPEQ offsetWIDE
INVOKEVIRTUAL dispIRETURN
0xA7 GOTO offset
PCA7xxyy offset
Area dei metodi
opcode
opcode
Main1 PC = PC + 1; fetch; goto 0xA7
PCA7xxyy
opcode
opcode
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
goto5 PC = OPC + H; fetchgoto6 goto Main1
PC
A7xxyy
opcode
opcode
OPC
PC
A7xxyy
opcode
opcode
OPC
opcode
opcode
0x9F IF_ICMPEQ offset
PC9Fxxyy offset
Area dei metodi
opcode
opcode
PC = PC + 1; fetch; goto (MBR)
PC9Fxxyy
opcode
opcode
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
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
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
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.
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.
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
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
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
Stack
1000
1005 3762 /25 / /
OBJREF621007
(CPP) = 500
Constant pool
530 4576
(LV) = 1000 (SP) = 1007
500
situazione all’atto della chiamata
Stack
1000
1005 3762 /25 / /
1012621007
MAR
MDR
PC
MBR
CPP
LV
SP
H
OPC
TOS
10131006 5001000
10002334
10131012
4580
dopo la INVOKEVIRTUAL
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
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
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
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
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
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
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
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
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
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