10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)1 2G1518 Datorteknik Föreläsning 3 Metoder / subrutiner Kursboken, valda delar av kapitel 4 vt 2007 (period 3-4) för E, I och CLMDA
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)2 F1F2F3F4F5F6F7F8F9F10Ö2Ö1Ö3Ö4Ö5LAB-1LAB-2Hemlab-1Ö6Ö7LAB-3Hemlab-2Ö8Hemlab-3Ö9TentamenÖ10 Assemblerkod 4 stegs pipeline Nios2time Nios2io C-kod Nios2int Cache-minnen CPU-scheduling 2G1518 Datorteknik
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)3 Föreläsning 3 Innehåll 4-stegs PIPE-LINE, repetition MACRO, pseudo-instruction Några MACRO-exempel Load och Store med indexerad adress Stack med SP samt PUSH och POP Subrutiner, anrop, retur, parametrar,
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)4 Litteraturhänvisningar &Kursboken, valda delar av kapitel 4 & principer, ej MIPS-kod &4.5 Subrutiner och Stack
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)5 Viktiga delar i en dator CPU MEM BUS I/O program data
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)6 Programexekvering i två steg (decode) EXECUTE FETCH (update PC)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)7 Programexekvering i fyra steg EXecute/ MEMory Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU ADD Register File 32 x 32 Register File 32 x 32 PC NVZC Logik för villkorligt hopp op-code Cond true/false PC+k/ PC+Imm RWM
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)8 Instruktioner Nios-II-Instruktioner èMOVR dst, R src èMOVIR dst, Imm 16 # ADDI/SUBI èADDR dst, R srcA, R srcB # SUB/AND/OR/XOR èADDIR dst, R srcA, Imm # SUBI/ANDI/ORI/XORI èBR / JMP / BCond èLDWR dst, (R src ) èSTWR src, (R dst ) èCMPCondRdst, RsrcA, RsrcB # CMPICond
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)9 Branch on Condition Nios-II-instructions BEQ rA, rB, Label if rA==rB then PC:=PC+Imm else PC:=PC+4 Bcond rA, rB, Label if ”true” then PC:=PC+Imm else PC:=PC+4 cond = EQ, NE, GT, GE,... Label = PC BEQ Imm Imm = Label - PC BEQ - 4
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)10 Macro-instruction Pseudo-instruktion TYPEXEMPEL – MALL.macroCLR reg MOVI\reg, 0x0.endm Effekt: man kan använda en ny (pseudo-) instruktion CLR %ri för att nollställa register %ri (case sensitive !!!)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)11 NEG reg Skriv makro för NEG-instruktion.macroNEG reg SUB\reg, r0, \reg.endm Effekt: man kan använda en ny (pseudo-) instruktion NEG rA, för att ta fram 2-komplementet av innehållet i ett register, rA (case sensitive !!!)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)12 SWAPR regA, regB (utmaning) Skriv makro för swap-instruktion med 2 register.macroSWAPR reg1, reg2 ADD\reg1, \reg1, \reg2...#här saknas en del...#icketrivial kod.endm Effekt: man kan använda en ny (pseudo-) instruktion SWAPR rA, rB för att byta plats på innehåll i rA och rB (begräsningar ?)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)13 Något om Nios-II Nios-II-processorn Varje instruktion i Nios-II upptar 32 bitar ! Det finns endast 3 olika instruktionsformat R-format I-format J-format
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)14 add rC, rA, rB#rC rA + rB INSTRUKTIONSFORMAT Nios-II: R-type ABOPXOPC Andra exempel: sub, and, or, xor,...
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)15 addi rB, rA, IMM16#rB rA + sext(IMM16) INSTRUKTIONSFORMAT Nios-II: I-type ABIMM16OP Andra exempel: subi, andi, ori, orhi, xori,...
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)16 call label#PC (PC :IMM26x4) INSTRUKTIONSFORMAT Nios-II: J-type 26 6 OPIMM26 Enda exempel: call !!!
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)17 ori rB, rA, IMM16 #rB rA | (0x0000:IMM16) ori rB, rA, IMM16 Instruktion i Nios-2, I-type ABIMM16OP Komplettera IMM16 med nollor i de 16 mest signifikanta bitarna. Gör or-operation med innehåll i rA Skriv resultat till rB
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)18 orhi rB, rA, IMM16 #rB rA | (IMM16:0x0000) orhi rB, rA, IMM16 Instruktion i Nios-2, I-type ABIMM16OP Komplettera IMM16 med nollor i de 16 minst signifikanta bitarna. Gör or-operation med innehåll i rA Skriv resultat till rB
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)19 Ladda ett register med ett konstant värde, Nios-II 16-bitars värde MOVI rB, IMMED movi r6, -30#sign extension to 32 bits ”movi is implemented as addi rB, r0, IMMED” 32-bitars värde MOVIA rB, Value#Value is any 32 bits might be implemented as (but it is not!?) orhirB, r0, %hi(Value)#fyller ut med nollor orirB, rB, %lo(Value) #fyller ut med nollor
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)20 Imm1 16 Hjälp från översättaren %hi (value) %lo (value) Imm2 16 = value orhirB, r0, %hi(Value)#fyller ut med nollor orirB, rB, %lo(Value) #fyller ut med nollor orhirB, r0, Imm1#fyller ut med nollor orirB, rB, Imm2 #fyller ut med nollor
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)21 MOVIA Rdest, Addr Nios-II macro Skriv makro för ladda register med 32 bitars värde.macroMOVIA reg, value ORHI\reg, r0, %hi(\value) ORI\reg, \reg, %lo(\value).endm OBS att inga registerinnehåll “förstörs”
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)22 LOAD och STORE i fyra stegs pipeline EXecute/ MEMory Fetch Operand Write Back Fetch Instruction Program Memory m x 8 ALU ADD Register File 32 x 32 Register File 32 x 32 PC NVZC Logik för villkorligt hopp op-code CCR true/false PC+k/ PC+Imm RWM
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)23 LOAD och STORE i 4 stegs pipeline Vi kan utföra instruktionerna LDWR dst, (R addr ) STW R src, (R addr )
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)24 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
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)25 Programvariabler samlade i minnet zVariabler int i; int j; int k; zläggs efter varann i minnet av kompilatorn minne i j k
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)26 Ett register pekar ut variabelarean zVid programstart tilldelas registret adressen till variabelarean i minnet zGlobal pointer är r26 i Nios-II minne i j k register r26
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)27 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 r26
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)28 Indexerad adress zAddition i LOAD- instruktionen zLOAD R2 ← 8(R26) zinnebär R2 ← hm(r26+8) zInnehåll i R26, plus talet 8, blir minnesadress minne i j k register r26
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)29 LOAD och STORE I Nios-II finns instruktionerna LDWR dst, Offset (R addr ) STW R src, Offset( R addr ) (De kan inte utföras i en 4 stegs pipeline utan behöver en 5 stegs pipeline som presenteras senare i kursen)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)30 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
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)31 Nios-II hopp-instruktion JMP rA zKopiera innehållet i angivet register till PC
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)32 Nios-II-Makrot JUMPA addr # Ladda ett 32 bitars värde till PC # Hopp med absolutadressering.macroJUMPA addr MOVIAr1, \addr JMPr1.endm OBS att innehåll i reg r1 “förstörs” r1 kallas även “at” – assembler temporary
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)33 Metoder, funktioner, subrutiner Hur sker anrop ? Med “hopp”-instruktion ! Hur sker återhopp ? Med “hopp”-instruktion ! Returadress måste lagras ! Var ? I register eller minne !
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)34 Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … RETURN
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)35 Subrutinanrop i flera nvåer (nested procedures) CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … CALL FKN RETURN FKN:MUL … CALL NEW RETURN
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)36 Subrutinanrop, rekursion CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … CALL RUT RETURN
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)37 metoder, funktioner, subrutiner, Hur sker parameteröverföring Var lagras parametrar (register/minne) zfrån anropare till rutinen, inparametrar zfrån rutinen till anroparen, returvärden Olika typ av parameter zvärde zpekare
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)38 Nios-II hopp-instruktion CALLR rA Liknar JMP rA med tillägg att Returadress sparas i register r31 Returadressen är adressen till instruktionen närmast efter CALLR dvs adress till CALLR ökat med 4 !
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)39 Nios-II-Makrot CALLA addr # Subrutinanrop med absolutadressering.macroCALLA addr MOVIAr1, \addr CALLRr1.endm # OBS att innehåll i reg r1 “förstörs”
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)40 Nios-II hopp-instruktion CALL Label Liknar CALLA med begränsning att Label måste ligga inom det 256MB område som anges av de 4 mest signifikanta bitarna i PC
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)41 Stackhantering Stack är speciell reserverad plats i minnet stack-pekare pekar på plats i stacken PUSH-operation, lägg på stack POP-operation, hämta från stack
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)42 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 + -
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)43 Nios-II: PUSH reg #Pusha ett register på stacken.macroPUSH reg SUBIsp, sp, 4#sp = r27 STW\reg, 0(sp).endm #PUSH sp är inte bra
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)44 Nios-II: POP reg #Poppa ett register från stacken.macroPOP reg LDW\reg,0(SP) ADDIsp, sp, 4#sp = r27.endm # POP sp är förödande
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)45 Nios-II: Stack Reservera plats, initiera SP Stack Pointer SP.equ size, 256.data.align2 stack:.fill size, 4, 0....text … movia sp, stack+size*4 + - stack: Behöver inte göras i laborationsprogramvaran !
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)46 Nios-II stöd för stack Stack Pointer = r27 = sp Finns det Stack-operationer ? LDW reg, offset(sp) STW reg, offset(sp) Ingen PUSH- eller POP-instruktion Inga subrutinanrop och returhopp med returadress på stack
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)47 Nios-II stöd för subrutiner Anrop med CALLR reg, returadress i register r31 = ra Retur med RET som medför att r31 kopieras till PC JMP r31 är “illegal” (och leder till exception)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)48 Allmänt 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)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)49 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)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)50 Exempel på parameteröverföring Nios-II: i r2-r3 och r4-r7 Anroparen lagrar parametrar i r4-r7 Anroparen gör CALL eller CALLR varvid returadress sparas i r31 Parametrar finns i r4-r7 Det finns 8 ”lediga” register, r8-r15 Returvärde ska placeras i r2-r3 Returadress i r31, retur ska göras med RET
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)51 Anrop av subrutin från subrutin Viktiga registerinnehåll måste skyddas Stacken används för att skydda register. Speciellt returadress i ra måste skyddas Anroparen, caller, har ansvar för register r8-r15 caller saved. De får förstöras av den anropade. Den anropade, callee, har ansvar att inte förändra innehåll i r16-r23, callee saved Parametrar i r2-r3 och r4-r7 måste hanteras rätt
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)52 Programexempel - subrutin ta fram max av val1 och val2 zExempel på C-liknande kod torde kunna vara... int val1, val2, result; /* variabler */... extern int max (int val1, int val2); /* prototyp */... result = max ( val1, val2); /* anrop */
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)53 Programexempel - subrutin ta fram max av val1 och val2 zint val1=0, val2=0, result=0; kan översättas till (av kompilator).data.align2#adress multipel av 2 2 val1:.word0 val2:.word0 result:.word0...
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)54 anrop av max (val1, val2) inparametrar i register #result = max ( val1, val2) kan översättas till.text moviar4, val1# adress till val1 i r4 ldwr4, 0(r4)# värde val1 till r4 från minnet moviar5, val2# adress till val2 i r5 ldwr5, 0(r5) # värde val2 till r5 från minnet movia r1, max# subrutin-adress till ett register callrr1# anropa subrutin moviar1, result# adress till result i r1 stwr2, 0(r1)# returvärde i r2 kopieras till minnet
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)55 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)
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)56 int max (int val1, int val2) inparametrar i register max:movr2, r4# kopiera r4 till returplats bgtr4, r5, foo# hoppa om r4 > r5 movr2, r5# bara om r5 >=r4 foo:ret# PC := r31
10 June G1518, föreläsning 3, vt2007 (E/I/CLMDA)57 Föreläsning 3 Innehåll 4-stegs PIPE-LINE, repetition MACRO, pseudo-instruction Några MACRO-exempel Load och Store med indexerad adress Stack med SP samt PUSH och POP Subrutiner, anrop, retur, parametrar,