TDT4160 Datamaskiner Grunnkurs Forelesning 27.10 ISA: IJVM Kap 4.2
Dagens tema Repetisjon: ISA vs. mikroarkitektur ISA: IJVM (4.2) Lagring av lokale variable Minnemodell Instruksjonssett Metodekall Kompilering
ISA vs. mikroarkitektur ILOAD j ILOAD k IADD ISTORE i ILOAD i BIPUSH 3 ISA-instr. Mikroprogram: Sekvens av μinstr.
IJVM: Utførende enhet
Mic-1
ISA-eksempel: IJVM Forrige forelesning: Utførende enhet Styreenhet Format på mikroinstruksjoner Hva gjenstår? Mikroprogram for hver IJVM-instruksjon Trenger først en forståelse for hvordan IJVM fungerer (mao. hva ISA-nivået inneholder)
Lagring av lokale variable public int fibonnaci(int number) { int fibonnaci; if (number == 0) fibonnaci = 0; else if (number == 1) fibonnaci = 1; else fibonnaci = fibonacci(number 1) + fibonnaci(number 2); return fibonnaci; } Hvor skal lokale variabler lagres? Registre? Kan ha flere variabler enn registre Fast sted i hovedlager? Hva da med rekursive kall? IJVM-løsning: Stakk
IJVM: Stakk (1/2) Når en metode blir kalt, settes det av plass på stakken til alle lokale variabler Register LV (Local variables) peker til der første (nederste) variabel ligger (Register SP (Stack pointer) peker til toppen av stakken) Adressen til en lokal variabel blir LV + offset Dermed ikke absolutt minneadresse! LV- og SP-adresser er ordadresser
IJVM: Stakk (2/2) Figur 1: Metode A har tre lokale variabler Figur 2: A kaller B som har fire lokale variabler Figur 3: B kaller C som har 2 lokale variabler Figur 4: C & B returnerer, A kaller D
IJVM: Operandstakk Stakken brukes også til mellomlagring av operander Eksempel: a1 = a2 + a3 Figur 1: Push a2 (LV + 1) Figur 2: Push a3 (LV + 2) Figur 3: Pop 2 verdier fra stakk, adder, push svar Figur 4: Pop svar og legg det i a1 (LV + 0)
IJVM: Minnemodell (1/3) 32 bits ordstørrelse = 32 bits adresser Dermed maks 4 GB hovedlager Hvordan brukes hovedlager? IJVM: Ingen absolutte adresser, alle relative Dette er et IJVM-valg, ikke alle har det slik Relative adresser: Peker + offset 4 pekere definert i IJVM Dermed deles hovedlager i 4 deler
IJVM: Minnemodell (2/3) Constant Pool (CPP) Inneholder konstanter fra Java-program Leses inn ved oppstart av program, endres ikke Local Variable Frame (LV) Settes av plass til lokale variabler ved metodekall Operand Stack (SP) Midlertidig lagring av operander SP peker til topp av stakk Method Area (PC) Selve java-programmet ligger her (IJVM-instr.)
IJVM: Minnemodell (3/3)
IJVM: Instruksjonssett (1/4) Hex 0x10 0x15 0x13 0x57 0x36 0x59 0x5F Mnemonic BIPUSH byte ILOAD varnum LDC_W index POP ISTORE varnum DUP SWAP Meaning Push byte onto stack Push local variable onto stack Push constant from constant pool onto stack Delete word on top of stack Pop word from stack and store in local var. Copy top word on stack and push onto stack Swap the two top words on the stack Diverse instruksjoner for å manipulere stakken Husk: Vi må skrive mikroprogram for alle instruksjoner i instruksjonssettet
IJVM: Instruksjonssett (2/4) Hex 0x60 0x64 0x7E 0x80 0x84 Mnemonic IADD ISUB IAND IOR IINC varnum const Meaning Pop two words from stack; push their sum Pop two words from stack; push their difference Pop two words from stack; push Boolean AND Pop two words from stack; push Boolean OR Add a constant to a local variable Diverse aritmetiske instruksjoner
IJVM: Instruksjonssett (3/4) Hex 0xA7 0x99 0x9B 0x9F Mnemonic GOTO offset IFEQ offset IFLT offset IF_ICMPEQ offset Meaning Unconditional branch Pop word from stack and branch if it is zero Pop word from stack and branch if less than zero Pop two words from stack; branch if equal Instruksjoner for ubetinget og betinget hopp Hvis hopp, PC = PC + offset
IJVM: Instruksjonssett (4/4) Hex 0x00 Mnemonic NOP Meaning Do nothing 0xC4 WIDE Prefix instruction; next instruction has a 16- bit index 0xB6 0xAC INVOKEVIRTUAL disp IRETURN Invoke a method Return from a method with integer value Diverse instruksjoner WIDE fikser begrensning ved at varnum bare er 1 byte Mer om metodekall på de neste foilene
IJVM: Metodekall Java: objectreference.method(param1, ) Forenkling i IJVM: objectreference = this Steg i metodekall: Push objectreference og parametre Utfør INVOKEVIRTUAL disp disp = constant pool offset til metodeadresse Må ta vare på gammel verdi for PC og LV Oppdaterer PC med ny verdi Method Area 16 bit heltall antall parametre 16 bit heltall størrelse på Local Variable Frame Deretter selve metodekoden
INVOKEVIRTUAL
IRETURN
Kompilering: Java IJVM Opkode byte, const og varnum er 1 byte disp, index og offset er 2 bytes
Operandstakk under utføring