mikroarkitektur - aarhus universitet...hvis jamn eller jamz er 1, sættes den højeste bit i mpc...

55
Mikroarkitektur Niels Olof Bouvin Institut for Datalogi Aarhus Universitet 1

Upload: others

Post on 26-Jan-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

  • MikroarkitekturNiels Olof Bouvin

    Institut for Datalogi Aarhus Universitet

    1

  • Level 1: Mikrokode niveauetProblem-oriented language levelLevel 5

    Assembly language levelLevel 4

    Level 3 Operating system machine level

    Level 2 Instruction set architecture level

    Level 1 Micro-architecture level

    Level 0 Digital logic level

    Translation (compiler)

    Translation (assembler)

    Partial interpretation (operating system)

    Interpretation (microprogram) or direct execution

    Hardware

    2

  • Oversigt

    Mic-1’s mikroarkitektur Introduktion til IJVM

    3

  • Maskinniveauet

    Den generelle von Neumann maskine

    Moderne CPUer ser alle ud som denne

    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

    Central Processing Unit (CPU)

    Control Unit

    Arithmetic Logic Unit (ALU)

    Registers

    MainMemory Disk Printer

    Bus

    Input/Output devices

    4

  • IJVM instruktionerne og arbejdet bag dem

    Afvikles i en uendelig løkke bestående af fetch / decode / execute

    Mere specifikt: 1. Fetch the next instruction from memory into the instruction register 2. Change the program counter to point to the following instruction 3. Decode the type of instruction just fetched 4. If the instruction uses a word in memory, determine where it is 5. Fetch the word, if needed, into a CPU register 6. Execute the instruction 7. Go to step 1 to begin executing the next instruction

    5

  • Execute?

    Involverer som regel den aritmetisk logiske enhed (ALU’en)

    Operander må typisk hentes ind fra lageret før ALU’en kan operere på dem i forbindelse med udførsel af instruktionen

    ALU

    A + B

    A

    B

    A B

    A + B

    Registers

    ALU Input registers

    ALU input bus

    ALU output register

    Central Processing Unit (CPU)

    Control Unit

    Arithmetic Logic Unit (ALU)

    Registers

    MainMemory Disk Printer

    Bus

    Input/Output devices

    6

  • Registre

    Kan lagre et antal bits afhængig af registerbredden (typisk 8-64 bit)

    Kontrolinformation program counter instruktionsregister stack pointer stack frame pointer …

    Operander (data)

    Ikke alle registre er tilgængelige for ISA-programmøren ingen er tilgængelig via IJVM…

    Central Processing Unit (CPU)

    Control Unit

    Arithmetic Logic Unit (ALU)

    Registers

    MainMemory Disk Printer

    Bus

    Input/Output devices

    7

  • Hukommelse

    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

    En byte er 8 bit

    Et ord (word) afhænger som regel af maskinens registerbredde (oftest 4 eller 8 bytes)

    8

  • Datadelen af Mic-1: Registre og busserMAR

    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)

    TOS 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

    A

    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

    11

  • Timing af PC=PC+1

    A110101

    00

    1 1

    12

  • Timing af PC=PC+1

    A110101

    00

    1 1

    13

  • Timing af PC=PC+1

    A110101

    00

    1 1

    14

  • Timing af PC=PC+1

    A110101

    00

    1 1

    15

  • Timing af PC=PC+1

    A110101

    00

    1 1

    16

  • Mic-1

    Mikroarkitekturen i al sin gru og skønhed

    dette diagram kan realiseres i hardware

    Kontrolenheden styrer fetch/decode/execute cyklen

    Control store indeholder mikroprogrammet

    MPC PC for mikroprogrammet

    MIR den aktuelle mikroinstruktion

    Registre

    Beregningsenhed

    Kontrolenhed

    A bus

    17

  • Hukommelsestilgang fra Mic-1

    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)

    Timing: Hvis PC/MAR sættes i cycle k, kan MBR/MDR læses i cycle k+2

    Method Area

    ConstantPool

    Stack }4.294.967.296 bytes1.073.741.824 words

    Cykel k Cykel k+1 Cykel k+2

    MAR/PC sættes

    Hukommelsen & bussen arbejder

    MBR/MDR kan læses

    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

    A bus

    20

  • 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

  • Mikroinstruktionsformatet

    NEXT_ADDRESS En mikroinstruktion indeholder altid adressen på næste instruktion (512 words—9 bit er nok)

    JAM bruges til at modificere NEXT_ADDRESS, f.eks. ved branching og goto

    ALU ALU og shifter håndteres her under ét

    C-bus vs. B-bus adressering 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 fetch bruges til PC/MBR; read/write bruges til MDR/MAR

    Micro address

    NEXT_ADDRESS 9

    JAMJMPC

    3JAMNJAMZ

    ALU

    SLL8

    8

    SRA1F₀F₁

    ENAENB

    INVAINC

    C-bus

    H

    9

    OPCTOSCPPLVSPPC

    MDRMAR

    MemoryWRITE

    3READFETCH

    B-bus B-bus 4

    B-bus registre0 = MBR 5 = LV1 = PC 6 = CPP2 = MBR 7 = TOS3 = MBRU 8 = OPC4 = SP 9-15 er ubrugte

    22

  • PC=PC+1 som mikroinstruktion

    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

    Den næste mikroinstruktion står enten i NEXT_ADDRESS eller udvælges

    110101

    00

    11

    ? ? ? ? ? ? ? ? ? 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 B-bus registre0 = MBR 5 = LV1 = PC 6 = CPP2 = MBR 7 = TOS3 = MBRU 8 = OPC4 = SP 9-15 er ubrugte

    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

    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

    MBR

    25

  • Beregning af næste mikroinstruktion: JAMZ og JAMNHvis JAM er 000, så brug NEXT_ADDRESS overført til MPC

    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:

    MBR

    26

  • Beregning af næste mikroinstruktion: JMPC

    Hvis JAM er 000, så brug NEXT_ADDRESS overført til MPC

    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

    MBR

    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)Problem-oriented language levelLevel 5

    Assembly language levelLevel 4

    Level 3 Operating system machine level

    Level 2 Instruction set architecture level

    Level 1 Micro-architecture level

    Level 0 Digital logic level

    Translation (compiler)

    Translation (assembler)

    Partial interpretation (operating system)

    Interpretation (microprogram) or direct execution

    Hardware

    30

  • Maskinniveauet!

    Machine Language: You try to shoot your-self 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

    bipush 6 iload 1 isub iload 2 isub istore 3


    Absolut maskinkode

    0x10 0x06 0x15 0x01 0x64 0x15 0x02 0x64 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 NotationRPN (Reversed Polish Notation) efter Jan Łukasiewicz

    Eliminerer behovet for parenteser og precedensregler

    Findes i programmeringssprog som PostScript og Forth, samt lommeregnere fra Hewlett-Packard

    Infix RPNA + B A B +A + B ⨉ C B C ⨉ A +A ⨉ B + C ⨉ D A B ⨉ C D ⨉ +A ⨉ (B + C) ⨉ D B C + A ⨉ D ⨉((A + B) ⨉ C + D)/(E + F + G) A B + C ⨉ D + E F + G + /

    ??????????????????????????? ???????????????????????????

    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

  • .method main bipush 7 bipush 6 iadd ireturn

    Et simpelt programadd.j

    ijvm-asm add.j add.bc

    main index: 0 method area: 10 bytes 00 01 00 00 10 07 10 06 60 ac constant pool: 1 words 00000000

    add.bc

    IJVM Trace of add.bc stack = 0, 1, 5 bipush 7 [10 07] stack = 7, 0, 1, 5 bipush 6 [10 06] stack = 6, 7, 0, 1, 5 iadd [60] stack = 13, 0, 1, 5 ireturn [ac] stack = 13 return value: 13

    ijvm add.bc

    42

  • Method area? Stack? Constant pool?IJVMs hukommelse (4 GB (232 bytes)) opdelt i tre områder: Constant pool, stack og metode area. Disse bestyres af fire 32-bit registre:

    Program Counter (PC) Udpeger aktuel instruktion (byte) i method area

    Constant Pool Pointer (CPP) Udpeger bunden (word) af constant pool i lageret

    Stack Pointer (SP) Udpeger toppen (word) af stakken

    Local Variable Frame Pointer (LV) Udpeger bunden (word) af det aktuelle stakafsnit

    Method Area

    8 bit

    Local Variable Frame 1

    32 bit

    Local Variable Frame 2

    Local Variable Frame 3

    Current Operand Stack 3

    ConstantPool

    32 bit

    CPP

    LV

    SP

    PC

    43

  • StakkenBruges altså til beregninger og mellemresultater

    Samt til udførsel af metodekald

    44

  • Metodekald

    Hvert kald har behov at få et nyt sæt argumenter

    Hvert kald har behov for sine egne lokale variabler

    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

    Så hvordan gør vi dét? 


    /* find_min.c */

    #include #include

    int min(int a, int b) { int r;

    if (a >= b) { r = b; } else { r = a; }

    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)); // }

    45

  • 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

    IJVM ISA: Metodekald og lokale variabler

    46

  • invokevirtual

    (a) Inden kald til invokevirtual, efter parametre er puttet på stakken 
 (b) Efter invokevirtual er udført

    callee'sArbitrær værdi (place holder)

    De gamle værdier gemt

    Med denne pointer kan

    verden genskabes

    47

  • ireturn

    (a) Inden kald til ireturn
 (b) Efter ireturn er udført

    Callee's

    48

  • find_min.j.method main // int main .args 3 // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 // Push some object reference iload a iload b invokevirtual min ireturn // return min (a,b); // }

    .method min // int min

    .args 3 // ( int a, int b ){

    .define a = 1

    .define b = 2

    .locals 1 // int r;

    .define r = 3 iload a // if ( a >= b ) iload b isub

    // 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 // }

    /* find_min.c */

    #include #include

    int min(int a, int b) { int r;

    if (a >= b) { r = b; } else { r = a; }

    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

  • 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

    find_min.bc

    Genereret med kommandoen

    ijvm-asm find_min.j find_min.bc

    50

  • 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

    find_min.bcAntal argumenter

    for main

    Antal lokale variabler for main

    Antal argumenter for min

    Antal lokale variabler for min

    Start adresse for main, udpeget af main index: 0

    Start adresse for min (14d = 0x0e)

    51

  • Kørsel af ijvm find_min.bc 9 8IJVM Trace of find_min.bc

    stack = 0, 1, 8, 9, 15 bipush 88 [10 58] stack = 88, 0, 1, 8, 9, 15 iload 1 [15 01] stack = 9, 88, 0, 1, 8, 9, 15 iload 2 [15 02] stack = 8, 9, 88, 0, 1, 8, 9, 15 invokevirtual 1 [b6 00 01] stack = 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 iload 1 [15 01] stack = 9, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 iload 2 [15 02] stack = 8, 9, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 isub [64] stack = 1, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 iflt 10 [9b 00 0a] stack = 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 iload 2 [15 02] stack = 8, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 istore 3 [36 03] stack = 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15 goto 7 [a7 00 07] stack = 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15 iload 3 [15 03] stack = 8, 12, 13, 8, 8, 9, 21, 0, 1, 8, 9, 15 ireturn [ac] stack = 8, 0, 1, 8, 9, 15 ireturn [ac] stack = 8 return value: 8

    HeksadecimalDecimal Decimal (Sådan er det bare)

    52

  • Kørsel af ijvm find_min.bc 9 8IJVM Trace of find_min.bc

    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 [15 02] stack = 8, 9, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 22 isub [64] stack = 1, 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 23 iflt 10 [9b 00 0a] stack = 12, 13, 0, 8, 9, 21, 0, 1, 8, 9, 15 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 [ac] stack = 8, 0, 1, 8, 9, 15 13 ireturn [ac] stack = 8 return value: 8

    Lokal variabel for min

    Argumenter for main

    OBJREF

    Argumenter til min

    Overskrives straks med link pointer

    Link pointer overskrives med return værdien

    53

  • 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