Presentation laddar. Vänta.

Presentation laddar. Vänta.

William Sandqvist Datorteknik övning 2 Subrutinanrop.

Liknande presentationer


En presentation över ämnet: "William Sandqvist Datorteknik övning 2 Subrutinanrop."— Presentationens avskrift:

1 William Sandqvist Datorteknik övning 2 Subrutinanrop

2 William Sandqvist Digitala komponenter Assemblerprogram C In- och utmatning Avbrott och "trap" Cacheminnen Trådar, synkronisering DC F1 DC F2 CE F1 CE F3 CE F4 CE F5 CE F6 CE F7 CE F8 CE F9 CE F10 CE F2 DC Ö1 DC Ö2 CE Ö4 CE Ö1 CE Ö2 CE Ö3 CE Ö10 CE Ö7 CE Ö8 CE Ö9 CE Ö5CE Ö6 lab dicom lab nios2time hemlab C lab nios2io lab nios2int hemlab cache hemlab trådar tentamen Datorteknik & komponenter

3 William Sandqvist 2.1 Binära lagringsformat Det finns tre olika binära lagringsformat för Nios- II-instruktioner. Studera figurer över dessa tre i Nios-II-manualen. Förklara hur de olika fälten i instruktionerna används.

4 William Sandqvist Register operations, R-type instructions

5 William Sandqvist Program constants, I-type instructions

6 William Sandqvist I-type, Branch

7 William Sandqvist J-type Call The IMM26 adress is effectively a 28 bit ”Byte-adress” because instructions must be word-aligned = 4 bit obestämda. Man kan nå subrutiner inom ”egen” sida (av 16 sidor)

8 William Sandqvist 2.2 Subrutinanrop med call eller callr Studera de två Nios-II-instruktioner som finns för subrutinanrop. Var lagras retur-adressen, och vilka konsekvenser ger denna lagringsmetod? Visa hur en CALL kan bytas mot en CALLR, om destinationsadressen ligger för långt bort.

9 William Sandqvist Subrutinanrop

10 William Sandqvist Returnaddress Returadressen lagras i register R31

11 William Sandqvist callr – adress i register movia r11, 0x # destinationsadress till R11 callr r11 # anropa subrutinen 1) spara undan återhoppsadressen 2) hämta hoppadressen

12 William Sandqvist call och ret call subrut subrut:... ret ret återinsätter det ”tidigare” program- räknarvärdet Om subrutinen finns inom 256 Mbyte kan call användas. Subrutinen avslutas med instruktionen ret

13 William Sandqvist Nästlat subrutinanrop Problem: hur hanterar man flera returadresser? ( fler lektioner följer … )

14 William Sandqvist 2.4 Multiplikation som upprepad addition Studera de varianter av Add- och Sub-instruktioner som finns för Nios II. Skriv en subrutin muladd() i Nios-II-kod som utför multiplikation genom heltalsadditioner. Vid anrop av muladd() skall Du förutsätta att faktorerna är två positiva binärkodade heltal som finns i R4 och R5, och att produkten blir högst 32 bitar och returneras i R2. Du får använda register R2 … R15 som arbetsregister. Övriga register måste vara oförändrade vid retur. Hur många klockcykler (ungefär) tar en multiplikation med 10?

15 William Sandqvist flödesschema Multiplikation av tal1  tal2 genom att addera tal2, tal1 stycken gånger …

16 William Sandqvist C-funktion int muladd(int a, int b) { int i; int total = 0; for(i=0; i < a; i++) total += b; /* b adderas a ggr */ return total; }

17 William Sandqvist for  while int muladd(int a, int b) { int i; int total = 0; for(i=0; i < a; i++) total += b; return total; } int muladd(int a, int b) { int total = 0; int i = 0; while(i < a) { total += b; i++; } return total; }

18 William Sandqvist while  if - goto int muladd(int a, int b) { int total = 0; int i = 0; while(i < a) { total += b; i++; } return total; } int muladd(int a, int b) { int total = 0; int i = 0; L1: if(i >= a) goto L2; total += b; i++; goto L1; L2: return total; } Omvänt vilkor!

19 William Sandqvist Registeranvändning

20 William Sandqvist Val av register int muladd(int a, int b) { int total = 0; int i = 0; L1: if(i >= a) goto L2; total += b; i++; goto L1; L2: return total; } R2 R4 R5 R2 (smart, det register vi ska returnera) R8 (första lediga allmänna register)

21 William Sandqvist Assemblerkod int muladd(int a, int b){ int total = 0; int i = 0; L1: if(i >= a) goto L2; total += b; i++; goto L1; L2: return total; } muladd: mov r2,r0 # total = 0 mov r8,r0 # i = 0 L1: bge r8, r4, L2 # i>=a add r2, r2, r5 # total += b addi r8, r8, 1 # i++ br L1 L2: ret # return total

