April 19, 2023 2G1518, föreläsning 3, vt2005 1
2G1518 Datorteknik
Föreläsning 3Metoder och subrutiner
Kursboken, valda delar av kapitel 4
version vt 2005för E och I m.fl.
April 19, 2023 2G1518, föreläsning 3, vt2005 2
Föreläsning 3Innehåll
4-stegs PIPE-LINE, repetitionMACRO, syntetisk instruktionMACRO-exempelLoad och Store med indexerad adressStack med SP samt PUSH och POPSubrutiner, anrop, retur, parametrar, Register Window
April 19, 2023 2G1518, föreläsning 3, vt2005 4
Programexekveringi två steg
(decode)EXECUTE
FETCH(update PC)
April 19, 2023 2G1518, föreläsning 3, vt2005 5
Programexekveringi fyra steg
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 6
Instruktioner Nios-Instruktioner
MOV Rdst, Rsrc
MOVI Rdst, Imm5 ;ADDI/SUBI
ADDRdst, Rsrc ;SUB/AND/OR/XOR
CMPRdst, Rsrc ;CMPIBR / JMP / BEQ / BNE LD Rdst, [Rsrc]
ST [Rdst], Rsrc
April 19, 2023 2G1518, föreläsning 3, vt2005 7
Mall för makro– en syntetisk instruktion
.macro CLR regMOVI\reg, 0x0.endm
Effekt: man kan använda en ny instruktionclr %ri för att nollställa register %ri
April 19, 2023 2G1518, föreläsning 3, vt2005 8
ADD Rdest, regA, regB
Skriv makro för add-instruktion med 3 register.macro ADD3 reg1, reg2, reg3MOV \reg1, \reg2ADD \reg1, \reg3
.endmEffekt: man kan använda en ny instruktionADD3 %rk, %rj, %ri för att skriva summan av
%ri och %rj till %rk
April 19, 2023 2G1518, föreläsning 3, vt2005 9
SWAPR regA, regB
Skriv makro för swap-instruktion med 2 register.macro SWAPR reg1, reg2ADD \reg1, \reg2... ;här saknas en del... ;icketrivial kod
.endmEffekt: man kan använda en ny instruktionSWAPR %ri, %rj för att byta plats på
innehåll i %ri och %rj
April 19, 2023 2G1518, föreläsning 3, vt2005 10
MOVI RA, datan
MOVI
Hur många bitar behövs? ~6+5+5!Hur stor blir varje instruktion? 16!
Nios INSTRUKTIONSFORMATmed immediate data
Exempelvis: 6 5 5
April 19, 2023 2G1518, föreläsning 3, vt2005 11
Programexekveringi fyra steg
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 12
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
April 19, 2023 2G1518, föreläsning 3, vt2005 13
Inför ny hårdvaraK - register
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 14
Hur används register K ?
PreFiX-instruktionen PFX Imm11
skriver ett 11 bitars värde till register K
Värdet finns kvar i en klockcykelsen nollställs register K
Instruktionen direkt efter PFX Imm11
kan använda innehåll i K
Imm5 ökar till (Imm11 cat Imm5 )
April 19, 2023 2G1518, föreläsning 3, vt2005 15
Nios: MOVIP Rdst, Imm16
(MACRO) 32 bitar till Rdst alla bitar 31-00 påverkas
PFX Imm111 ;11 bitar till K-regMOVI Rdst, Imm15 ;16 bitar i Rdst
fyller ut med nollor i bit 31-16
0………… …0 0……0 Imm111 Imm15
Resultat:
April 19, 2023 2G1518, föreläsning 3, vt2005 16
PFX Imm11
FI PFX - -PFX Imm11
MOVI Rdst, Imm5FI FO EXE WB
April 19, 2023 2G1518, föreläsning 3, vt2005 17
Nios: MOVIA Rdst, Imm32
(MACRO) 32 bitar till Rdst alla bitar 31-00 påverkas
PFX Imm111 ;11 bitar till K-regMOVI Rdst, Imm15 ;16 bitar i Rdst
fyller ut med nollor i bit 31-16
PFX Imm211 ;11 bitar till K-regMOVHI Rdst, Imm25 ;32 bitar i Rdst
bit 15-0 påverkas ej av MOVHI
Imm211 Imm25 Imm111 Imm15
Resultat:
April 19, 2023 2G1518, föreläsning 3, vt2005 18
Imm211 Imm25
Hjälp från översättaren
%xhi (value)%xlo (value)%hi (value)%lo (value)
value@h = 31 MSBits
Imm111 Imm15= value
April 19, 2023 2G1518, föreläsning 3, vt2005 19
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
April 19, 2023 2G1518, föreläsning 3, vt2005 20
LOAD och STORE
Vi kan utföra instruktionerna
LD Rdst, [ Raddr ]
ST [ Raddr ], Rsrc
April 19, 2023 2G1518, föreläsning 3, vt2005 21
Programexekveringi fyra steg
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 22
LOADA Rdest, Addr
Skriv makro för load med direkt adressering.macro LOADA reg, addrMOVIA \reg, \addrLD \reg, [\reg]
.endmOBS att inga registerinnehåll “förstörs”
April 19, 2023 2G1518, föreläsning 3, vt2005 23
STOREA Addr, Rdest,
Skriv makro för store med direkt adressering.macro STOREA addr, reg MOVIA %g7, \addrST [%g7], \reg
.endmOBS att innehåll i reg %g7 “förstörs”
April 19, 2023 2G1518, föreläsning 3, vt2005 24
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
April 19, 2023 2G1518, föreläsning 3, vt2005 25
Programvariabler samlade i minnet
Variabler int i; int j; int k;
läggs efter varanni minnet av kompilatorn
minne
ijk
April 19, 2023 2G1518, föreläsning 3, vt2005 26
Ett register pekar ut variabelarean
Vid programstart tilldelas registret adressen till variabelarean i minnet
minne
ijk
register
r28
April 19, 2023 2G1518, föreläsning 3, vt2005 27
Varje LOAD/STORE behöver adressberäkning med ADD
k ska hämtas till R2R17 är ledigtADDI R17 <- R28 + 8LOAD R2 <- (R17)En extra instruktionEn extra klockcykelExtra krångel i
programkoden
minne
ijk
register
r28
April 19, 2023 2G1518, föreläsning 3, vt2005 28
Indexerad adress
Addition i LOAD-instruktionen
LOAD R2 ← 8(R28)
innebärR2 ← hm(r28+8)
Innehåll i R28, plus talet 8, blir minnesadress
minne
ijk
register
r28
April 19, 2023 2G1518, föreläsning 3, vt2005 29
LOAD och STORE
Vi vill alltså kunna utföra instruktionerna
LOAD Rdst, Offset[ Raddr ]
STORE Offset[ Raddr ], Rsrc
April 19, 2023 2G1518, föreläsning 3, vt2005 30
LOAD Rdst <- Offset[Raddr]
Vi kan utföra operationenLOAD Rdst, Offset[ Raddr ]
med koden (tar 2 klockcykler eller hur)ADDI Raddr, Offset
LD Rdst, [ Raddr ]
OBS! Innehåll i Raddr ändras
April 19, 2023 2G1518, föreläsning 3, vt2005 31
STORE Offset[Raddr] <- Rsrc
Vi kan utföra operationenSTORE Offset[ Raddr ], Rsrc
med koden (tar 2 klockcykler eller hur)ADDI Raddr, Offset
ST [ Raddr ], Rsrc
OBS! Innehåll i Raddr ändras
April 19, 2023 2G1518, föreläsning 3, vt2005 32
LOAD Rdst <- Offset[Raddr]Nios-kod
Vi kan utföra operationenLOAD 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
April 19, 2023 2G1518, föreläsning 3, vt2005 33
STORE Offset[Raddr] <- Rsrc Nios-kod
Vi kan utföra operationenSTORE 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
April 19, 2023 2G1518, föreläsning 3, vt2005 34
Programmering med hopp
Hopp = ett värde skrivs till PCEffektivadress skrivs till PCOlika adresseringsmetoder finnsJUMP Label
brukar använda absolut adressBRA Label
brukar använda PC-relativ adress
April 19, 2023 2G1518, föreläsning 3, vt2005 35
JUMP (Raddr)inför ny dataväg
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
Ny dataväg
April 19, 2023 2G1518, föreläsning 3, vt2005 36
BRA Immn
ADDitionsenhet och datavägar finns
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 37
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
April 19, 2023 2G1518, föreläsning 3, vt2005 38
JUMP och BRAOvillkorliga hopp
JUMP brukar ha direkt adress 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:
April 19, 2023 2G1518, föreläsning 3, vt2005 39
Typisk hopp-instruktionJUMP 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
April 19, 2023 2G1518, föreläsning 3, vt2005 40
Typisk hopp-instruktionBRA Label
PC-relativ adresseringLäget Label motsvarar en binär adressFöre körning beräknar assemblern hur
långt från instruktionen Label finnsAvståndet lagras i instruktionen som
displacement eller offsetVid körning adderas offset till PCoffset kan vara positivt eller negativt
April 19, 2023 2G1518, föreläsning 3, vt2005 41
Typisk hopp-instruktionJUMP (Raddr)
Kopiera registerinnehåll till PCRegister med 32 bitar betyder att
32 bits adress kan användasHur får man 32 bits adress till
registret ?MOVIA Raddr , Imm32 eller
motsvarande
April 19, 2023 2G1518, föreläsning 3, vt2005 42
Nios hopp-instruktionJMP %rA
Skifta innehåll i register %rA ett steg åt vänster och kopiera till PC
April 19, 2023 2G1518, föreläsning 3, vt2005 43
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”
April 19, 2023 2G1518, föreläsning 3, vt2005 44
Imm211 Imm25
Hjälp från översättaren
%xhi (value)%xlo (value)%hi (value)%lo (value)
value@h = 31 MSBits
Imm111 Imm15= value
April 19, 2023 2G1518, föreläsning 3, vt2005 45
Typisk hopp-instruktionBR Immn
PC sätts till PC + Immn
Hur stor är Immn ?
Hur stor vill vi att Immn ska vara helst ?
April 19, 2023 2G1518, föreläsning 3, vt2005 46
Nios hopp-instruktionBR IMM11
Skifta IMM11 ett steg vänster gör Sign Extensionaddera till aktuellt värde i PCPC <- PC + 2 + (sext (IMM11) <<1)
April 19, 2023 2G1518, föreläsning 3, vt2005 47
Typisk instruktionSUB RsrcA, RsrcB
Subtrahera innehåll i RsrcB från RsrcA
och skriv till RsrcA
Förutom resultatet / skillnadenså lagras ytterligare informationi STATUS-flaggor
April 19, 2023 2G1518, föreläsning 3, vt2005 48
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 registerInformation om resultatet / skillnaden
lagras som informationi STATUS-flaggor
April 19, 2023 2G1518, föreläsning 3, vt2005 49
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 ALUPåverkas av ADD, SUB, CMP ...
April 19, 2023 2G1518, föreläsning 3, vt2005 50
STATUS-flaggor
EXecute/MEMory
Fetch Operand
WriteBack
FetchInstruction
ProgramMemory
m x 8
ALU
ADD
RegisterFile
32 x 32
RegisterFile
32 x 32
PC
NVZC
Logik förvillkorligt
hopp
op-code
CCR
true/false
PC+k/PC+Imm
RWM
April 19, 2023 2G1518, föreläsning 3, vt2005 51
Villkorlig hopp-instruktionBcond Immn
PC sätts till PC + Immn 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
April 19, 2023 2G1518, föreläsning 3, vt2005 52
Nios har villkorlig instruktion IFS cc_IMM4
IFS - Conditionally execute next instructionOm 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.)
April 19, 2023 2G1518, föreläsning 3, vt2005 53
Nios har villkorlig instruktion SKPS cc_IMM4
SKPS - Skip On Condition CodeOm 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
April 19, 2023 2G1518, föreläsning 3, vt2005 54
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 LabelCMPI reg1, 0 ;jämför reg1 med nollIFS cc_eq ;om Z=1BR Label ;hoppa till LabelNOP
April 19, 2023 2G1518, föreläsning 3, vt2005 55
BEQ Label
Skriv makro för villkorligt hopp BEQ.macro BEQ labelIFS cc_eqBR \labelNOP
.endm
April 19, 2023 2G1518, föreläsning 3, vt2005 56
Bxx Label
Skriv makro-mall för villkorligt hopp Bxx.macro Bxx labelIFS cc_xxBR \labelNOP
.endmkan skrivas för xx: eq, ne, … (14 olika !)
April 19, 2023 2G1518, föreläsning 3, vt2005 57
14 olika villkor finns i Nios
cc_ncC = 0cc_c C = 1cc_nzZ = 0cc_z Z = 1cc_pl N = 0cc_mi N = 1cc_lt N xor Vcc_ge not(N xor
V)
cc_gtnot(Zor(NxorV))
cc_le Zor(NxorV)cc_nv V = 0cc_v V = 1cc_hi not (C or Z)cc-la C or Z
April 19, 2023 2G1518, föreläsning 3, vt2005 58
Alias för villkor i Nios
cc_cs = cc_c Carry Set = Carrycc_n = cc_mi Negative = MInuscc_cc = cc_nc Carry Clear = No Carrycc_vc = cc_nv oVerflow Clear = No oVe...cc_eq = cc_z Equal = Zerocc_ne = cc_nz Not Equal = Not Zerocc_vs = cc_v oVerflow Set = oVerflowcc_p = cc_pl Plus = PLus
April 19, 2023 2G1518, föreläsning 3, vt2005 59
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
April 19, 2023 2G1518, föreläsning 3, vt2005 60
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 IFRNZOm nästa är en PFX så görs två nästa
April 19, 2023 2G1518, föreläsning 3, vt2005 61
funktioner, subrutiner, metoder
Hur sker anrop ?Med hoppinstruktion !Hur sker återhopp ?Med hoppinstruktion !Returadress måste lagras ! Var ?
April 19, 2023 2G1518, föreläsning 3, vt2005 62
Subrutinanrop
CALL RUTRET1: ADD …
CALL RUTRET2: SUB ...
RUT: ADD …
RETURN
April 19, 2023 2G1518, föreläsning 3, vt2005 63
Subrutinanrop
CALL RUTRET1: ADD …
CALL RUTRET2: SUB ...
RUT: ADD …
CALL FKN
RETURN
FKN: MUL …
CALL NEW
RETURN
April 19, 2023 2G1518, föreläsning 3, vt2005 64
funktioner, subrutiner, metoder
Hur sker parameteröverföringVar lagras parametrar
från anropare till rutinen, inparametrarfrån rutinen till anroparen, returvärdenOlika typ av parameter värdepekare
April 19, 2023 2G1518, föreläsning 3, vt2005 65
Nios hopp-instruktionBSR IMM11
Liknar BR IMM11 med tilläggg attReturadress sparas i register %R15/%o7Returadressen ä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
April 19, 2023 2G1518, föreläsning 3, vt2005 66
Nios hopp-instruktionCALL %rA
Liknar JMP %rA med tillägg attReturadress sparas i register %R15=%o7Returadressen ä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
April 19, 2023 2G1518, föreläsning 3, vt2005 67
Nios-MakrotCALLA addr
; Subrutinanrop med absolutadressering
.macro CALLA addrMOVIA %g7, \addr@hCALL %g7
.endm
OBS att innehåll i reg %g7 “förstörs”
April 19, 2023 2G1518, föreläsning 3, vt2005 68
Stackhantering
Stack är speciell reserverad plats i minnet
Stack Pekare pekar på plats i stacken
PUSH-operation, lägg på stackPOP-operation, hämta från stack
April 19, 2023 2G1518, föreläsning 3, vt2005 69
STACKoperationer PUSH och POP
Stack Pointer
SP
PUSH op:SP <- sp - nmem(sp) <- op
POP dst:dst <- mem(sp)SP <- sp + n
n = antal bytes
+
-
April 19, 2023 2G1518, föreläsning 3, vt2005 70
Nios: PUSH reg
; Pusha ett register på stacken.macro PUSH regSUBI %sp,4 ;%sp = %o6ST [%sp],\reg
.endm; PUSH %o6 är inte bra
April 19, 2023 2G1518, föreläsning 3, vt2005 71
Nios: POP reg
; Poppa ett register från stacken.macro POP regLD \reg,[%sp] ADDI %sp,4 ;%sp = %o6
.endm;POP %o6 är förödande
April 19, 2023 2G1518, föreläsning 3, vt2005 72
Nios: StackReservera plats, initiera SP
Stack Pointer
SP
.equ size , 256
.data
.align 2stack: .fill size, 4, 0....text…movia %sp, stack+size*4
+
-stack:
April 19, 2023 2G1518, föreläsning 3, vt2005 73
Nios stöd för stack
Stack Pointer = %r14 = %sp (alias %o6) Finns det Stack-operationer ?LDS är LOAD Rdst <- [%sp, IMM8]
STS är STORE [%sp,IMM8] <- Rsrc
med flera variationerIngen PUSH- eller POP-instruktionIngen JSR/RTS med returadress på stack
April 19, 2023 2G1518, föreläsning 3, vt2005 74
Nios stöd för subrutiner
Anrop med CALL reg, returadress i register %r15 = %o7innehållet i reg multipliceras med 2 innan det skrivs till PC, jämför med JMP reg
Anrop med BSR LabelRetur med RET (JMP %r31 alias %i7)Retur med LRET (JMP %r15 alias %o7)
April 19, 2023 2G1518, föreläsning 3, vt2005 75
Returadress vid subrutinanrop
I ett speciellt register (fördel/nackdel)I valfritt register (fördel/nackdel)I minnet på speciell plats (fördel/nackdel)I minnet på valfri plats (fördel/nackdel)I minnet på en stack med PUSH
(fördel/nackdel)I första ordet i subrutinen (fördel/nackdel)
April 19, 2023 2G1518, föreläsning 3, vt2005 77
Register Window
32 registers are direct available%i0-%i7 = %r24-%r31 ; In regs%L0-%L7 = %r16-%r23 ; Local
regs%o0-%o7 = %r8 -%r15 ; Out regs%g0-%g7 = %r0 -%r7 ; Global
regs
April 19, 2023 2G1518, föreläsning 3, vt2005 78
Register Window
32 registers are direct available128 or 256 or 512 possible registers CWP - Current Window Pointer
anger vilka register som just nuär direkt åtkomliga
CWP finns i statusregister %ctl0 !
April 19, 2023 2G1518, föreläsning 3, vt2005 79
Register Window
CWP = Current Window PointerSAVE ”öppna nytt fönster”
minska CWP med 1RESTORE ”byt till gammalt fönster”
öka CWP med 1
April 19, 2023 2G1518, föreläsning 3, vt2005 80
Table 20. Smallest Nios Register File
Reg[..
Reg[..
Reg[..
Reg[..
Reg[..
Reg[..
Reg[..
Reg[..
Reg[..
Reg[24..31]
Reg[16..23]
Reg[8..15]
Reg[104..111]
Reg[112..119]
Reg[120..127]
Reg[0..7]
%o0..%o7
%L0..%L7
%i0..%i7
%g0..%g7
%o0..%o7
%L0..%L7
%i0..%i7
%g0..%g7 %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 = 4CWP = 2
April 19, 2023 2G1518, föreläsning 3, vt2005 81
Exempel på subrutinkodutan SAVE och RESTOREnästlat subrutinanrop går ej
RUT: ......;BSR RUT2 ;subrutinanrop ger
fel…LRET ;JMP %07NOP ;hopplucka viktig nop
April 19, 2023 2G1518, föreläsning 3, vt2005 82
RUT: SAVE %sp,0 ;ändra inte %sp...BSR RUT2;subrutinanrop
fungerar…RET ;JMP %i7RESTORE ;i hopplucka
Exempel på subrutinkodmed SAVE och RESTOREnästlat subrutinanrop går bra
April 19, 2023 2G1518, föreläsning 3, vt2005 83
Parameterplatstill och från subrutin
I register (fördel/nackdel)I minnet på fast adress
(fördel/nackdel)I minnet på en stack (fördel/nackdel)
April 19, 2023 2G1518, föreläsning 3, vt2005 84
Exempel på parameteröverföringmed SAVE och RESTORE
Anroparen lagrar parametrar i %o-register (utom %o6-%o7) Anroparen gör BSR eller CALL varvid
returadress sparas i %o7 Subrutinen gör SAVE varvid
alla %oreg hamnar på platser %ireg Returadress finns nu i %i7 Parametrar finns nu i %i-register Det finns 16 ”nya” register, 8 st %Local och 8 st %Out Subrutinen gör RESTORE Returadress finns nu i %o7 varvid
retur ska göras med JMP %o7 (samma som LRET)
April 19, 2023 2G1518, föreläsning 3, vt2005 85
Programexempel - subrutinta fram max av val1 och val2
Exempel på C-kod torde kunna vara...int val1, val2, result; /* variabler */... int max (int val1, int val2); /* prototyp */...result = max ( val1, val2); /* anrop */
April 19, 2023 2G1518, föreläsning 3, vt2005 86
Programexempel - subrutin ta fram max av val1 och val2
int val1, val2, result; kan översättas till (av kompilator)
.data
.align 2 ;adress multipel av 22
val1: .word 0val2: .word 0result: .word 0...
April 19, 2023 2G1518, föreläsning 3, vt2005 87
anrop av max (val1, val2)inparametrar i register
; result = max ( val1, val2) kan översättas till.text
movia %L0, val1ld %o0, [%L0] ;parameter val1 till %o0 från minnetmovia %L0, val2ld %o1, [%L0] ;parameter val2 till %o1 från minnetmovia %L0, max@h ;dst-adress/2 till ett register call %L0 ;ea/2 i registernopmovia %L0, resultst [%L0], %o0 ;returvärde i %o0 kopieras till minnet
April 19, 2023 2G1518, föreläsning 3, vt2005 88
Programexempel - subrutinta 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)
April 19, 2023 2G1518, föreläsning 3, vt2005 89
int max (int val1, int val2)inparametrar i register
max: cmp %o0, %01ifs cc_ltmov %o0, %o1lret ;jmp %o7