TDT4160 Datamasiner Grunnurs Forelesning 31.10 Miroprogram for IJVM Kap 4.3
Dagens tema Repetison: IJVM Miroaritetur IJVM-Instrusoner Registerbru Miroprogram for IJVM (4.3) Micro Assembly Language (MAL) Stort esempel WIDE GOTO
ISA vs. miroaritetur ILOAD ILOAD IADD ISA-instr. ISTORE i ILOAD i BIPUSH 3 Miroprogram: Sevens av
Mic-1
Registerbru CPP, LV, SP holder peerverdier PC adresse til neste byte med programode MBR siste byte lest fra programode MAR/MDR adresse til data / data TOS sal alltid inneholde ord på topp av sta OPC register til fritt bru
Timingdiagram
IJVM: Instrusoner
Miroprogram for IJVM Hvor er vi nå? Vet hvordan IJVM sal fungere Vet hvilen masinvare vi har Hva mangler? Miroprogram for å implementere IJVM Må mao. srive en sevens av miroinstrusoner for hver IJVM-instruson Miroinstrusoner lagres (selvsagt) binært, men symbols notason gør den mer leselig
Symbols notason En mulig notason: ReadRegister = SP, ALU = INC, WSP, Read, NEXT_ADDRESS = 122 (der WSP = Write SP register) Tungvint!
MAL: Micro Assembly Language Symbols språ for IJVM miroaritetur Hver line tilsvarer det som sal se i en loesylus Esempler: SP = SP + 1; rd MDR = SP MDR = H + SP SP = MDR = SP + 1 Bruer assembler til å oversette til binær form
MAL: Lovlige operasoner Ie alle MAL-instrusoner lar seg utføre i vår aritetur Esempler: MDR = SP + MDR H = H - MDR
MAL: Asess av hovedlager Tre måter: rd les ord (MAR / MDR) wr sriv ord (MAR / MDR) fetch les byte (PC / MBR) Må være obs på timing: MAR = SP; rd MDR = H Hvorfor går ie dette bra?
MAL: NEXT_ADDRESS (1/2) Må oppgi NEXT_ADDRESS, JMPC, JAMN, JAMZ Dette er tungvint; lar heller assembler gøre obben For to etterfølgende MAL-liner (=miroinstr.) Assembler bestemmer hvor i styrelager de sal ligge Assembler setter NEXT_ADDRESS i første til å pee på andre Unnta: Hoppinstrusoner GOTO, IFEQ, IFLT, IF_ICMPEQ
MAL: NEXT_ADDRESS (2/2) Ubetinget: goto label Betinget: Må få satt N- og Z-registrene Sender TOS (Top Of Stac) gennom ALU uten å srive til register MAL-syntas: Z = TOS; if (Z) goto L1; else goto L2 Assemblers ansvar å passe på at miroinstrusonene blir lagt sli at dette er mulig Hopp basert på JMPC: goto (MBR)
Valg av neste miroinstruson Styrelager inneholder 512 miroinstrusoner Trenger 9 bits adresse Hva med forgreninger? JAM JAMZ: Ta hensyn til Z (siste svar = 0) JAMN: Ta hensyn til N (siste svar negativt) MPC[8] = (JAMZ AND Z) OR (JAMN AND N) OR NEXT_ADDRESS[8] JMPC: Ta hensyn til MBR MPC[0:7] = MBR[0:7] OR NEXT_ADDRESS[0:7] (Typis NEXT_ADDRESS = 0 sli at MPC = MBR)
Registerbru CPP, LV, SP holder peerverdier PC adresse til neste byte med programode MBR siste byte lest fra programode MAR/MDR adresse til data / data TOS sal alltid inneholde ord på topp av sta OPC register til fritt bru
Hovedløe Main1: PC = PC + 1; fetch; goto (MBR) MBR inneholder allerede opode Oppdater PC til å pee på neste byte i den ompilerte programoden Kan være neste opode eller operand Hent neste byte Hopp til miroode for IJVM-instruson Adresse = opode
Esempel: IADD Pop two words from stac; push their sum iadd1 iadd2 MAR = SP = SP 1; rd En operand ligger i TOS, hent den andre Adresse er SP 1; oppdater samtidig SP H = TOS Flytt den første over til H (Hvorfor?) iadd3 MDR = TOS = MDR + H; wr; goto Main 1 Utfør addison og sriv til sta (hovedlager) Oppdater samtidig TOS Gå tilbae til hovedløe
Stort esempel: i = + Sal nå vise i detal hva som ser når denne oden blir utført Legg spesielt mere til Forsellen på PC og MPC Forsellen på styrelager og Method Area Når leseoperasoner fra hovedlager blir ferdig Hvor i styrelageret miroprogrammene ligger
Før 1. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC Main1 108 MBR 0x15 Styrelager i TOS LV H MIR PC =PC +1; fetch; goto (MBR)
Etter 1. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iload1 108 MBR 0x15 Styrelager i TOS LV H MIR PC =PC +1; fetch; goto (MBR)
Etter 2. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iload2 108 MBR 0x02 Styrelager i TOS LV H MIR H =LV
Etter 3. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR 108 MPC iload3 108 MBR 0x02 Styrelager i TOS LV H MIR MAR =MBRU +H; rd
Etter 4. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iload4 108 MBR 0x02 Styrelager i TOS LV H MIR MAR =SP =SP +1
Etter 5. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iload5 108 MBR 0x02 Styrelager i TOS LV H MIR PC =PC +1; fetch; wr
Etter 6. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC Main1 108 MBR 0x15 Styrelager i TOS LV H MIR TOS =MDR; goto Main1
Etter 12. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC Main1 108 MBR 0x60 Styrelager i TOS LV H MIR TOS =MDR; goto Main1
Etter 13. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iadd1 108 MBR 0x60 Styrelager i TOS LV H MIR PC =PC +1; fetch; goto (MBR)
Etter 14. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iadd2 108 MBR 0x36 Styrelager i TOS LV H MIR MAR =SP =SP -1; rd
Etter 15. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR Miroaritetur 112 MAR MPC iadd3 108 MBR 0x36 Styrelager i TOS LV H MIR H =TOS
Etter 16. loesylus 212 PC Hovedlager SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR + Miroaritetur 112 MAR MPC Main1 108 MBR 0x36 Styrelager i TOS + LV H MIR MDR =TOS =MDR +H; wr; goto Main1
Etter 17. loesylus 212 PC Hovedlager + SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR + Miroaritetur 112 MAR MPC istore1 108 MBR 0x36 Styrelager i TOS + LV H MIR PC =PC +1; fetch; goto (MDR)
Etter 18. loesylus 212 PC Hovedlager + SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR + Miroaritetur 112 MAR MPC istore2 108 MBR 0x01 Styrelager i TOS + LV H MIR H =LV
Etter 19. loesylus 212 PC Hovedlager + SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR + Miroaritetur 112 MAR MPC istore3 108 MBR 0x01 Styrelager i TOS + LV H MIR MAR =MBRU +H
Etter 20. loesylus 212 PC Hovedlager + SP 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i MDR + Miroaritetur 112 MAR MPC istore4 108 MBR 0x01 Styrelager i TOS + LV H MIR MDR =TOS; wr
Etter 21. loesylus 212 PC Hovedlager + 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i SP MDR + Miroaritetur 112 MAR MPC istore5 108 MBR 0x01 Styrelager i: + TOS + LV H MIR SP =MAR =SP 1; rd
Etter 22. loesylus 212 PC Hovedlager + 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i SP MDR (gammel TOS-verdi) Miroaritetur 112 MAR MPC istore6 108 MBR 0x01 Styrelager i: + TOS + LV H MIR PC =PC +1; fetch
Etter 23. loesylus 212 PC Hovedlager + 0x15 0x02 0x15 0x03 0x60 0x36 0x01 ILOAD ILOAD IADD ISTORE i SP MDR (gammel TOS-verdi) Miroaritetur 112 MAR MPC Main1 108 MBR (neste instrbyte) Styrelager i: + TOS (gammel TOS-verdi) LV H MIR TOS =MDR; goto Main1
Dagens oppgave (1/2) Gitt følgende situason etter en loesylus. Hva er innholdet i de forsellige bosene etter at ILOAD og BIPUSH er utført? 212 PC Hovedlager 0x15 0x01 0x10 0x03 ILOAD i BIPUSH 3 SP MDR Miroaritetur 112 MAR MPC iload1 108 MBR 0x15 Styrelager i TOS LV H MIR PC =PC +1; fetch; goto (MBR)
Dagens oppgave (2/2)
WIDE (1/2) Normal ILOAD/ISTORE har en variabelindes på en byte Kun 256 loale variable mulig Dette holder som regel, men det an bli for lite Løsning: WIDE prefix byte Sier ifra at etterfølgende ILOAD/ISTORE har en indes på to bytes Krever estra miroprogram for WIDE ILOAD/ISTORE
WIDE (2/2) Ny indes er 2 byte Må leses i to omganger PC/MBR leser bare 1 Første byte er 8 mest signifiante bits Andre byte 8 minst signifiante bits Derfor: Shift på første 8 + OR Etterpå an vanlige ILOAD-μInstr. brues
GOTO Ubetinget hopp Ny PC = Gammel PC + offset Må derfor ta vare på gammel PC i OPCreg. Sett sammen 2 bytes offset (som WIDE)