22 William Sandqvist Hur lång tid tar det? muladd( 10, 2 32 ) eller muladd(2 32, 10) ? muladd: mov r2,r0 # total = 0 beq r4,r0,L2 # fakt a är 0 beq r5,r0,L2 # fakt b är 0 mov r8,r0 # i = 0 L1: bge r8, r4, L2 # i>=a add r2, r2, r5 # total += b addi r8, r8, 1 # i++ br L1 L2: ret # return total Om ena faktorn är 0 behöver inte så mycket göras! Snabbretur!

23 William Sandqvist worst case muladd(2 32, 10); muladd: mov r2,r0 # total = 0 mov r8,r0 # i = 0 L1: bge r8, r4, L2 # i>=a add r2, r2, r5 # total += b addi r8, r8, 1 # i++ br L1 L2: ret # return total 2 32 Antag att hopp br tar två klockcykler, andra instruktioner en klockcykel. bge tar en klockcykel eftersom hoppet bara tas en enda gång, på slutet då loopen kört klart! 2 32 ·( )·(1/50·10 6 )  3 minuter ! Processorn körs med klockfrekvensen 50 MHz

24 William Sandqvist 2.5 Skifta eller rotera bitarna i ett ord Förklara instruktionerna skifta (shift) och rotera (rotate). Undersök vilka instruktioner Nios II har för att skifta och rotera. Förklara dessa instruktioner.

25 William Sandqvist vänsterskift Skifta R9 vänster två steg ( multiplicera med 2 2 ): slli r9,r9,2 # R9 << 2 0x ( = ) 0x ( = = 4  )

26 William Sandqvist högerskift 0x ( = = /4 ) Skifta R9 höger två steg ( dividera med 2 2 ): srli r9,r9,2 # R9 >> 2 0x ( = )

27 William Sandqvist aritmetiskt skift OBSERVERA! srli r9,r9,2 ger inte division med fyra om R9 innehåller ett negativt tal! De nollor som skiftas in från vänster gör talet positivt! Det finns därför en aritmetisk högerskiftinstruktion som skiftar in bitar av samma typ som registrets teckenbit. R9 = 0xfffffff4 (-12) srai r9,r9,2 R9 = 0xfffffffd (-3 = -12/4)

28 William Sandqvist rotationsinstruktioner Rotera R9 vänster tre steg: roli r9,r9,3 Rotation har ingen direkt aritmetisk betydelse, men kommer till användning vid olika krypterings- dekrypterings-algoritmer. ( Det finns ingen rotationsoperation i C så därför kan det finnas anledning av effektivitetsskäl att skriva assemblerkod i ett krypteringsprogram).

29 William Sandqvist 2.6 Multiplikation med konstant Skriv en subrutin mul10() som utför multiplikation med det konstanta värdet 10. Använd addition och skift. Vid anropet ligger det tal som skall multipliceras med tio i R4, returvärdet lämnas i R2. Använd R2 … R15, lämna övriga register oförändrade. Helst skall subrutinen klara negativa tal. Hur många instruktioner exekveras för att multiplicera ett tal med tio? Finns det risk för overflow/spill?

30 William Sandqvist Multiplikation med två Multiplikation med två är enkelt, skifta vänster ett steg.

31 William Sandqvist Multiplikation med åtta Multiplikation med åtta är enkelt, skifta vänster tre steg.

32 William Sandqvist Multiplikation med tio 10  x = ( )  x = 8  x + 2  x Antag att x ligger i R4 och att retur skall ske i R2 … slli r10,r4,3 # 8x i R10 slli r11,r4,1 # 2x i R11 add r2,r10,r11 # 8x+2x i R2

33 William Sandqvist Subrutin mul10() int mul10(int tal); R4R2 mul10: slli r10,r4,3 # R10 = 8  R4 slli r11,r4,1 # R11 = 2  R4 add r2,r10,r11 # R2 = (10+2)  R4 ret Beräkningen tar nu klockcykler, blixtsnabbt i jämförelse med 3 minuter!

34 William Sandqvist 2.7 Logiska operatorer Repetera (eller lär dig) innebörden av de logiska operationerna ”bitvis AND”, ”bitvis OR” och ”bitvis XOR”. Undersök vad Nios II har för instruktioner för logiska operationer, och hur de används med immediate operand.

35 William Sandqvist Bitoperationer saknas De flesta procerssorer (utom vissa små-processorer) saknar instruktioner som opererar direkt på enskilda bitar i register. Med hjälp av de bitvisa logiska operationerna kringår man detta. Man kan 1-ställa enskilda bitar Man kan 0-ställa enskilda bitar Man kan testa enskilda bitar

