Mikroarkitektur - Aarhus Universitet

Mikroarkitektur
Niels Olof Bouvin
Institut for Datalogi
Aarhus Universitet
1
Level 1: Mikrokode niveauet
Level 5
Problem-oriented language level
Translation (compiler)
Level 4
Assembly language level
Translation (assembler)
Level 3
Operating system machine level
Partial interpretation (operating system)
Level 2
Instruction set architecture level
Interpretation (microprogram) or direct execution
Level 1
Micro-architecture level
Hardware
Level 0
Digital logic level
2
Oversigt
Mic-1’s mikroarkitektur
Introduktion til IJVM
3
Maskinniveauet
Central Processing Unit (CPU)
Control Unit
Arithmetic Logic Unit
(ALU)
Den generelle von Neumann maskine
Moderne CPUer ser alle ud som denne
Input/Output devices
Registers
Main
Memory
Disk
Printer
Vort eksempel er Mic-1
simplere end (langt) de fleste CPUer, men stadig en god illustration
I dag skal vi se på Mic-1’s arkitektur og IJVM
næste gang ser vi på, hvorledes IJVM kan realiseres ved hjælp af mikroprogrammering på Mic-1
4
Bus
IJVM instruktionerne og arbejdet bag dem
Afvikles i en uendelig løkke bestående af
fetch / decode / execute
Mere specifikt:
1.
2.
3.
4.
5.
6.
7.
Fetch the next instruction from memory into the instruction register
Change the program counter to point to the following instruction
Decode the type of instruction just fetched
If the instruction uses a word in memory, determine where it is
Fetch the word, if needed, into a CPU register
Execute the instruction
Go to step 1 to begin executing the next instruction
5
Execute?
A+B
A
Registers
B
Involverer som regel den aritmetisk
logiske enhed (ALU’en)
Central Processing Unit (CPU)
A
B
ALU Input registers
ALU input bus
Control Unit
Operander må typisk hentes ind fra
lageret før ALU’en kan operere på
dem i forbindelse med udførsel af
instruktionen
ALU
Arithmetic Logic Unit
(ALU)
A+B
Registers
ALU output register
Input/Output devices
Main
Memory
Disk
Printer
Bus
6
Registre
Central Processing Unit (CPU)
Kan lagre et antal bits afhængig af
registerbredden (typisk 8-64 bit)
Control Unit
Kontrolinformation
Arithmetic Logic Unit
(ALU)
program counter
instruktionsregister
stack pointer
stack frame pointer
…
Input/Output devices
Registers
Main
Memory
Disk
Printer
Bus
Operander (data)
Ikke alle registre er tilgængelige for ISA-programmøren
ingen er tilgængelig via IJVM…
7
Hukommelse
En byte er 8 bit
Et ord (word) afhænger
som regel af maskinens
registerbredde (oftest 4
eller 8 bytes)
Hukommelse bruges til programmet (i form af absolut maskinkode) og data
(operander)
Organiseret som en sekvens af celler (angivet med adresse 0,…,N-1), som
gemmer et vist antal bits afhængig af den pågældende maskinarkitektur
8
Datadelen af Mic-1: Registre og busser
MAR
TOS
Memory Address Register. Adressen på
et word i lageret (32-bit)
MDR
Memory Data Register. Indeholder word
udpeget af MAR (32-bit)
PC
Program Counter. Adressen på næste
instruktion (32-bit)
MBR
Memory Buffer Register. Til bytes fra
method area (8- eller 32-bit)
Top of Stack. Kopi af det øverste
element på stakken
OPC
Opcode Register. Temporær register.
H
input register til ALU. Input fra C
A
bus fra H til ALU
B
bus fra registrene til ALU
C
bus fra ALU til registrene
9
Kontrol af Mic-1’s Aritmetiske Logiske Enhed
ALUen styres med 6 input bits
Disse kan kombineres efter behag
her er de typiske kombinationer (F0 og F1 vælger funktionen)
N
1, hvis output fra ALU er negativt
Z
1, hvis output fra ALU er 0
Shifteren kan to ting
SLL8 (Shift Left Logical 8): Skubber bits én byte til venstre (fylder ud med nuller)
SRA1 (Shift Right Arithmetic 1): Skubber bits (med fortegnsforlængelse) 1 bit til
højre (ækvivalent til heltalsdivision med 2)
10
Timing is everything
Hvad sker der i løbet
af et taktslag (clock
cycle)?
Elektriske signaler
tager tid
Digital logik tager
tid, før det
stabiliserer sig
∆w, ∆x, ∆y, ∆z
angiver tidsrum til
de enkelte undertrin
A
11
Timing af PC=PC+1
1
1
110101
A
00
12
Timing af PC=PC+1
1
1
110101
A
00
13
Timing af PC=PC+1
1
1
110101
A
00
14
Timing af PC=PC+1
1
1
110101
A
00
15
Timing af PC=PC+1
1
1
110101
A
00
16
Mic-1
Registre
Kontrolenhed
Mikroarkitekturen i al sin gru og
skønhed
dette diagram kan realiseres i hardware
Kontrolenheden styrer fetch/
decode/execute cyklen
Control store
indeholder mikroprogrammet
A bus
MPC
Beregningsenhed
PC for mikroprogrammet
MIR
den aktuelle mikroinstruktion
17
Hukommelsestilgang fra Mic-1
Stack
Constant
Pool
Method Area
}
4.294.967.296 bytes
1.073.741.824 words
PC/MBR bruges til at tilgå Method Area med byteadresser
MAR/MDR bruges til at tilgå Constant Pool og Stak med wordadresser
Mic-1’s hukommelse tilgås faktisk med byteadresser
derfor er det nødvendigt at shifte MAR 2 bit til venstre (dvs.gange med 4)
Cykel k
Cykel k+2
Cykel k+1
MAR/PC sættes
MBR/MDR kan læses
Hukommelsen & bussen arbejder
Timing: Hvis PC/MAR sættes i cycle k, kan MBR/MDR læses i cycle k+2
18
Fra MBR til B-bus: Unsigned og signed
MBR har to kontrolsignaler, fordi den 8-bits værdi, som den kan indeholde
kan sendes ud på B-bussen (der er 32-bit bred) på to måder:
Unsigned
praktisk, når byteværdien f.eks. skal sættes sammen med en anden unsigned byte til en 16-bits værdi, eller bruges til opslag i
et indeks. Eksempel: iload 1
de første 24 bits sættes til 0
Signed
bruges til værdier mellem -128 og 127. Eksempel: bipush 42
de første 24 bits sættes til kopier af den mest betydende bit af de 8 bits (altså 00000000 00000000 00000000 eller 11111111
11111111 11111111). Dette kaldes sign extension
19
H registret: Venstre input til ALU
Der er kun to busser forbundet til registrene, B og C til
input til hhv. output fra ALU og shifter
Mic-1 er et basalt design, så der er ingen tredje bus, som registrene kunne sende input ud på
Men en ALU har behov for to input til mange operationer!
Registret H tjener som fast inputsregister til ALUen
den kan naturligvis slås fra, om nødvendigt (ENA sættes til 0)
Det betyder, at det kan være nødvendigt at sende input
over B bussen igennem ALUen over C bussen til H, for
dernæst at foretage den operation med ALUen, som man
ønsker sig
ikke optimalt, men simpelt. Mic-2 (beskrevet i Chapter 4.4) har tre busser
20
A bus
Mikroinstruktionsformatet
CPUen kontrolleres ved at sætte de rigtige kontrolsignaler
Kontrolinstruktionerne til CPUen (mikroprogrammet) ligger i Control Store
Formatet afhænger af hvor mange signaler, der skal til for at kontrollere
CPUen. På Mic-1 bliver det 24 kontrol bits, 9 adresse bits og 3 JAM bits
vi kan skrive til flere registre simultant på C-bussen (hvis vi vil), men vi kan kún kopiere ét register til B-bussen af gangen
21
Micro
address
Mikroinstruktionsformatet
JAM
NEXT_ADDRESS
En mikroinstruktion indeholder altid adressen på næste instruktion (512 words—9 bit er nok)
ALU
JAM
bruges til at modificere NEXT_ADDRESS, f.eks. ved branching og goto
B-bus registre
ALU
0 = MBR
1 = PC
2 = MBR
3 = MBRU
4 = SP
ALU og shifter håndteres her under ét
5 = LV
6 = CPP
7 = TOS
8 = OPC
9-15 er ubrugte
C-bus vs. B-bus adressering
C-bus
det kan være nødvendigt at udpege flere registre som destination, derfor en bit/et signal per register
der skal kun bruges ét register som input (foruden H) til ALU, så 9 registre kan nemt enkodes i 4 bit
Memory
Memory
B-bus
fetch bruges til PC/MBR; read/write bruges til MDR/MAR
22
NEXT_ADDRESS
JMPC
JAMN
JAMZ
SLL8
SRA1
F₀
F₁
ENA
ENB
INVA
INC
H
OPC
TOS
CPP
LV
SP
PC
MDR
MAR
WRITE
READ
FETCH
B-bus
9
3
8
9
3
4
PC=PC+1 som mikroinstruktion
? ? ? ? ? ? ? ? ? 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 00 0 1
B-bus registre
0 = MBR
1 = PC
2 = MBR
3 = MBRU
4 = SP
1 1
5 = LV
6 = CPP
7 = TOS
8 = OPC
9-15 er ubrugte
Mikroinstruktioner leverer signaler til styre beregningsenheden,
samt registrenes adgang til busserne og hukommelsen
Mikroinstruktionerne hentes fra kontrollageret, der er helt
adskilt fra det sædvanlige lager
110101
00
Den næste mikroinstruktion står enten i NEXT_ADDRESS eller
udvælges
23
Udvælgelse af næste mikroinstruktion
Ofte kan man blot vælge instruktionen
angivet i NEXT_ADDRESS
den sædvanlige udførsel af mikroinstruktioner
bemærk, at mikroinstruktionerne ikke nødvendigvis ligger
sekventielt
Men hvordan håndteres goto og
branches?
24
Input til udvælgelse af næste mikroinstruktion
N/Z
resultatet fra ALU er negativt eller nul
MBR
JAMN / JAMZ
angiver om N/Z skal bruges ved udvælgelse af næste mikroinstruktion
Addr
9 bit fra den aktuelle mikroinstruktion i MIR
MBR
8 bit fra MBR registret
JMPC
angiver om MBR skal bruges ved udvælgelse af næste mikroinstruktion
25
Beregning af næste mikroinstruktion: JAMZ og JAMN
Hvis JAM er 000, så brug NEXT_ADDRESS
overført til MPC
MBR
Hvis JAMN eller JAMZ er 1, sættes den højeste
bit i MPC efter denne formel
MPC[8] = (JAMZ AND Z) OR (JAMN AND N) OR NEXT_ADDRESS[8]
Dvs., at hvis der er et negativ (eller nul) resultat
fra ALU (og hvis vi bruger det), så lægges
100000000₂ (25610 el. 10016) til NEXT_ADDRESS
der skal altså hoppes 100₁₆ (2⁸) mikroinstruktioner frem i mikroprogrammet:
26
Beregning af næste mikroinstruktion: JMPC
Hvis JAM er 000, så brug NEXT_ADDRESS
overført til MPC
MBR
Hvis JMPC er 1, sættes MPC til
MPC = MBR OR NEXT_ADDRESS
her vil NEXT_ADDRESS enten være 000₁₆ eller 100₁₆
Dvs., at MPC derefter er 0MBR eller 1MBR, alt efter
om den højeste bit i NEXT_ADDRESS var sat
Dette er superpraktisk, for det betyder, at vi kan
hoppe til (mikro)adresser defineret ved opcodes
dette er en virkelig elegant løsning på decoding af instruktioner
27
Mic-1
En simpel mikroarkitektur
men med alt hvad man behøver
Mic-1 er blot selve arkitekturen, ikke et instruktionssæt (ISA)
Men man kan bygge et instruktionssæt ovenpå Mic-1…
28
Oversigt
Mic-1’s mikroarkitektur
Introduktion til IJVM
29
Level 2: Maskinniveau (ISA)
Level 5
Problem-oriented language level
Translation (compiler)
Level 4
Assembly language level
Translation (assembler)
Level 3
Operating system machine level
Partial interpretation (operating system)
Level 2
Instruction set architecture level
Interpretation (microprogram) or direct execution
Level 1
Micro-architecture level
Hardware
Level 0
Digital logic level
30
Maskinniveauet!
Machine Language: You try to shoot yourself in the foot only to discover you must first
reinvent the gun, gunpowder, the bullet, and
your foot.
31
Maskinkodeinstruktionsformat og -repræsentation
Højniveausprog
k = 6-i-j;
•
Symbolsk maskinkode
Absolut maskinkode
bipush 6
0x10 0x06
iload 1
0x15 0x01
isub
0x64
iload 2
0x15 0x02
isub
0x64
istore 3
0x36 0x03
Den absolutte maskinkode er her opskrevet i heksadecimal for letlæselighed,
men ligger som binære tal i hukommelsen
32
Hvorfor skrive maskinkode?
Alle andre sprog er abstraktioner, der skjuler egenskaber hos CPUen
oftest med god grund… men ikke altid!
Hvis man har behov for at
skrive en compiler (det kommer I til senere i dOvs)
tale med hardware på laveste niveau (f.eks. skrive en devicedriver)
få absolut maksimal performance (i tidskritiske applikationer)
have den mindst mulige kode (på meget små enheder)
så er maskinkode sandsynligvis et godt valg til nogle dele af ens program
Hvis man har behov for at forstå, hvordan computere faktisk fungerer…
så er maskinekode ikke til at komme udenom
33
IJVM’s ISA
En kraftigt reduceret udgave af
Java Virtual Machine
Kun simple integeroperationer
Ingen objektorientering
Ingen synlige registre—alt
foregår på stakken
34
Register CPUer
Langt den mest udbredte løsning
Data og mellemregninger gemmes i registre lokalt på CPUen
meget, meget hurtigt (registrene sidder direkte sammen med ALU etc)
begrænset plads—der kan kun være relativt få registre
man bliver derfor nødt til jonglere en del med de registre, der er til rådighed
instruktioner kan blive komplicerede i adressering (“register-register”, “register-hukommelse”, …)
historisk betingede omstændigheder kan begrænse antallet af registre (f.eks. x86-familien)
… eller reservere særlige registre til særlige formål (igen er x86-familien et godt eksempel)
Når udregningerne er udført (eller vi har behov for registrene til andre,
vigtigere formål), gemmes data i hukommelsen
og det tager lang tid, ligesom det tager lang tid at hente data fra hukommelsen
35
Stak-baserede CPUer
I stedet for at bruge registre, gemmes data og mellemregninger på en stak
naturligvis er der registre, men de er skjulte for ISA-niveauet og opefter
Fleksibelt: Stakken kan blive større og mindre efter behov
Stakken kan være langt større end et begrænset antal registre
En elegant løsning, der er let at programmere til
intet behov for at jonglere med registre
instruktioner kan være særdeles uniforme
Men: Hvis stakken ligger i den almindelige hukommelse, så bliver der langt
fra CPU til data
hvilket er årsagen til, at det nu kun sjældent implementeres i hardware
36
Regning på en stak: Omvendt Polsk Notation
RPN (Reversed Polish Notation) efter Jan Łukasiewicz
Eliminerer behovet for parenteser og precedensregler
Infix
A+B
A+B⨉C
A⨉B+C⨉D
A ⨉ (B + C) ⨉ D
((A + B) ⨉ C + D)/(E + F + G)
RPN
AB+
BC⨉A+
AB⨉CD⨉+
B???????????????????????????
C+A⨉D⨉
A???????????????????????????
B+C⨉D+EF+G+/
Findes i programmeringssprog som PostScript og Forth, samt
lommeregnere fra Hewlett-Packard
37
JVM ordreformat
IJVM bruger en delmængde heraf
38
IJVM ISA: Stakoperationer
bipush A ( -- A)
Putter A (der er en signed byte) på stakken
dup (A -- A, A)
Putter det øverste element på stakken en gang til
pop (A -- )
Fjerner det øverste element på stakken
swap (A, B -- B, A)
Bytter om på de to øverste elementer på stakken
39
IJVM ISA: Beregninger
iadd (A, B -- A+B)
Fjerner de to øverste ord på stakken, og putter summen af dem på stakken
isub (A, B -- A-B)
Fjerner de to øverste ord på stakken, og putter differencen mellem dem på stakken
iand (A, B -- A&&B)
Fjerner de to øverste ord på stakken, og putter logisk AND af dem på stakken
ior (A, B -- A||B)
Fjerner de to øverste ord på stakken, og putter logisk OR af dem på stakken
40
IJVM ISA: Sammenligninger og branches
goto offset
Lægger offset (16-bit, signed) til PC
ifeq offset (A -- )
Fjerner det øverste ord på stakken, og hvis det er nul lægger offset til PC
iflt offset (A -- )
Fjerner det øverste ord på stakken, og hvis det er mindre end nul lægger offset til PC
if_icmpeq offset (A, B -- )
Fjerner de to øverste ord på stakken, og hvis de er ens lægger offset til PC
41
Et simpelt program
add.j
.method main
bipush 7
bipush 6
iadd
ireturn
add.bc
ijvm-asm add.j add.bc
ijvm add.bc
main index: 0
method area: 10 bytes
00 01 00 00 10 07 10 06 60 ac
constant pool: 1 words
00000000
IJVM Trace of add.bc
bipush 7
bipush 6
iadd
ireturn
return value: 13
stack
stack
stack
stack
stack
[10 07]
[10 06]
[60]
[ac]
42
=
=
=
=
=
0, 1, 5
7, 0, 1, 5
6, 7, 0, 1, 5
13, 0, 1, 5
13
Method area? Stack? Constant pool?
IJVMs hukommelse (4 GB (232 bytes)) opdelt i tre områder: Constant pool,
SP
stack og metode area. Disse bestyres af fire 32-bit registre:
Current Operand
Stack 3
Program Counter (PC)
Udpeger aktuel instruktion (byte) i method area
Local Variable
Frame 3
Constant Pool Pointer (CPP)
Udpeger bunden (word) af constant pool i lageret
Local Variable
Frame 2
Stack Pointer (SP)
Udpeger toppen (word) af stakken
LV
Method
Area
Constant
Pool
Local Variable Frame Pointer (LV)
CPP
Udpeger bunden (word) af det aktuelle stakafsnit
32 bit
43
Local Variable
Frame 1
32 bit
8 bit
PC
Stakken
Bruges altså til beregninger og mellemresultater
Samt til udførsel af metodekald
44
Metodekald
/* find_min.c */
Hvert kald har behov at få et nyt sæt
argumenter
#include <stdio.h>
#include <stdlib.h>
int min(int a, int b)
{
int r;
Hvert kald har behov for sine egne
lokale variabler
if (a >= b) {
r = b;
} else {
r = a;
}
Når kaldet afsluttes, skal verden
genoprettes, så vi kommer tilbage
til det rigtige sted i koden, og så vi
har de rigtige argumenter/variabler
klar for det pågældende kald
}
return r;
int main(int argc, char *argv[])
{
int a = atoi(argv[1]); // første tal på cmdlinjen
int b = atoi(argv[2]); // andet tal på cmdlinjen
printf("%d\n", min(a, b)); //
}
Så hvordan gør vi dét?
45
IJVM ISA: Metodekald og lokale variabler
invokevirtual disp
kalder en metode disp angivet med et 2 bytes (16 bit) indeks i Constant Pool. Etablerer en ny stack frame med ny LV og SP,
og gemmer de gamle værdier af LV, SP og PC så de kan reetableres senere
ireturn
returnerer fra et metodekald med det øverste word på stakken som resultat. Nedlægger den nuværende stack frame og
genopretter den foregående, herunder de gamle PC, LV og SP registre
iload n
kopierer det n’te (n er en byte, talt fra 1) word fra Local Variable Frame og putter det øverst på stakken
istore n
kopierer det øverste element fra stakken og gemmer det som det n’te (n er en byte, talt fra 1) word i Local Variable Frame
46
invokevirtual
Arbitrær værdi
(place holder)
De gamle
værdier gemt
callee's
Med denne
pointer kan
verden genskabes
(a) Inden kald til invokevirtual, efter
parametre er puttet på stakken
(b) Efter invokevirtual er udført
47
ireturn
Callee's
(a) Inden kald til ireturn
(b) Efter ireturn er udført
48
find_min.j
.method main
.args 3
.define a = 1
.define b = 2
// int main
// ( int a, int b )
.method min
.args 3
.define a = 1
.define b = 2
.locals 1
.define r = 3
iload a
iload b
isub
// {
bipush 88 // Push some object reference
iload a
iload b
invokevirtual min
// return min (a,b);
/* find_min.c */ ireturn
// }
#include <stdio.h>
// int r;
// if ( a >= b )
// stack = a - b, ... ; a - b < 0 => a < b
iflt else
iload b
//
r = b;
istore r
goto end_if
else:
// else
iload a
//
r = a;
istore r
end_if: iload r
// return r;
ireturn
// }
#include <stdlib.h>
int min(int a, int b)
{
int r;
if (a >= b) {
r = b;
} else {
r = a;
}
}
// int min
// ( int a, int b ){
return r;
int main(int argc, char *argv[])
{
int a = atoi(argv[1]); // første tal på cmdlinjen
int b = atoi(argv[2]); // andet tal på cmdlinjen
printf("%d\n", min(a, b)); //
}
49
find_min.bc
main index: 0
method area: 40 bytes
00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03
00 01 15 01 15 02 64 9b 00 0a 15 02 36 03 a7 00
07 15 01 36 03 15 03 ac
constant pool: 2 words
00000000
0000000e
Genereret med kommandoen
ijvm-asm find_min.j find_min.bc
50
find_min.bc
Antal argumenter
for main
Antal argumenter
for min
Start adresse for
main, udpeget af
main index: 0
main index: 0
method area: 40 bytes
0
00 03
2
00 00
4
10 58
bipush 88 (88d = 0x58)
6
15 01
iload 1
8
15 02
iload 2
10
b6 00 01
invokevirtual 1
13
ac
ireturn
14
00 03
16
00 01
18
15 01
iload 1
20
15 02
iload 2
22
64
isub
23
9b 00 0a
iflt 10 (10d = 0x0a)
26
15 02
iload 2
28
36 03
istore 3
30
a7 00 07
goto 7
33
15 01
iload 1
35
36 03
istore 3
37
15 03
iload 3
39
ac
ireturn
constant pool: 2 words
00000000
0000000e
51
Antal lokale
variabler for main
Antal lokale
variabler for min
Start adresse for
min (14d = 0x0e)
Kørsel af ijvm
find_min.bc 9 8
IJVM Trace of find_min.bc
bipush 88
iload 1
iload 2
invokevirtual 1
iload 1
iload 2
isub
iflt 10
iload 2
istore 3
goto 7
iload 3
ireturn
ireturn
return value: 8
Decimal
[10 58]
[15 01]
[15 02]
[b6 00 01]
[15 01]
[15 02]
[64]
[9b 00 0a]
[15 02]
[36 03]
[a7 00 07]
[15 03]
[ac]
[ac]
Heksadecimal
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
stack
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0, 1, 8, 9, 15
88, 0, 1, 8, 9, 15
9, 88, 0, 1, 8, 9, 15
8, 9, 88, 0, 1, 8, 9, 15
12, 13, 0, 8, 9, 21, 0, 1,
9, 12, 13, 0, 8, 9, 21, 0,
8, 9, 12, 13, 0, 8, 9, 21,
1, 12, 13, 0, 8, 9, 21, 0,
12, 13, 0, 8, 9, 21, 0, 1,
8, 12, 13, 0, 8, 9, 21, 0,
12, 13, 8, 8, 9, 21, 0, 1,
12, 13, 8, 8, 9, 21, 0, 1,
8, 12, 13, 8, 8, 9, 21, 0,
8, 0, 1, 8, 9, 15
8
Decimal
52
8,
1,
0,
1,
8,
1,
8,
8,
1,
9,
8,
1,
8,
9,
8,
9,
9,
8,
15
9,
8,
9,
15
9,
15
15
9,
15
9, 15
15
15
15
(Sådan er det bare)
Kørsel af ijvm
find_min.bc 9 8
Argumenter for
main
IJVM Trace of find_min.bc
OBJREF
stack = 0, 1, 8, 9, 15
4 bipush 88
[10 58]
stack = 88, 0, 1, 8, 9, 15
6 iload 1
[15 01]
stack = 9, 88, 0, 1, 8, 9, 15
8 iload 2
[15 02]
stack = 8, 9, 88, 0, 1, 8, 9, 15
10 invokevirtual 1
[b6 00 01]
stack = 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
18 iload 1
[15 01]
stack = 9, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
20 iload 2
22 isub
[15 02]
[64]
stack = 8, 9, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
stack = 1, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
23 iflt 10
[9b 00 0a]
26 iload 2
[15 02]
stack = 8, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
28 istore 3
[36 03]
stack = 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15
30 goto 7
[a7 00 07]
stack = 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15
37 iload 3
[15 03]
stack = 8, 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15
39 ireturn
13 ireturn
[ac]
[ac]
stack = 8, 0, 1, 8, 9, 15
stack = 8
Overskrives straks
med link pointer
stack = 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15
return value: 8
53
Argumenter til
min
Lokal variabel for
min
Link pointer
overskrives med
return værdien
Opsummering
Mic-1: Mikroarkitekturen
Registre, busser, ALU
Mikroinstruktioner
IJVM maskinen
Registre: PC, SP, LV, CPP
Lagermodel: method area, constant pool, stakken
Metodekald og stakafsnit, parametre og lokale variabler
IJVM simulatoren
Bytecode kode
Kørsel med stack trace
54
Ugeopgave 2
55