680 likes | 810 Views
IS1200 Datorteknik. Föreläsning 3 Metoder / subrutiner Kursboken, valda delar av kapitel 4. Ö10. F10. Hemlab-3. Hemlab-2. Hemlab-1. Ö2. Ö1. Ö3. Ö5. Ö7. Ö8. Ö9. Ö6. Ö4. F1. F5. F7. F8. F4. F6. F9. F3. F2. Tentamen. LAB-2. LAB-3. LAB-1.
E N D
IS1200 Datorteknik Föreläsning 3 Metoder / subrutiner Kursboken, valda delar av kapitel 4 IS1200 Datorteknik, föreläsning 3
Ö10 F10 Hemlab-3 Hemlab-2 Hemlab-1 Ö2 Ö1 Ö3 Ö5 Ö7 Ö8 Ö9 Ö6 Ö4 F1 F5 F7 F8 F4 F6 F9 F3 F2 Tentamen LAB-2 LAB-3 LAB-1 IS1200 Datorteknikhttp://www.ict.kth.se/courses/IS1200 Assemblerkod 4 stegs pipeline Nios2time C-kod Nios2io Nios2int Cache-minnen CPU-scheduling IS1200 Datorteknik, föreläsning 3
Föreläsning 3Innehåll • 4-stegs PIPE-LINE, repetition • Nios-II, Instruktioner och -format • MACRO, pseudo-instruction,exempel • Load och Store med indexerad adress • Stack med SP samt PUSH och POP • Subrutiner, anrop, retur, parametrar • Activation Record, aktiveringsblock IS1200 Datorteknik, föreläsning 3
Litteraturhänvisningar • Kursboken, valda delar av kapitel 4 • 4.1 -- 4.3 principer, ej MIPS-kod • 4.5 Subrutiner och Stack IS1200 Datorteknik, föreläsning 3
Viktiga delar i en dator CPU BUS program I/O MEM data IS1200 Datorteknik, föreläsning 3
FETCH (update PC) (decode) EXECUTE Programexekveringi två steg IS1200 Datorteknik, föreläsning 3
Fetch Operand Write Back Fetch Instruction Register File 32 x 32 EXecute/ MEMory PC+k/PC+Imm Program Memory m x 8 Register File 32 x 32 Programexekveringi fyra steg ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp Cond IS1200 Datorteknik, föreläsning 3
Instruktioner i ”vår” 4-stegs CPU • ADD Rdst, RsrcA , RsrcB # SUB/AND/OR/XOR • ADDI Rdst, RsrcA , Imm # SUBI/ANDI/ORI/XORI • JMP / BR # ovillkorliga hopp • LDW Rdst , (Rsrc) # LOAD • STW Rsrc , (Rdst) # STORE • CMP RsrcA , RsrcB • CMPI RsrcA , Imm • BCond # villkorliga hopp • R0 = 0 ger ytterligare funktioner, NOP, CLR, COPY IS1200 Datorteknik, föreläsning 3
Innehåll i register r0 om det alltid är 0 • Det medför att • ADD r0, r0, r0 utför NOP, No OPeration • ADD rA, r0, r0 utför CLR rA, CLeaR reg • ADD rA, rB, r0 utför COPY rA rB, MOV • ADDI rA, rB, 0 utför ”MOV rA, rB” • ADDI rA, r0, Imm utför ”MOVI rA, Imm” • ... IS1200 Datorteknik, föreläsning 3
Instruktioner Nios-II-Instruktioner • MOV Rdst, Rsrc • MOVI Rdst, Imm16 # ADDI/SUBI • ADD Rdst, RsrcA , RsrcB # SUB/AND/OR/XOR • ADDI Rdst, RsrcA , Imm # SUBI/ANDI/ORI/XORI • BR / JMP / BCond • LDW Rdst , offset(Rsrc) # indexerad adress • STW Rsrc , offset(Rdst) # indexerad adress • CMPCond Rdst, RsrcA , RsrcB # CMPICond • Forts. IS1200 Datorteknik, föreläsning 3
Branch on ConditionNios-II-instructions • BEQ rA, rB, Label if rA==rB then PC:=PC+Imm16else PC:=PC+4 • Bcond rA, rB, Label if ”true” then PC:=PC+Imm16else PC:=PC+4 cond = EQ, NE, GT, GE, ... Label = PCBEQ + 4 + Imm16 Imm16 = Label - PCBEQ - 4 IS1200 Datorteknik, föreläsning 3
Macro-instructionPseudo-instruktion TYPEXEMPEL – MALL .macro NOP ADD r0, r0, r0 .endm Effekt: man kan använda en ny (pseudo-) instruktion NOP – No Operation – som inte gör något mer än att förbruka tid (case sensitive !!!) IS1200 Datorteknik, föreläsning 3
Macro-instructionPseudo-instruktion TYPEXEMPEL – MALL .macro CLR reg MOVI \reg, 0x0 .endm Effekt: man kan använda en ny (pseudo-) instruktion CLR %ri för att nollställa register %ri MOVI görs med ADDI !!! (case sensitive !!!) IS1200 Datorteknik, föreläsning 3
NEG reg Skriv makro för NEG-instruktion .macro NEG 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 !!!) IS1200 Datorteknik, föreläsning 3
SWAPR regA, regB (utmaning) Skriv makro för swap-instruktion med 2 register .macro SWAPR reg1, reg2XOR \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 ?) IS1200 Datorteknik, föreläsning 3
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 IS1200 Datorteknik, föreläsning 3
INSTRUKTIONSFORMAT Nios-II: R-type add rC, rA, rB #rC rA + rB A B C OPX OP 5 5 5 11 6 Andra exempel: sub, and, or, xor, ... IS1200 Datorteknik, föreläsning 3
INSTRUKTIONSFORMAT Nios-II: I-type addi rB, rA, IMM16 #rB rA + sext(IMM16) A B IMM16 OP 5 5 16 6 Andra exempel: subi, andi, ori, orhi, xori, ... IS1200 Datorteknik, föreläsning 3
INSTRUKTIONSFORMAT Nios-II: J-type call label #PC (PC31..28 :IMM26x4) IMM26 OP 26 6 Enda exempel: call !!! (och snart JMPI) IS1200 Datorteknik, föreläsning 3
ori rB, rA, IMM16 Instruktion i Nios-2, I-type ori rB, rA, IMM16 #rB rA | (0x0000:IMM16) A B IMM16 OP 5 5 16 6 Komplettera IMM16 med nollor i de 16 mest signifikanta bitarna. Gör or-operation med innehåll i rA Skriv resultat till rB IS1200 Datorteknik, föreläsning 3
orhi rB, rA, IMM16 Instruktion i Nios-2, I-type orhi rB, rA, IMM16 #rB rA | (IMM16:0x0000) A B IMM16 OP 5 5 16 6 Komplettera IMM16 med nollor i de 16 minst signifikanta bitarna. Gör or-operation med innehåll i rA Skriv resultat till rB IS1200 Datorteknik, föreläsning 3
Ladda ett register med ettkonstant 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!?) orhi rB, r0, %hi(Value) #fyller ut med nollor ori rB, rB, %lo(Value) #fyller ut med nollor IS1200 Datorteknik, föreläsning 3
Hjälp från översättaren %hi (value) %lo (value) = value32 Imm116 Imm216 orhi rB, r0, %hi(Value) #fyller ut med nollor ori rB, rB, %lo(Value) #fyller ut med nollor orhi rB, r0, Imm1 #fyller ut med nollor ori rB, rB, Imm2 #fyller ut med nollor IS1200 Datorteknik, föreläsning 3
MOVIA Rdest, Addr Nios-II macro Skriv makro för ladda register med 32 bitars värde .macro MOVI32 reg, value ORHI \reg, r0, %hi(\value)ORI \reg, \reg, %lo(\value) .endm OBS att inga registerinnehåll “förstörs” MOVIA är implementerad på annat (fel) sätt! IS1200 Datorteknik, föreläsning 3
Fetch Operand Write Back Fetch Instruction Register File 32 x 32 EXecute/ MEMory PC+k/PC+Imm Program Memory m x 8 Register File 32 x 32 LOAD och STOREi fyra stegs pipeline ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR IS1200 Datorteknik, föreläsning 3
LOAD och STOREi 4 stegs pipeline Vi kan utföra instruktionerna LDW Rdst, (Raddr) STW Rsrc , (Raddr) IS1200 Datorteknik, föreläsning 3
Behov av indexerad adress • Programvariabler ligger samlade • Ett register pekar ut variabelarean • Varje LOAD/STORE behöver först en adressberäkning med ADD • Indexerad adress LOAD R2 ← 8(R28) ; R2 ← hm(r28 + 8) • Sparar en klockcykel vid varje LOAD/STORE IS1200 Datorteknik, föreläsning 3
Programvariabler placerassamlade i minnet • Variabler int i; int j; int k; • läggs efter varanni minnet av kompilatorn minne i j k IS1200 Datorteknik, föreläsning 3
minne Ett register pekar ut variabelarean • Vid programstart tilldelas registret adressen till variabelarean i minnet • Global pointer är r26 i Nios-II i j register k r26 IS1200 Datorteknik, föreläsning 3
minne Varje LOAD/STORE behöver adressberäkning med ADD • k ska hämtas till R2 • R17 är ledigt • ADDI R17 <- R26 + 8 • LOAD R2 <- (R17) • En extra instruktion • En extra klockcykel • Extra krångel i programkoden i j register k r26 IS1200 Datorteknik, föreläsning 3
minne Indexerad adress • Addition i LOAD-instruktionen • LOAD R2 ← 8(R26) • innebärR2 ← hm(r26+8) • Innehåll i R26, plus talet 8, blir minnesadress i j register k r26 IS1200 Datorteknik, föreläsning 3
LOAD och STORE I Nios-II finns instruktionerna LDW Rdst, Offset (Raddr ) STW Rsrc , Offset( Raddr ) (De kan inte utföras i en 4 stegs pipeline utan behöver en 5 stegs pipeline som presenteras senare i kursen) IS1200 Datorteknik, föreläsning 3
Typisk hopp-instruktionJUMP (Raddr) • Kopiera registerinnehåll till PC • Register med 32 bitar betyder att32 bits adress kan användas • Hur får man 32 bits adress till registret ? • MOVIA Raddr , Imm32 eller motsvarande IS1200 Datorteknik, föreläsning 3
Nios-II hopp-instruktionJMP rA • Kopiera innehållet i angivet register till PC IS1200 Datorteknik, föreläsning 3
Om man vill kan man införaeget makro: JUMPA addr # Ladda ett 32 bitars värde till PC # Hopp med absolutadressering .macro JUMPA addrMOVIA r1, \addrJMP r1 .endm OBS att innehåll i reg r1 “förstörs” r1 kallas även “at” – assembler temporary IS1200 Datorteknik, föreläsning 3
Metoder, funktioner, subrutiner • Hur sker anrop ? • Med “hopp”-instruktion ! • Hur sker återhopp ? • Med “hopp”-instruktion ! • Returadress måste lagras ! Var ? • I register eller minne ! IS1200 Datorteknik, föreläsning 3
Subrutinanrop RUT: ADD … RETURN CALL RUT RET1: ADD … CALL RUT RET2: SUB ... IS1200 Datorteknik, föreläsning 3
Subrutinanrop i flera nvåer(nested procedures) RUT: ADD … CALL FKN RETURN FKN: MUL … CALL NEW RETURN CALL RUT RET1: ADD … CALL RUT RET2: SUB ... IS1200 Datorteknik, föreläsning 3
Subrutinanrop, rekursion RUT: ADD … CALL RUT RETURN CALL RUT RET1: ADD … CALL RUT RET2: SUB ... IS1200 Datorteknik, föreläsning 3
metoder, funktioner, subrutiner, Hur sker parameteröverföringVar lagras parametrar (register/minne) • från anropare till rutinen, inparametrar • från rutinen till anroparen, returvärden Olika typ av parameter • värde • pekare IS1200 Datorteknik, föreläsning 3
Nios-II hopp-instruktionCALLR rA Liknar JMP rA med tillägg att • Returadress sparas i register r31 Returadressen är adressen till instruktionen närmast efter CALLRdvs adress till CALLR ökat med 4 ! IS1200 Datorteknik, föreläsning 3
Om man vill kan man införaeget makro: CALLA addr # Subrutinanrop med absolutadressering .macro CALLA addrMOVIA r1, \addrCALLR r1 .endm # OBS att innehåll i reg r1 “förstörs” IS1200 Datorteknik, föreläsning 3
Nios-II hopp-instruktionCALL 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 IS1200 Datorteknik, föreläsning 3
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 IS1200 Datorteknik, föreläsning 3
STACKoperationer PUSH och POP PUSH op: SP sp - n mem(sp) op POP dst: dst mem(sp) SP sp + n n = antal bytes - Stack Pointer SP + IS1200 Datorteknik, föreläsning 3
Nios-II: PUSH reg # Pusha ett register på stacken .macro PUSH regSUBI sp, sp, 4 #sp = r27STW \reg, 0(sp) .endm # PUSH sp är inte bra IS1200 Datorteknik, föreläsning 3
Nios-II: POP reg # Poppa ett register från stacken .macro POP regLDW \reg,0(SP) ADDI sp, sp, 4 #sp = r27 .endm # POP sp är förödande IS1200 Datorteknik, föreläsning 3
Nios-II: StackReservera plats, initiera SP .equ size , 256 .data .align 2 stack: .fill size, 4, 0 ... .text … movia sp, stack+size*4 - stack: Stack Pointer SP + Behöver / SKA inte göras i laborationsprogramvaran ! IS1200 Datorteknik, föreläsning 3
Nios-II stöd för stack • Stack Pointer = r27 = sp • Finns det Stack-operationer ? Nej ! Jo! • LDW reg, offset(sp) • STW reg, offset(sp) • Ingen PUSH- eller POP-instruktion • Inga subrutinanrop och returhopp med returadress på stack IS1200 Datorteknik, föreläsning 3
Nios-II stöd för subrutiner • Anrop med CALLR reg, returadress i register r31 = ra • Retur med RETsom medför att r31 kopieras till PC • JMP r31 är “illegal” (och leder till exception) IS1200 Datorteknik, föreläsning 3