36 William Sandqvist Logiska operationer and andi or ori xor xori nor nori Exempel med bitvis and: resultat = operand & bitmask; /* C */ andi resultat,operand,bitmask # assembler operand bitmask AND. Dom bitpositioner som är 0 i bitmasken, blir 0-ställda i resultatet, övriga bitar tas oförändrade från operanden.

37 William Sandqvist Logiska operationer and andi or ori xor xori nor nori OR. Dom bitpositioner som är 1 i bitmasken, blir 1-ställda i resultatet, övriga bitar tas oförändrade från operanden. Exempel med bitvis OR: resultat = operand | bitmask; /* C */ ori resultat,operand,bitmask # assembler

38 William Sandqvist Logiska operationer and andi or ori xor xori nor nori XOR. Dom bitpositioner som är 1 i bitmasken, blir ”togglade” i resultatet, övriga bitar tas oförändrade från operanden. Exempel med bitvis XOR: resultat = operand ^ bitmask; /* C */ xori resultat,operand,bitmask # assembler

39 William Sandqvist nor Oftast skriver man bitmasken som en hexadecimal konstant, men om det är många inledande nollor kan det i assembler även vara praktiskt att använda binära konstanter. Ex. 0b0111 Exempel med bitvis NOR: resultat = ~(operand | bitmask); /* C */ nori resultat,operand,bitmask # assembler Det finns ingen instruktion för bitvis invertering ( ~ ). Det kan man lösa med nori – instruktionen: nori resultat,r0,operand and andi or ori xor xori nor nori

40 William Sandqvist 2.8 Ladda en konstant till ett register Instruktionen movi r2,value Sign extension görs på 16-bitarstalet value < value < Använd: movi r2, -1 # för att returnera –1 movia finns för 32-bitarskonstanter (oftast adresser) movia r2, -1 # går ej tyvärr, en bug!

41 William Sandqvist (2.9 Makron) Saknar Du någon instruktion så kan Du skriva ett makro. Tex kanske man vill ha en instruktion för att 0- ställa ett register?.makro CLR reg # 0-ställ register add \reg,r0,r0.endm

42 William Sandqvist ( Makro invertera, makro negera ).makro INV reg # invertera register nor \reg,r0,\reg.endm.makro NEG reg # negera register sub \reg,r0,\reg # reg = 0-reg.endm

43 William Sandqvist 2.10 Multiplikation av godtyckliga tal Skriv en subrutin mul() som multiplicerar två positiva 32- bitarstal. Förutsätt att produkten rymms i 32 bitar, detta behöver inte kontrolleras. Som vanligt för Nios II finns inparametrarna i R4 och R5, och det beräknade resultatet skall levereras i R2. Du får använda register R2 … R15 som arbetsregister. Övriga register skall ha oförändrat innehåll vid returen.

44 William Sandqvist Ex. godtyckliga tal 10  43 (= 430) a=10 och b=43 är här godtyckliga tal för detta exempel.

45 William Sandqvist En algoritm Klart! (fast datorn vet inte om att alla avslutande positionerna är noll och måste slutföra alla 32 stegen …) = 1AE 16 = Så här skulle Du göra för hand … skifta höger skifta vänster ackumulerad summa multiplicera med bit

46 William Sandqvist från algoritm till program  Algoritmen undersöker en enda bit i tal A per loop- varv  Om den bitpositionen är ett adderas B till summan  Skifta tal A till höger varje loop-varv, undersök alltid biten längst till höger  Talet B flyttar ett steg till vänster per loop-varv  Spara skiftat B i varje loop-varv

47 William Sandqvist Flödesschema Det blir enklare assembler- program med nedräkning från 32 till 0 i stället för uppräkning från 0 till 32. int mul(int a, int b) R4 R2 R5

48 William Sandqvist programförslag ( C )... for(i = 32; i > 0; i--) { if(a&1 != 0) total += b; a = a >> 1; b = b << 1; }... testa biten längst till höger ny bit längst till höger, skifta a skifta b inför nästa varv så att det blir rätt position inför additionen total placeras i R2 (skall returneras) i placeras i tex. R11 (som är ett av många lediga register)

49 William Sandqvist assemblerprogram mul: mov r2,r0 # total=0 movi r11, 32 # i=32 L1: andi r12,r4,1 # a&1 testa bit beq r12,r0,L2 # hoppa förbi additionen add r2,r2,r5 # total += b L2: srli r4,r4,1 # a>>1 slli r5,r5,1 # b<<1 subi r11,r11,1 # i-- bgt r11,r0,L1 # loopa tills i=0 ret För C är det ok att funktionen ”förstör” värdena i R4 och R5 (om det anropande programmet inte är C kan annat gälla, då måste kanske dessa kopieras till andra register).


Ladda ner ppt "William Sandqvist Datorteknik övning 2 Subrutinanrop."

Liknande presentationer


Google-annonser