1 June 20152G1502, föreläsning 3, vt G1502 Datorteknik allmän kurs Föreläsning 3 Metoder och subrutiner Kursboken, valda delar av kapitel 4 version vt 2004 för E och I
1 June 20152G1502, föreläsning 3, vt20042 Innehåll z4-stegs PIPE-LINE zLoad och Store mot Minne z5-stegs PIPE-LINE zNios hårdvara för hopp zSubrutiner, anrop, retur, stack zRegister Window zParameteröverföring
1 June 20152G1502, föreläsning 3, vt20043 Programexekvering i två steg (decode) EXECUTE FETCH (update PC)
1 June 20152G1502, föreläsning 3, vt20044 Hårdvara i processorn Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU IR PC +n Register File 32 x 32 Register File 32 x 32 32
1 June 20152G1502, föreläsning 3, vt20045 PIPE - LINE införs nu ! Flera register IR Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU IR0 IR1 IR2 NYTT PC +n Register File 32 x 32 Register File 32 x 32
1 June 20152G1502, föreläsning 3, vt20046 Fenomen pga PIPE-LINE Data Dependencies zProgramexempel 44:ADD R1 <- R2 + R3 48:ADD R4 <- R5 + R6 52:ADD R7 <- R1 + R4 z”nya” R1 och R4 finns inte i REG-FILE
1 June 20152G1502, föreläsning 3, vt20047 Data Forward inför nya data-vägar Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU IR0 IR1 IR2 Register File 32 x 32 Register File 32 x 32 52: R7 <- R1+R4 44: R4 <- R5+R6 48: R1 <- R2+R3 NYTT
1 June 20152G1502, föreläsning 3, vt20048 ADDI R A, data n ADDI Hur många bitar behövs? ~6+5+5! Hur stor blir varje instruktion? 16! Nios INSTRUKTIONSFORMAT med immediate data Exempelvis: 6 5 5
1 June 20152G1502, föreläsning 3, vt20049 Immediate data inför nya datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU PC IR0 IR1 IR2 +n Ny dataväg Register File 32 x 32 Register File 32 x 32
1 June 20152G1502, föreläsning 3, vt Immediate data är bara 5 bitar zEn PreFiX-instruktion PFX införs zPFX modifierar efterföljande instruktion och ger den ett längre immediate-värde zPFX använder ett specialregister K zPrincipen med prefixinstruktioner finns även i Pentium-serien R
1 June 20152G1502, föreläsning 3, vt Inför ny hårdvara K - register Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU ADD IR0 IR1 IR2 Register File 32 x 32 Register File 32 x 32 PC+2 PC+Imm PC
1 June 20152G1502, föreläsning 3, vt Hur används register K ? zPreFiX-instruktionen PFX Imm 11 skriver ett 11 bitars värde till register K zInstruktionen direkt efter PFX Imm 11 använder innehåll i K – sedan nollställs register K zImm 5 ökar till (Imm 11 cat Imm 5 ) R
1 June 20152G1502, föreläsning 3, vt PFX Imm 11 FIPFX - - PFX IMM 11 MOVI R dst, Imm 5 FIFOEXEWB
1 June 20152G1502, föreläsning 3, vt Mall för makro – en syntetisk instruktion.macroCLR reg MOVI\reg, 0x0.endm Effekt: man kan använda en ny instruktion clr %ri för att nollställa register %ri R
1 June 20152G1502, föreläsning 3, vt ADD Rdest, regA, regB Skriv makro för add-instruktion med 3 register.macroADD reg1, reg2, reg3 MOV\reg1, \reg2 ADD\reg1, \reg3.endm R
1 June 20152G1502, föreläsning 3, vt Makrot MOVIA reg, Addr ;Ladda ett 32 bitars värde till ett register ;Värdet kan vara negativt.macroMOVIA reg, Addr PFX%hi(\Addr) MOVI\reg, %lo(\Addr) PFX%xhi(\Addr) MOVHI\reg, %xlo(\Addr).endm R
1 June 20152G1502, föreläsning 3, vt JUMP (R addr ) inför nya datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU PC IR0 IR1 IR2 +n Ny dataväg Register File 32 x 32 Register File 32 x 32
1 June 20152G1502, föreläsning 3, vt BRA Imm n inför ADDitionsenhet och datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU ADD IR0 IR1 IR2 Register File 32 x 32 Register File 32 x 32 PC PC+4 PC+Imm
1 June 20152G1502, föreläsning 3, vt Fenomen pga PIPE-LINE Branch Delay Slot Instruktionen i minnespositionen närmast efter en hoppinstruktion kommer utföras innan hoppet verkställs Programexempel 16: BRA 64 20: ADD … 24: … … 84: SUB...
1 June 20152G1502, föreläsning 3, vt LOAD och STORE zVi vill kunna utföra instruktionerna LOADR dst, [ R addr ] STORE [ R addr ], R src
1 June 20152G1502, föreläsning 3, vt Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU ADD IR0 IR1 IR2 RWM LOAD och STORE med 4 stegs PIPE-LINE Register File 32 x 32 Register File 32 x 32 PC+4 PC+Imm PC
1 June 20152G1502, föreläsning 3, vt LOAD och STORE med 4 stegs PIPE-LINE LOAD to Rd USE Rd FIFO MEM WBFIFOEXEWB Data från MEM finns tillgängligt Data från MEM finns tillgängligt för FO tack vare Data Forward
1 June 20152G1502, föreläsning 3, vt Behov av indexerad adress zProgramvariabler ligger samlade zEtt register pekar ut variabelarean zVarje LOAD/STORE behöver först en adressberäkning med ADD zIndexerad adress LOAD R2 ← 8(R28); R2 ← hm(r28 + 8) zSparar en klockcykel vid varje LOAD
1 June 20152G1502, föreläsning 3, vt Programvariabler samlade i minnet zVariabler yint i; yint j; yint k; zläggs efter varann i minnet av kompilatorn minne i j k
1 June 20152G1502, föreläsning 3, vt Ett register pekar ut variabelarean zVid programstart tilldelas registret adressen till variabelarean i minnet minne i j k register r28
1 June 20152G1502, föreläsning 3, vt Varje LOAD/STORE behöver adressberäkning med ADD zk ska hämtas till R2 zR17 är ledigt ADDI R17 <- R LOAD R2 <- (R17) zEn extra instruktion zEn extra klockcykel zExtra krångel i programkoden minne i j k register r28
1 June 20152G1502, föreläsning 3, vt Indexerad adress zAddition i LOAD- instruktionen zLOAD R2 ← 8(R28) zinnebär R2 ← hm(r28+8) zInnehåll i R28, plus talet 8, blir minnesadress minne i j k register r28
1 June 20152G1502, föreläsning 3, vt Sparar en klockcykel vid varje LOAD zadd följt av load byts mot zload med "inbyggd" addition addi r17←r28+8 load r2←(r17) FIFO EXE WB FIFO MEM WB load r2←8(r17) FIFOALUWB MEM
1 June 20152G1502, föreläsning 3, vt LOAD och STORE zVi vill alltså kunna utföra instruktionerna LOADR dst, Offset[ R addr ] STOREOffset[ R addr ], R src
1 June 20152G1502, föreläsning 3, vt LOAD Rdst <- Offset[Raddr] zVi kan utföra instruktionen LOADR dst, Offset[ R addr ] zmed koden (tar 2 klockcykler eller hur) ADDIR adr, Offset LOADR dst, [ R addr ]
1 June 20152G1502, föreläsning 3, vt STORE Offset[Raddr] <- Rsrc zVi kan utföra instruktionen STOREOffset[ R addr ], R src zmed koden (tar 2 klockcykler eller hur) ADDIR adr, Offset ST[ R addr ], R src
1 June 20152G1502, föreläsning 3, vt stegs PIPE-LINE ALUFetch OperandMEMFetch Instruction Register File 32 x 32 Register File 32 x 32 Program Memory m x 8 ALU Register File 32 x 32 Register File 32 x 32 PC ADD IR0 IR1 IR2 RWM IR3 Write Back +n
1 June 20152G1502, föreläsning 3, vt Programexekvering i fem steg zFI- Fetch Instruction zFO - Fetch Operand zALU - Calculation zMEM - Memory Reference zWB - Write Back
1 June 20152G1502, föreläsning 3, vt stegs PIPE-LINE LOAD FIFOALUWB MEM FIFOALUWB MEM ADD Hur lång tid tar en instruktion ? 5 cykler Antal cykler per instruktion, CPI ? 1 cykel! Antal instruktioner per cykel ? 1 instruktion !
1 June 20152G1502, föreläsning 3, vt Fenomen pga PIPE-LINE 3. Load Delay LOAD to Rd FIFOALUWB MEM FIFOALUWB MEM Rd tillgängligt från minne Rd önskas till ALU-reg men finns inte tillgängligt USE Rd
1 June 20152G1502, föreläsning 3, vt Load DELAY även vid Data Forward LOAD FIFOALUWB MEM ADD Tillgängligt från minne FIFOALUWB MEM Skriv till ALU-reg Data Forward fungerar FIFOALUWB MEM NOP?
1 June 20152G1502, föreläsning 3, vt Slut på ”repetitionen” Nu kommer en hel del om hopp med mera Speciellt för Nios-processorn
1 June 20152G1502, föreläsning 3, vt Programmering med hopp zHopp = ett värde skrivs till PC zEffektivadress skrivs till PC zOlika adresseringsmetoder finns zJUMP Label brukar använda absolut adress zBRA Label brukar använda PC-relativ adress
1 June 20152G1502, föreläsning 3, vt Ovillkorligt hopp Villkorligt hopp zOvillkorligt hopp utförs alltid Exempel: JMP och BRA zVillkorligt hopp utförs endast om ett angivet villkor är sant Exempel Bcc där cc är villkoret zExempel på villkor EQZ = EQual to Zero NEZ = Not Equal to Zero
1 June 20152G1502, föreläsning 3, vt JUMP och BRA Ovillkorliga hopp z JUMP brukar ha direkt adress z BRA brukar ha PC-relativ adress JMP 104 ;PC := 104”hopp till 104”. BRA 40 ;PC := pc + 40”hopp till 268” 32: 104: 224: 268:
1 June 20152G1502, föreläsning 3, vt Typisk hopp-instruktion JUMP Label Absolut adressering Läget Label motsvarar en binär adress Kopiera Label till PC Om PC har 32 bitar bör Label vara 32 bitar Adressen Label lagras i instruktionen
1 June 20152G1502, föreläsning 3, vt Typisk hopp-instruktion BRA Label PC-relativ adressering Läget Label motsvarar en binär adress Före körning beräknar assemblern hur långt från instruktionen Label finns Avståndet lagras i instruktionen som displacement eller offset Vid körning adderas offset till PC offset kan vara positivt eller negativt
1 June 20152G1502, föreläsning 3, vt Typisk hopp-instruktion JUMP (R addr ) zKopiera registerinnehåll till PC zRegister med 32 bitar betyder att 32 bits adress kan användas zHur får man 32 bits adress till registret ? zMOVIA R addr, Imm 32 eller motsvarande
1 June 20152G1502, föreläsning 3, vt Nios hopp-instruktion JMP %rA zSkifta innehåll i register %rA ett steg åt vänster och kopiera till PC
1 June 20152G1502, föreläsning 3, vt Nios JMP %rA inför nya datavägar Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 Register File 32 x 32 PC IR0 IR1 IR2 +2
1 June 20152G1502, föreläsning 3, vt Nios hårdvara för JMP %rA 32 bitar från ”A-busen” Program Counter 0 ignoreras
1 June 20152G1502, föreläsning 3, vt Typisk hopp-instruktion BR Imm n zPC sätts till PC + Imm n zHur stor är Imm n ? zHur stor vill vi att Imm n ska vara helst ?
1 June 20152G1502, föreläsning 3, vt Nios hopp-instruktion BR IMM11 zSkifta IMM11 ett steg vänster zgör Sign Extension zaddera till aktuellt värde i PC zPC <- PC (sext (IMM11) <<1)
1 June 20152G1502, föreläsning 3, vt BRA Imm n inför ADDitionsenhet och datavägar Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 Register File 32 x 32 PC ADD IR0 IR1 IR2 +2
1 June 20152G1502, föreläsning 3, vt Nios hårdvara för BR IMM IR0 PC ADD IMM11: 11 bitar från IR0 Sign Extension
1 June 20152G1502, föreläsning 3, vt Typisk instruktion SUBR dst, R srcA, R srcB zSubtrahera innehåll i R srcA från R srcB zoch skriv till R dst zFörutom resultatet / skillnaden zså lagras ytterligare information zi STATUS-flaggor
1 June 20152G1502, föreläsning 3, vt Typisk instruktion CMPR srcA, R srcB zJämför innehåll i R srcA och R srcB genom att zSubtrahera innehåll i R srcA från R srcB zmen skriv ej resultat till något register zInformation om resultatet / skillnaden lagras som information i STATUS-flaggor
1 June 20152G1502, föreläsning 3, vt STATUS-flaggor zZ - Zero; ”utfall lika med noll” zN - Negativ; ”utfall med negativt tecken” zV - oVerflow; ”utfall med overflow” zC - Carry; Carry-ut från ALU zPåverkas av ADD, SUB, CMP...
1 June 20152G1502, föreläsning 3, vt STATUS -flaggor Execute Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU PC ADD IR0 IR1 IR2 +n NVZC Register File 32 x 32 Register File 32 x 32
1 June 20152G1502, föreläsning 3, vt Gäller detta för Nios-Processorn ? R0 R31 R1 PC Minne Generella registerProgramräknare NVZC Status
1 June 20152G1502, föreläsning 3, vt Villkorlig hopp-instruktion Bcond Imm n PC sätts till PC + Imm n om cond är sant PC sätts till PC + n om cond är falskt (n är antal bytes per instruktion) Nios har ingen instruktion Bcond Imm Det måste finnas minst en villkorlig instruktion för att klara en IF-sats
1 June 20152G1502, föreläsning 3, vt Nios har villkorlig instruktion IFS cc_IMM4 IFS - Conditionally execute next instruction Om villkoret är sant utförs nästa instr. Om villkoret är falskt skippas nästa instruktion (Om nästa är en PFX så skippas 2 instr.)
1 June 20152G1502, föreläsning 3, vt Nios har villkorlig instruktion SKPS cc_IMM4 SKPS - Skip On Condition Code Om villkoret är sant skippas nästa instr. (Om nästa är en PFX så skippas 2 instr.) Om villkoret är falskt utförs nästa instruktion
1 June 20152G1502, föreläsning 3, vt IFS cc_IMM4 SKPS cc_IMM4 cc_IMM4 kan väljas bland 14 olika cc_eq, cc_ne, cc_lt osv. enligt tabell Program-exempel: if (reg1==0) goto Label CMPIreg1, 0;jämför reg1 med noll IFScc_eq;om Z=1 BRLabel;hoppa till Label
1 June 20152G1502, föreläsning 3, vt olika villkor finns i Nios zcc_ncC = 0 zcc_cC = 1 zcc_nzZ = 0 zcc_zZ = 1 zcc_plN = 0 zcc_miN = 1 zcc_ltN xor V zcc_ge not(N xor V) z cc_gt not(Zor(NxorV)) z cc_le Zor(NxorV) z cc_nvV = 0 z cc_vV = 1 z cc_hinot (C or Z) z cc-laC or Z
1 June 20152G1502, föreläsning 3, vt Alias för villkor i Nios zcc_cs = cc_cCarry Set = Carry zcc_n = cc_miNegative = MInus zcc_cc = cc_ncCarry Clear = No Carry zcc_vc = cc_nvoVerflow Clear = No oVe... zcc_eq = cc_zEqual = Zero zcc_ne = cc_nzNot Equal = Not Zero zcc_vs = cc_voVerflow Set = oVerflow zcc_p = cc_plPlus = PLus
1 June 20152G1502, föreläsning 3, vt Nios instruktion IFRZ reg zExecute next instruction if register is Zero zExempel: if (reg1==0) goto Label IFRZreg1;om reg1 = 0 BRLabel;hoppa till Label zSKPRNZ är ekvivalent med IFRZ zOm nästa är en PFX så görs två nästa
1 June 20152G1502, föreläsning 3, vt Nios instruktion IFRNZ reg zExecute next instruction if register is Not Zero zExempel: if (reg1 != 0) goto Label IFRNZreg1;om reg1 ej är 0 BRLabel;hoppa till Label zSKPRZ är ekvivalent med IFRNZ zOm nästa är en PFX så görs två nästa
1 June 20152G1502, föreläsning 3, vt Nios instruktion NOP = No OPeration Binärkod för NOP = Det är samma binärkod som för MOV %r0, %r0 Vad gör MOV %r0,%r0 ? (tar tid)
1 June 20152G1502, föreläsning 3, vt funktioner, subrutiner, metoder zHur sker anrop ? zMed hoppinstruktion ! zHur sker återhopp ? zMed hoppinstruktion ! zReturadress måste lagras !
1 June 20152G1502, föreläsning 3, vt Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … RETURN
1 June 20152G1502, föreläsning 3, vt Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … CALL FKN RETURN FKN:MUL … CALL NEW RETURN
1 June 20152G1502, föreläsning 3, vt funktioner, subrutiner, metoder Hur sker parameteröverföring Var lagras parametrar zfrån anropare till rutinen, inparametrar zfrån rutinen till anroparen, returvärden Olika typ av parameter zvärde zpekare
1 June 20152G1502, föreläsning 3, vt Nios hopp-instruktion BSR IMM11 zLiknar BR IMM11 med tilläggg att zReturadress sparas i register %R15 zReturadressen är adressen till zinstruktionen närmast efter hoppluckan zdvs adress till BSR ökat med 4 zReturadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15
1 June 20152G1502, föreläsning 3, vt Nios hopp-instruktion CALL %rA zLiknar JMP %rA med tillägg att zReturadress sparas i register %R15=%o7 zReturadressen är adressen till instruktionen närmast efter hoppluckan dvs adress till CALL ökat med 4 ! zReturadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15
1 June 20152G1502, föreläsning 3, vt Nios hårdvara för BSR och CALL 0 PC A-bus till ALU-A register 32 bitar från PC ignoreras... A-bus till ALU-A register
1 June 20152G1502, föreläsning 3, vt Stackhantering zStack är speciell reserverad plats i minnet zStack Pekare pekar på plats i stacken zPUSH-operation, lägg på stack zPOP-operation, hämta från stack
1 June 20152G1502, föreläsning 3, vt STACK operationer PUSH och POP Stack Pointer SP PUSH op: SP <- sp - n mem(sp) <- op POPdst: dst <- mem(sp) SP <- sp + n n = antal bytes + -
1 June 20152G1502, föreläsning 3, vt Nios: PUSH reg ;Pusha ett register på stacken.macroPUSH reg SUBI%sp, 4;%sp = %o6 ST[%sp], \reg.endm ;PUSH %o6 är inte bra
1 June 20152G1502, föreläsning 3, vt Nios: POP reg ;Poppa ett register från stacken.macroPOP reg LD \reg, [%sp] ADDI%sp, 4;%sp = %o6.endm ;POP %o6 är förödande
1 June 20152G1502, föreläsning 3, vt Nios: Stack Reservera plats, initiera SP Stack Pointer SP.equ size, 256.data.align4 stack:.fill size, 4, 0....text … movia %sp, stack+size*4 + - stack:
1 June 20152G1502, föreläsning 3, vt Nios stöd för stack zStack Pointer = %r14 = %sp (alias %o6) zFinns det Stack-operationer ? zLDS är LOAD R dst <- [%sp, IMM8] zSTS är STORE [%sp,IMM8] <- R src med flera variationer zIngen PUSH- eller POP-instruktion zIngen JSR/RTS med returadress på stack
1 June 20152G1502, föreläsning 3, vt Nios stöd för subrutiner Anrop med CALL reg, returadress i register %r15 = %o7 innehållet i reg multipliceras med 2 innan det skrivs till PC, jämför med JMP reg Anrop med BSR Label Retur med RET (JMP %r31 alias %i7) Retur med LRET (JMP %r15 alias %o7)
1 June 20152G1502, föreläsning 3, vt Returadress vid subrutinanrop zI ett speciellt register (fördel/nackdel) zI valfritt register (fördel/nackdel) zI minnet på speciell plats (fördel/nackdel) zI minnet på valfri plats (fördel/nackdel) zI minnet på en stack med PUSH (fördel/nackdel) zI första ordet i subrutinen (fördel/nackdel)
1 June 20152G1502, föreläsning 3, vt Register Window Vad? Hur? Varför?
1 June 20152G1502, föreläsning 3, vt Register Window z32 registers are direct available z%g0-%g7 = %r0 -%r7; Global regs z%o0-%o7 = %r8 -%r15; Out regs z%L0-%L7 = %r16-%r23; Local regs z%i0-%i7 = %r24-%r31; In regs
1 June 20152G1502, föreläsning 3, vt Register Window z32 registers are direct available z128 or 256 or 512 possible registers zCWP - Current Window Pointer anger vilka register som just nu är direkt åtkomliga zCWP finns i statusregister %ctl0 !
1 June 20152G1502, föreläsning 3, vt Register Window zCWP = Current Window Pointer zSAVE ”öppna nytt fönster” minska CWP med 1 zRESTORE ”byt till gammalt fönster” öka CWP med 1
1 June 20152G1502, föreläsning 3, vt Table 20. Smallest Nios Register File Reg[.. Reg[24..31] Reg[16..23] Reg[8..15] Reg[ ] Reg[ ] Reg[ ] Reg[0..7] %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 SAVE RESTORE CWP = 0 CWP = 1 CWP = 5 CWP = 6 CWP = 4 CWP = 2
1 June 20152G1502, föreläsning 3, vt Exempel på subrutinkod utan SAVE och RESTORE nästlat subrutinanrop går ej RUT:kod kod ;BSR RUT2;subrutinanrop nix … LRET;JMP %07
1 June 20152G1502, föreläsning 3, vt RUT:SAVE %sp,0;ändra inte %sp kod BSR RUT2;fungerar … RET;JMP %i7 RESTORE;i hopplucka Exempel på subrutinkod med SAVE och RESTORE nästlat subrutinanrop går bra
1 June 20152G1502, föreläsning 3, vt Parameterplats till och från subrutin zI register (fördel/nackdel) zI minnet på fast adress (fördel/nackdel) zI minnet på en stack (fördel/nackdel)
1 June 20152G1502, föreläsning 3, vt Exempel på parameteröverföring med SAVE och RESTORE zAnroparen lagrar parametrar i %o-register (utom %o7) zAnroparen gör BSR eller CALL varvid returadress sparas i %o7 zSubrutinen gör SAVE varvid alla %oreg hamnar på platser %ireg zReturadress finns nu i %i7 zParametrar finns nu i %i-register zDet finns 16 ”nya” register, 8 st %Local och 8 st %Out zSubrutinen gör RESTORE zReturadress finns nu i %o7 varvid retur ska göras med JMP %o7 (samma som LRET)
1 June 20152G1502, föreläsning 3, vt Programexempel - subrutin ta fram max av val1 och val2 zExempel på C-kod torde kunna vara... int val1, val2, result; /* variabler */... int max (int val1, int val2); /* prototyp */... result = max ( val1, val2); /* anrop */
1 June 20152G1502, föreläsning 3, vt Programexempel - subrutin ta fram max av val1 och val2 zint val1, val2, result; kan översättas till (av kompilator).data val1:.word0 val2:.word0 result:.word0...
1 June 20152G1502, föreläsning 3, vt anrop av max (val1, val2) inparametrar i register ;result = max ( val1, val2) kan översättas till.text movia%L0, val1 ld%o0, [%L0];parameter val1 i %o0 movia%L0, val2 ld%o1, [%L0] ;parameter val2 i %o1 movia %L0, till ett register call%L0;ea i register nop movia%L0, result st[%L0], %o0;returvärde i %o0
1 June 20152G1502, föreläsning 3, vt anrop av max (val1, val2) inparametrar på stack ;result = max ( val1, val2);.text movia%L0, val2 ld%L1, [%L0] push%L1;inparameter val2 till stack movia%L0, val1 ld%L1, [%L0] push%L1;inparameter val1 till stack bsrmax;PC-relativ adress nop addi%sp, 8;rensa stacken från parametrar movia%L0, result st[%L0], %o0;kopiera returvärde i %o0 till minnet
1 June 20152G1502, föreläsning 3, vt Programexempel - subrutin ta fram max av val1 och val2 int max (int val1, int val2); { int tmp; tmp = val1; if (val2 > val1 ) tmp = val2; return (tmp); } kan översättas till (kompileras till)
1 June 20152G1502, föreläsning 3, vt int max (int val1, int val2) inparametrar i register max:cmp%o0, %01 ifscc_lt mov%o0, %o1 lret;jmp %o7
1 June 20152G1502, föreläsning 3, vt int max (int val1, int val2) inparametrar på stack max:save %sp, 0;nytt reg-window lds%i0, [%sp, 1 ];val2 till %i0 lds%L0, [%sp, 0];val1 till %L0 cmp%i0, %L0 ifscc_lt;om val2 < val1 mov%i0, %L0;val1 till %i0 ret;jmp %i7 restore;”stäng fönster”
1 June 20152G1502, föreläsning 3, vt Föreläsning 3 Sammanfattning z4-stegs PIPE-LINE zLoad och Store mot Minne z5-stegs PIPE-LINE zNios hårdvara för hopp zSubrutiner, anrop, retur, stack zRegister Window zParameteröverföring