Lösningar till tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Onsdagen den 13 mars 2013, klockan 14:00 19:00 i Vic 2 A-D, 3 A-C. Tillåtna hjälpmedel: på tentan utdelad formelsamling, miniräknare. Skriv lösningar till varje uppgift på separata ark och använd endast ena sidan på varje ark. Ange namn, program och startår på varje ark. Motivera dina svar tydligt, kommentera all kod du skriver, samt redogör för alla antaganden du gör. Skriv tydligt och läsbart. Betygsgränserna är normalt 20 p för betyg 3, 30 p för betyg 4, och 40 p för betyg 5, av totalt 50 möjliga poäng. Uppgift 1 Betrakta följande C-funktion: int total(int account) { return basic(account) + extras(); Funktionen beräknar en totalsumma genom att lägga ihop värdena från två subrutinanrop, som båda returnerar heltal i tvåkomplement. Argumentet account är ett heltal i tvåkomplement som anger ett kontonummer. Skriv din egen version av total i MIPS-assembler. Du ska skriva komplett assemblerkod, inklusive direktiv och kommentarer, och du ska följa samtliga MIPS programmeringskonventioner, (10 p)..globl total.ent total total: subu sp, sp, 16 # reserve stack space sw ra, 0(sp) # Save value of ra on stack sw a0, 4(sp) # Save value of a0 on stack sw s0, 8(sp) # Save value of s0 on stack jal basic # call subroutine basic, account already in a0 or s0, v0, v0 # save returned value in s0 jal extras # call subroutine extras add v0, v0, s0 # add saved value in s0 to returned value in v0 lw s0, 8(sp) # restore old value of s0 lw a0, 4(sp) # restore old value of a0 lw ra, 0(sp) # restore old value of ra addu sp, sp, 16 # return stack space jr ra # the result is returned in v0.end total Sidan 1 av 5.
Uppgift 2 Studera följande satser i språket C: int matrix[50][50], i, j; for (i=0; i<50; i++) { for (j=0; j<50; j++) { matrix[i][j]=0; Skriv motsvarande kod i MIPS-assembler. Data till matrisen matrix ligger på en adress som heter matrix. I språket C lagras matriser radvis, så att index till höger varierar snabbast. Du behöver bara skriva koden för själva for-looparna, (5 p). ori t0, zero, 50 # set t0 to 50, used for testing in branches or t1, zero, zero # i=0 (t1 contains value of i) la t5, matrix # load base address to matric in t5 ro: bge t1, t0, eo # i>=50 and we are finished mult t1, t0 # multiply row by column size of matrix or t3, zero, LO # t3 now contains 50*i or t2, zero, zero # j=0 (t2 contains value of j) ri: bge t2, t0, ei # j>=50, time for next outer loop add t4, t3, t2 # t4 now contain 50*i+j sll t4, t4, 2 # multiply by 4 to get bytes instead of ints addi t4, t4, t5 # add base address for the matrix sw zero, 0(t4) # set word at address matrix+4*(50*i+j) to zero addi t2, t2, 1 # j++ b ri # next iteration in inner loop ei: addi t1, t1, 1 # i++ b ro # next iteration in outer loop eo: # ready Studera följande subrutin. Förklara kortfattat men tydligt vad subrutinen gör, (5 p)..globl reset.ent reset reset: ori t0, a0, 0 ori t1, zero, 256 loop: sw zero, 0(t0) addi t0, t0, 4 subi t1, t1, 1 bne t1, zero, loop jr ra.end reset Subrutinen nollställer 256 ints i minnet, med början på den adress som anges som argument. Sidan 2 av 5.
Uppgift 3 Vilka tre register används för att hantera avbrotten i en MIPS-processor? Förklara vad registren heter, vilken funktion de har, samt vilka data de innehåller, (6 p). Status används för att styra vilka avbrott som är aktiva. Här finns enskilda bitar som styr vilka av sex externa och två interna avbrott som ska vara aktiva, samt en generell bit som styr alla användardefinierade avbrott. Cause används av avbrottsprocessorn för at meddela vilka avbrott som kommit. Här finns bitar för de sex externa och två interna avbrotten, och en etta betyder att avbrottet har kommit. EPC används för att spara adressen till den instruktion där det körande programmet blev avbrutet av att ett avbrott kom. Efter att avbrottet är hanterat, ska man hoppa tillbaks och fortsätta exekveringen på denna adress. Förklara steg för steg vad som händer vid ett trådbyte i en realtidkärna, (4 p). Ett avbrott kommer till processorn, och avbrottsrutinen startas, (1 p). Samtliga register sparas på stacken, (0.5 p). Schedulern anropas och väljer vilken ny tråd som ska köras, (1 p). Den nya trådens registervärden laddas i registren, (0.5 p). Avbrottsrutinen avslutas och exekveringen fortsätter i den nya tråden, (1 p). Sidan 3 av 5.
Uppgift 4 Vad innebär teckenförlängning, (engelska: sign extension)? Förklara kortfattat men tydligt vad det är och hur det går till i tvåkomplement, (2 p). Teckenförlängning innebär att man översätter ett bitmönster som representerar ett tal till ett bitmönster som representerar samma tal, fast med större antal bitar. I tvåkomplement går det till så att man kopierar den mest signifikanta biten åt vänster tills man får lämplig längd. Visa med ett exempel hur man teckenförlänger talen +3 respektive 2 i tvåkomplement, från åtta till sexton bitar, (2 p). 00000011 blir 0000000000000011 11111110 blir 1111111111111110 Register t0 innehåller värdet 1, och följande instruktioner exekveras: add t1, t0, t0 andi t1, t1, 3 Vilket värde finns nu i t1? Förklara varför, (2 p). Den första instruktioner beräknar värdet av 1+1 och lägger detta i t1. Värdet i t1 är nu 2: 00000000000000000000000000000010 Värdet 3 är binärt: 00000000000000000000000000000011 Bitvis and ger: 00000000000000000000000000000010 Värdet i t1 blir alltså 2. Register t0 innehåller ett okänt värde, och följande instruktioner exekveras: xor t1, t0, t0 andi t1, t1, 3 Vilket värde finns nu i t1? Förklara varför, (2 p). Ett xor med samma värde som sig självt ger alltid resultat noll. Värdet i t1 är nu 0: 00000000000000000000000000000000 Värdet 3 är binärt: 00000000000000000000000000000011 Bitvis and ger: 00000000000000000000000000000000 Värdet i t1 blir alltså 0. Varför måste en laddning av ett 32-bitars värde göras med två immediate-instruktioner, (2 p)? Formatet för en immediate-instruktion i maskinspråk innehåller en konstant som kan vara maximalt 16 bitar lång. Man kan alltså inte lagra en konstant om 32 bitar i en instruktion, utan måste dela upp den på två instruktioner. Sidan 4 av 5.
Uppgift 5 Betrakta följande avsnitt ur ett C-program: int vector[10]; int n; for (n=0; n<=10; n++) { vector[n]=0; När programmet exekveras hänger det sig i en oändlig loop. Om man studerar det i en debugger, visar det sig att vektorn nollställs om och om igen. Vad är det för fel i koden, (3 p)? Vektorn innehåller 10 element, men loopen som nollställer den går 11 varv. Stoppvillkoret i for-satsen ska vara n < 10, inte n <= 10. Förklara vad som händer, (7 p). Det är troligen så att C-kompilatorn placerar variabeln n i minnet direkt efter vektorn vector. När for-satsen nollställer det elfte elementet, som ju inte finns, nollställer den i själva verket värdet i variabeln n, och då börjar slingan om från noll. Lycka till! Sidan 5 av 5.