Sid 1 av 8 Datavetenskap Tentamen för DVG A03 Datorsystemteknik, 7,5 hp, del 2 fredag 2009-01-09 kl. 08.15-13.15 Tentamen del 2 består av 4 sidor. Ansvariga lärare: Tillåtna hjälpmedel: Kerstin Andersson och Nils Dåverhög Mats Brorsson Datorsystem och miniräknare. Betygsgränser: Tentamensgränser 3 = 30-39,5 poäng 4 = 40-49,5 poäng 5 = 50-60 poäng Ange alla antaganden! Uttryck dig i fullständiga meningar! Skriv tydligt! (Går inte skriften att läsa är det likställt med ett felaktigt svar.) Börja varje uppgift på ett NYTT papper! Skriv alla dina svar på skrivpapper, skriv INTE på tentan! OBS!! Detta är DEL 2 av tentan. För att få ut denna måste du ha lämnat in del 1. Om du inte fått ut del 1 bör du meddela skrivningsvakten. OBS!! LYCKA TILL! 1 Kodöversättning (5 p) Översätt följande C-satser till MIPS-assembler. a) int vek[50]; main() { int k = 24; } while (k >= 0) { vek[2 * k] = k * k; vek[2 * k + 1] = -k; k = k - 1; }
Sid 2 av 8 b) int tal = 7; main() { if (tal < 0) printf( Talet är negativt. ); else if (tal >= 0 && tal < 10) printf( Talet är ett ental. ); else printf( Talet är 10 eller större. ); } 2 Flyttal (6 p) Utför följande beräkning som flyttal i enkel precision: -76,375 + 10,7 OBS! Omvandla först talen till IEEE-flyttal med enkel precision. 3 Subrutiner (6 p) a) Skriv en rekursiv funktion i MIPS-assembler som beräknar där An = 2 * An-2 + An-1 A0 = 0 och A1 = 1. n som är ett positivt heltal skickas som parameter till funktionen. Skriv enbart funktionen. b) Beräkna A7 manuellt. 4 Cache och pipelining (15 p) a) En dator har en två-nivås cache. Anta att 80 % av minnesreferenserna träffar på första nivån, 15 % träffar på andra nivån och 5 % missar cachen. Accesstiden för cachen på andra nivån är 15 ns och accesstiden för primärminnet är 60 ns. Vad ska accesstiden för cachen på första nivån högst vara för att den procentuella minskningen av medelaccesstiden som cachesystemet ger upphov till relativt att bara använda primärminne ska bli åtminstone 82 %.
Sid 3 av 8 b) Antag en pipelinad maskin med sex exekveringssteg som tar 0,7 ns, 0,4 ns, 0,55 ns, 0,65 ns, 0,6 ns och 0,5 ns. För att klocka in och ut signaler så lägger vi till 0,05 ns. i. Bestäm funktionen Ti(N) som bestämmer hur lång tid det tar att exekvera N instruktioner i en icke-pipelinad maskin. ii. Bestäm funktionen Tp(N) som bestämmer hur lång tid det tar att exekvera N instruktioner i en pipelinad maskin. iii. Rita graferna för Ti och Tp i samma figur (1 <= N <= 20). Nämn några iakttagelser. c) Antag en dator med en cache som rymmer 64 byte. Blockstorleken i cacheminnet är 8 byte. Vilka av följande referenser kommer att träffa respektive missa cacheminnet om man använder direkt adressavbildning? Antag att cachen är tom när du börjar. 4, 16, 32, 22, 80, 70, 76, 22, 36, 44, 20,16, 178, 20, 24 36, 38 d) Rita en beroendegraf över följande kod. Inför nop instruktioner om det behövs för att koden skall fungera. Antag att systemet inte är återkopplat. addi t0,zero,11 addi t1,zero,22 addi t2,zero,18 lui s0,0x8002 ori s0,s0,0x0040 add t3,t0,t1 sub t3,t3,t2 sw t3,0(s0) Kan man ändra om ordningen på instruktionerna så att man slipper införa så många nop:ar men ändå få koden att fungera? 5 C-programmering (8 p) a) Rita figurer som visar hur minnesplatser allokeras och allt som är känt efter varje rad i programmet (0,5 poäng per rad, dvs max 2 p): int *hp1, *hp2, a, b; a = b = 10; hp1 = &a; hp2 = hp1; *hp2 = 15; hp1 = &b; *hp1 = 20; b) Vad skrivs ut av följande sats om den körs efter ovanstående rader (om inte alla data är kända får du istället förklara vad det är): printf( %p %p %p %d %d %d, &b, &hp2, hp2, a, b, *hp1); (3 p)
Sid 4 av 8 c) Skriv koden som gör att alla tal som finns i en array med 10 heltal summeras och summan skrivs ut. För att komma åt de olika talen och summera ska en pekare användas, indexanvändning är ej tillåten. Given kod: #include <stdio.h> #define ANTAL 10 { int main() int tal[antal], sum; /* Här finns kod som lägger in de 10 talen i arrayen. Den behöver du inte skriva*/ /* Men här kommer all kod som gör summeringen och skriver ut resultatet. Den är värd 3 p*/ } return 0;
Sid 5 av 8 Appendix Printf Formatted print to standard output (the console). a0 - address to format string a1..a3 - arguments 1..3 (sp+n) - arguments 4..n Switches: Linking a argument to the text is accompliced by inserting a %-sign followed by a character signifying the desired formate of the argument. Example of possible switches: d- argument is formated to a decimal string s- argument is interpreted as an address to an string. f- argument is formated to a float string "Number %d of %d" li a1, 12345 li a2, 67890 jal printf Will print the string "Number 12345 of 67890" to standard output. putchar Print a character to standard output (the console). a0 - character li a0, A jal putchar Will print character A on standard output. getchar Get a character from standard input (the keyboard).
Sid 6 av 8 v0 - character puts Print a null-terminated string to standard output (the console). a0 - address to string "MIPS is fun!" jal puts Will print the string "MIPS is fun!" to standard output. gets Get a string from standard input (the keyboard). a0 - address to string v0 - address to string.space 128 la jal a0, string1 gets. promstrcmp
Sid 7 av 8 Compare two null-terminated strings. a0 - address to string 1 (s) a1 - address to string 2 (t) v0 - result <0 if s<t, >0 if s>t, 0 if s=t string2: "I'm bigger than you are" "No, you aren't!" la a1, string2 jal promstrcmp Register v0 will have a value less than zero. promstrlen Determine the number of characters in a null-terminated string. a0 - address to string v0 - length of the string "How long am I?" jal promstrlen Register v0 will be 14. install_normal_int
Sid 8 av 8 Install user exception/interrupt handler. The interrupt handler should return non-zero if it processed the interrupt, otherwise it should return zero. The return value is set in register v0. a0 - address to interrupt handler my_handler: # check if interrupt is NOT for me, if so return 0 li v0, 0 j ra # otherwise do something useful and return non-zero li v0, 1 j ra la jal a0, my_handler install_normal_int fptodp Converts arguments from single precision floating-point to double precision. Needs to be called before passing a floating-point argument to printf. a0 - floating-point argument v0 - msb of double precision v1 - lsb of double precision "Number %f" li.s a0, 3.5 jal fptodp move a1, v0 move a2, v1 jal printf Will print the string "Number 3.5" to the standard output.