720 likes | 819 Views
2G1518 Datorteknik. Föreläsning 3 Metoder och subrutiner Kursboken, valda delar av kapitel 4 version vt 2005 för IT-1 och ME-3 m.fl. Föreläsning 3 Innehåll. 4-stegs PIPE-LINE, repetition MACRO, syntetisk instruktion MACRO-exempel Load och Store med indexerad adress
E N D
2G1518 Datorteknik Föreläsning 3 Metoder och subrutiner Kursboken, valda delar av kapitel 4 version vt 2005 för IT-1 och ME-3 m.fl. 2G1518, förel. 3, vt2005 (IT/ME)
Föreläsning 3Innehåll • 4-stegs PIPE-LINE, repetition • MACRO, syntetisk instruktion • MACRO-exempel • Load och Store med indexerad adress • Stack med SP samt PUSH och POP • Subrutiner, anrop, retur, parametrar, • Register Window 2G1518, förel. 3, vt2005 (IT/ME)
Viktiga delar i en dator CPU BUS program I/O MEM data 2G1518, förel. 3, vt2005 (IT/ME)
FETCH (update PC) (decode) EXECUTE Programexekveringi två steg 2G1518, förel. 3, vt2005 (IT/ME)
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 4 stegs PIPE-LINE ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR 2G1518, förel. 3, vt2005 (IT/ME)
Instruktioner Nios-Instruktioner • MOV Rdst, Rsrc • MOVI Rdst, Imm5 ;ADDI/SUBI • ADD Rdst, Rsrc ;SUB/AND/OR/XOR • CMP Rdst, Rsrc ;CMPI • BR / JMP / BEQ / BNE • LD Rdst, [Rsrc] • ST [Rdst], Rsrc 2G1518, förel. 3, vt2005 (IT/ME)
Mall för makro– en syntetisk instruktion .macro CLR reg MOVI \reg, 0x0 .endm Effekt: man kan använda en ny instruktion clr %ri för att nollställa register %ri 2G1518, förel. 3, vt2005 (IT/ME)
Nios INSTRUKTIONSFORMAT med immediate data MOVI RA, datan MOVI Exempelvis: 6 5 5 Hur många bitar behövs? ~6+5+5! Hur stor blir varje instruktion? 16! 2G1518, förel. 3, vt2005 (IT/ME)
Immediate dataär bara 5 bitar • En PreFiX-instruktion PFX införs • PFX modifierar efterföljande instruktion och ger den ett längre immediate-värde • PFX använder ett specialregister K • Principen med prefixinstruktioner finns även i Pentium-serien 2G1518, förel. 3, vt2005 (IT/ME)
MakrotMOVIA reg, Addr ; Ladda ett 32 bitars värde till ett register ; Värdet kan vara negativt .macro MOVIA reg, value PFX %hi(\value)MOVI \reg, %lo(\value)PFX %xhi(\value)MOVHI \reg, %xlo(\value) .endm 2G1518, förel. 3, vt2005 (IT/ME)
LOAD och STORE • Vi kan utföra instruktionerna LD Rdst, [ Raddr ] ST [ Raddr ], Rsrc 2G1518, förel. 3, vt2005 (IT/ME)
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 4 stegs PIPE-LINE ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR 2G1518, förel. 3, vt2005 (IT/ME)
LOADA Rdest, Addr Skriv makro för load med direkt adressering .macro LOADA reg, addr MOVIA \reg, \addrLD \reg, [\reg] .endm OBS att inga registerinnehåll “förstörs” 2G1518, förel. 3, vt2005 (IT/ME)
STOREA Addr, Rdest, Skriv makro för store med direkt adressering .macro STOREA addr, reg MOVIA %g7, \addrST [%g7], \reg .endm OBS att innehåll i reg %g7 “förstörs” 2G1518, förel. 3, vt2005 (IT/ME)
Programvariabler samlade i minnet • Variabler • int i; • int j; • int k; • läggs efter varanni minnet av kompilatorn minne i j k 2G1518, förel. 3, vt2005 (IT/ME)
minne Indexerad adress • Addition i LOAD-instruktionen • LOAD R2 ← 8(R28) • innebärR2 ← hm(r28+8) • Innehåll i R28, plus talet 8, blir minnesadress i j register k r28 2G1518, förel. 3, vt2005 (IT/ME)
LOAD och STORE • Vi vill alltså kunna utföra instruktionerna LOAD Rdst, Offset[ Raddr ] STORE Offset[ Raddr ], Rsrc 2G1518, förel. 3, vt2005 (IT/ME)
LOAD Rdst <- Offset[Raddr] • Vi kan utföra operationen LOAD Rdst, Offset[ Raddr ] • med koden (tar 2 klockcykler eller hur) ADDI Raddr, Offset LD Rdst, [ Raddr ] • OBS! Innehåll i Raddr ändras 2G1518, förel. 3, vt2005 (IT/ME)
STORE Offset[Raddr] <- Rsrc • Vi kan utföra operationen STORE Offset[ Raddr ], Rsrc • med koden (tar 2 klockcykler eller hur) ADDI Raddr, Offset ST [ Raddr ], Rsrc • OBS! Innehåll i Raddr ändras 2G1518, förel. 3, vt2005 (IT/ME)
LOAD Rdst <- Offset[Raddr]Nios-kod • Vi kan utföra operationen LOAD Rdst, Offset[ Raddr ] • med koden (tar ~6 klockcykler eller hur) MOVIA Raddr, addr32 ADDI Raddr, offset5 LD Rdst, [Raddr] • OBS! Innehåll i Raddr ändras 2G1518, förel. 3, vt2005 (IT/ME)
STORE Offset[Raddr] <- Rsrc Nios-kod • Vi kan utföra operationen STORE Offset[ Raddr] , Rsrc • med koden (tar ~6 klockcykler eller hur) MOVIA Raddr, addr32 ADDI Raddr, offset5 ST [Raddr], Rsrc • OBS! Innehåll i Raddr ändras 2G1518, förel. 3, vt2005 (IT/ME)
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 JUMP (Raddr)dataväg finns Dataväg ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR 2G1518, förel. 3, vt2005 (IT/ME)
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 BRA ImmnADDitionsenhet och datavägar finns ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR 2G1518, förel. 3, vt2005 (IT/ME)
Ovillkorligt hoppVillkorligt hopp • Ovillkorligt hopp utförs alltidExempel: JMP och BRA • Villkorligt hopp utförs endast om ett angivet villkor är santExempel Bcc där cc är villkoret • Exempel på villkorEQZ = EQual to ZeroNEZ = Not Equal to Zero 2G1518, förel. 3, vt2005 (IT/ME)
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 2G1518, förel. 3, vt2005 (IT/ME)
Nios hopp-instruktionJMP %rA • Skifta innehåll i register %rA ett steg åt vänster och kopiera till PC 2G1518, förel. 3, vt2005 (IT/ME)
Nios-MakrotJUMPA addr ; Ladda ett 32 bitars värde till PC ; Hopp med absolutadressering .macro JUMPA addrMOVIA %g7, \addr@hJMP %g7 .endm OBS att innehåll i reg %g7 “förstörs” 2G1518, förel. 3, vt2005 (IT/ME)
Hjälp från översättaren %xhi (value) %xlo (value) %hi (value) %lo (value) = value Imm211Imm25 Imm111Imm15 value@h = 31 MSBits 2G1518, förel. 3, vt2005 (IT/ME)
Typisk hopp-instruktionBR Immn • PC sätts till PC + Immn • Hur stor är Immn ? • Hur stor vill vi att Immn ska vara helst ? 2G1518, förel. 3, vt2005 (IT/ME)
Nios hopp-instruktionBR IMM11 • Skifta IMM11 ett steg vänster • gör Sign Extension • addera till aktuellt värde i PC • PC <- PC + 2 + (sext (IMM11) <<1) 2G1518, förel. 3, vt2005 (IT/ME)
Typisk instruktionCMP RsrcA, RsrcB • Jämför innehåll i RsrcA och RsrcB genom att • Subtrahera innehåll i RsrcB från RsrcA • men skriv ej resultat till något register • Information om resultatet / skillnadenlagras som informationi STATUS-flaggor 2G1518, förel. 3, vt2005 (IT/ME)
STATUS-flaggor • Z - Zero; ”utfall lika med noll” • N - Negativ; ”utfall med negativt tecken” • V - oVerflow; ”utfall med overflow” • C - Carry; Carry-ut från ALU • Påverkas av ADD, SUB, CMP ... 2G1518, förel. 3, vt2005 (IT/ME)
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 STATUS-flaggor ADD PC RWM true/false ALU op-code NVZC Logik för villkorligt hopp CCR 2G1518, förel. 3, vt2005 (IT/ME)
Villkorlig hopp-instruktionBcond Immn • PC sätts till PC + Immn om cond är sant • PC sätts till PC + nom 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 2G1518, förel. 3, vt2005 (IT/ME)
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.) 2G1518, förel. 3, vt2005 (IT/ME)
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 2G1518, förel. 3, vt2005 (IT/ME)
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 CMPI reg1, 0 ;jämför reg1 med noll IFS cc_eq ;om Z=1 BR Label ;hoppa till Label NOP 2G1518, förel. 3, vt2005 (IT/ME)
BEQ Label Skriv makro för villkorligt hopp BEQ .macro BEQ label IFS cc_eqBR \labelNOP .endm 2G1518, förel. 3, vt2005 (IT/ME)
Bxx Label Skriv makro-mall för villkorligt hopp Bxx .macro Bxx label IFS cc_xxBR \labelNOP .endm kan skrivas för xx: eq, ne, … (14 olika !) 2G1518, förel. 3, vt2005 (IT/ME)
cc_gt not(Zor(NxorV)) cc_le Zor(NxorV) cc_nv V = 0 cc_v V = 1 cc_hi not (C or Z) cc-la C or Z 14 olika villkor finns i Nios • cc_nc C = 0 • cc_c C = 1 • cc_nz Z = 0 • cc_z Z = 1 • cc_pl N = 0 • cc_mi N = 1 • cc_lt N xor V • cc_ge not(N xor V) 2G1518, förel. 3, vt2005 (IT/ME)
Alias för villkor i Nios • cc_cs = cc_c Carry Set = Carry • cc_n = cc_mi Negative = MInus • cc_cc = cc_nc Carry Clear = No Carry • cc_vc = cc_nv oVerflow Clear = No oVe... • cc_eq = cc_z Equal = Zero • cc_ne = cc_nz Not Equal = Not Zero • cc_vs = cc_v oVerflow Set = oVerflow • cc_p = cc_pl Plus = PLus 2G1518, förel. 3, vt2005 (IT/ME)
Nios instruktionIFRZ reg • Execute next instruction if register is Zero • Exempel: if (reg1==0) goto LabelIFRZ reg1 ;om reg1 = 0BR Label ;hoppa till LabelNOP • SKPRNZ är ekvivalent med IFRZ • Om nästa är en PFX så görs två nästa 2G1518, förel. 3, vt2005 (IT/ME)
Nios instruktionIFRNZ reg • Execute next instruction if register is Not Zero • Exempel: if (reg1 != 0) goto LabelIFRNZ reg1 ;om reg1 ej är 0BR Label ;hoppa till LabelNOP • SKPRZ är ekvivalent med IFRNZ • Om nästa är en PFX så görs två nästa 2G1518, förel. 3, vt2005 (IT/ME)
funktioner, subrutiner, metoder • Hur sker anrop ? • Med hoppinstruktion ! • Hur sker återhopp ? • Med hoppinstruktion ! • Returadress måste lagras ! Var ? 2G1518, förel. 3, vt2005 (IT/ME)
Subrutinanrop RUT: ADD … RETURN CALL RUT RET1: ADD … CALL RUT RET2: SUB ... 2G1518, förel. 3, vt2005 (IT/ME)
Subrutinanrop RUT: ADD … CALL FKN RETURN FKN: MUL … CALL NEW RETURN CALL RUT RET1: ADD … CALL RUT RET2: SUB ... 2G1518, förel. 3, vt2005 (IT/ME)
funktioner, subrutiner, metoder Hur sker parameteröverföringVar lagras parametrar • från anropare till rutinen, inparametrar • från rutinen till anroparen, returvärden Olika typ av parameter • värde • pekare 2G1518, förel. 3, vt2005 (IT/ME)
Nios hopp-instruktionBSR IMM11 • Liknar BR IMM11 med tilläggg att • Returadress sparas i register %R15/%o7 • Returadressen är adressen till instruktionen närmast efter hoppluckandvs adress till BSR ökat med 4 • Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15 2G1518, förel. 3, vt2005 (IT/ME)
Nios hopp-instruktionCALL %rA • Liknar JMP %rA med tillägg att • Returadress sparas i register %R15=%o7 • Returadressen är adressen till instruktionen närmast efter hoppluckandvs adress till CALL ökat med 4 ! • Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15/%o7 2G1518, förel. 3, vt2005 (IT/ME)
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 2G1518, förel. 3, vt2005 (IT/ME)