Tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Onsdagen den 10 mars 2010, klockan 08:00 13:00 å Victoriastadion 1 och 2. 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 Ideon Science Park har nya låskodsläsare med RFID-taggar. Läsare finns installerade för alla dörrar på Ideon. Mjukvaran i läsarna är dock inte korrekt. Du ska hjälpa till att designa en fungerande lösning. Läsaren fungerar så att först håller man taggen nära läsaren. När taggen har identifierats avger läsaren ett kort pip. Man ska då knappa in en privat fyrsiffrig kod. Om koden är rätt låses dörren upp. Läsaren har en RFID-enhet som skickar en signal när en tag är tillräckligt nära för att kunna läsas av. Läsaren har en knappsats som skickar en signal varje gång en knapp trycks in. När en RFID-tag läses av blir ett trettiotvåbitars värde tillgängligt på en inport. Inportens adress är definierad av konstanten RFIDVAL. Knappsatsen har knapparna 0-9. När en knapp är intryckt finns ett åttabitars värde tillgängligt på en inport. Inportens adress är definierad av konstanten BUTTVAL. Det finns en ljudenhet som avger ett svagt pip när man skriver en etta till porten BEEPADR. Det finns en realtidsklocka som skickar tidsavbrott 100 gånger i sekunden, på avbrottsingång INT1. För varje RFID-värde finns en motsvarande korrekt fyrsiffrig kod. Denna tabell ligger lokalt i läsarens minne. När tabellen ändras skickas en ny version ut via Internet till samtliga läsare, men du behöver inte ta hänsyn till detta i din lösning. Du kan anta att en korrekt tabell redan finns i datorns minne. Läsaren styrs av en MIPS-processor. Rita ett flödesschema för styrning av en läsare. Du behöver inte använda någon särskild syntax för ditt schema, men det ska klart framgå vilka olika steg som finns, samt vilka in- och utsignaler som används, (4 p). Vilka insignaler bör kopplas till avbrott och vilka bör kopplas till inportar som läses på initiativ av programmet? Lista samtliga insignaler och ange om de ska kopplas till avbrott eller inport. Beskriv även vilka utsignaler som finns, (3 p). Nuvarande läsare är felaktigt programmerade. Om man håller taggen i samma hand som den man trycker på knapparna med, händer det att läsaren läser taggen på nytt, mitt i inknappningen av en kod, varefter koden inte matchar till taggen. Förklara vad som troligen är fel och hur det kan rättas till, (3 p). Uppgift 2 I C finns en standardfunktion strcpy som kopierar en teckensträng (f) till en annan (t). Den är deklarerad så här: char *strcpy(char *t, char *f) { int i = 0; while (f[i]!= 0) { t[i] = f[i]; i++; } t[i] = 0; return t; } Argumenten t och f är vektorer av tecken (char) och en sträng avslutas genom att sista tecknet har värdet noll. Inuti strcpy anropas subrutinen countcalls, för att räkna antalet anrop till strcpy. Talet 18 talar om för countcalls att det är just funktionen strcpy som blivit anropad. Skriv en version av strcpy i MIPS-assembler. Du ska skriva komplett assemblerkod, inklusive direktiv, och använda alla MIPS programmeringskonventioner. Kommentera noggrant, (10 p). Sidan 1 av 8. Uppgifter finns på båda sidorna.
Uppgift 3 Studera följande instruktioner i MIPS-assembler:.set noreorder beq t0, t1, cont add t0, t0, t2 Beskriv hur beq-instruktionen fungerar och vad den utför, (3 p). I vilka fall kommer add-instruktionen att utföras, (2 p)? Beskriv vilka fält maskinkoden för beq-instruktionen består av, och vilka värden fälten innehåller, (3 p). I instruktionen finns ett läge, cont. Beskriv vad som egentligen finns lagrat i motsvarande maskinkod, (2 p). Uppgift 4 Vilken skillnad är det på instruktionerna add t0, t1, t2 och addu t0, t1, t2, (2 p)? Vilken matematisk operation motsvarar det att man skiftar ett heltal 2 steg åt höger med instruktionen sra, (2 p)? Hur kan man slå på och av samtliga användardefinierade avbrott i en MIPS-processor, (2 p)? När ett avbrott i MIPS är betjänat av avbrottsrutinen, skall man hoppa tillbaks till exekveringen av det program som avbröts. Hur vet man vart man ska hoppa, (2 p)? Vad är den typiska skillnaden mellan CISC och RISC när det gäller maskininstruktionernas längd, (2 p)? Uppgift 5 Studera följande kod, skriven av den ökände MIPS-hackern Mr Larsson. Han har försökt att skriva en subrutin patch, som lägger in hackerns egen kod i ett existerande, färdigkompilerat program. Förklara hur det går till, (6 p). Det finns emellertid en bugg i koden. Vilken är den, (4 p)? Mr Larsson är också dålig på att skriva kommentarer. Han är ju trots allt en hacker. instr: jal mysub nop.globl patch.ent patch patch: la t0, instr la t1, mysub lw t2, 0(a0) lw t3, 4(a0) sw t2, 0(t1) sw t3, 4(t1) lw t2, 0(t0) lw t3, 4(t0) sw t2, 0(a0) sw t3, 4(a0).end patch.globl mysub.ent mysub mysub: nop nop # my secret code here....end mysub Lycka till! Sidan 2 av 8. Uppgifter finns på båda sidorna.
Tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Onsdagen den 10 mars 2010, klockan 08:00 13:00 å Victoriastadion 1 och 2. 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 Ideon Science Park har nya låskodsläsare med RFID-taggar. Läsare finns installerade för alla dörrar på Ideon. Mjukvaran i läsarna är dock inte korrekt. Du ska hjälpa till att designa en fungerande lösning. Läsaren fungerar så att först håller man taggen nära läsaren. När taggen har identifierats avger läsaren ett kort pip. Man ska då knappa in en privat fyrsiffrig kod. Om koden är rätt låses dörren upp. Läsaren har en RFID-enhet som skickar en signal när en tag är tillräckligt nära för att kunna läsas av. Läsaren har en knappsats som skickar en signal varje gång en knapp trycks in. När en RFID-tag läses av blir ett trettiotvåbitars värde tillgängligt på en inport. Inportens adress är definierad av konstanten RFIDVAL. Knappsatsen har knapparna 0-9. När en knapp är intryckt finns ett åttabitars värde tillgängligt på en inport. Inportens adress är definierad av konstanten BUTTVAL. Det finns en ljudenhet som avger ett svagt pip när man skriver en etta till porten BEEPADR. Det finns en realtidsklocka som skickar tidsavbrott 100 gånger i sekunden, på avbrottsingång INT1. För varje RFID-värde finns en motsvarande korrekt fyrsiffrig kod. Denna tabell ligger lokalt i läsarens minne. När tabellen ändras skickas en ny version ut via Internet till samtliga läsare, men du behöver inte ta hänsyn till detta i din lösning. Du kan anta att en korrekt tabell redan finns i datorns minne. Läsaren styrs av en MIPS-processor. Rita ett flödesschema för styrning av en läsare. Du behöver inte använda någon särskild syntax för ditt schema, men det ska klart framgå vilka olika steg som finns, samt vilka in- och utsignaler som används, (4 p). Vilka insignaler bör kopplas till avbrott och vilka bör kopplas till inportar som läses på initiativ av programmet? Lista samtliga insignaler och ange om de ska kopplas till avbrott eller inport. Beskriv även vilka utsignaler som finns, (3 p). Nuvarande läsare är felaktigt programmerade. Om man håller taggen i samma hand som den man trycker på knapparna med, händer det att läsaren läser taggen på nytt, mitt i inknappningen av en kod, varefter koden inte matchar till taggen. Förklara vad som troligen är fel och hur det kan rättas till, (3 p). Sidan 3 av 8. Uppgifter finns på båda sidorna.
Lösning 1 Programmet skall bevaka följande avbrottssignaler: Avbrott från RFID-enheten som kommer när en tag är i närheten. Avbrott från knappsatsen som kommer när en knapp trycks in. Avbrott från klockenheten Ovanstående tre signaler kopplas till avbrottsingångar. Programmet skall läsa följande inportar: RFID-identitet i form av trettiotvå bitar. Denna läses efter att avbrottet tag i närheten kommit. Identitet (siffervärde) för intryckt knapp. Denna läses efter att avbrottet för intryckt knapp kommit. Programmet skall skriva följande utsignaler: Aktivera pip, efter att RFID-identiteten lästs. Markerar för användaren att han kan börja knappa in sin fyrsiffriga kod. Öppna dörr, om den inmatade koden och RFIDidentiteten stämmer överens. När avbrottet tag i närheten har kommit och läsaren håller på att läsa in RFID-koden, ska avbrotten från knappsatsen vara avstängda. När läsaren väntar på inknappning, ska avbrottet från tag i närheten vara avstängt. Det bör finnas en timeout, som gör att användaren får börja om, om det dröjer mer än 4-5 sekunder innan nästa knapptryckning. Felet med nuvarande läsare är troligen att under den tid som inknappningen av den fyrsiffriga koden sker, är avbrottet från tag i närheten inte avstängt. Om användaren håller taggen i samma hand som han knappar in koden med, kommer taggen lätt för nära läsaren, som då vill början om med första siffran igen. Lösningen är att (som ovan rekommenderats) slå av avbrottet för tag i närheten under tiden användaren knappar in sin kod. Uppgiften är verklighetsbaserad. Felet med taggen som läses om och om igen när den kommer nära, trots att man håller på att knappa in koden, verkade finnas i det system som används på Ideon, men är numera rättat. Verkligheten är full av undermåliga tekniska lösningar. Sidan 4 av 8. Uppgifter finns på båda sidorna.
Uppgift 2 I C finns en standardfunktion strcpy som kopierar en teckensträng (f) till en annan (t). Den är deklarerad så här: char *strcpy(char *t, char *f) { int i = 0; while (f[i]!= 0) { t[i] = f[i]; i++; } t[i] = 0; return t; } Argumenten t och f är vektorer av tecken (char) och en sträng avslutas genom att sista tecknet har värdet noll. Inuti strcpy anropas subrutinen countcalls, för att räkna antalet anrop till strcpy. Talet 18 talar om för countcalls att det är just funktionen strcpy som blivit anropad. Skriv en version av strcpy i MIPS-assembler. Du ska skriva komplett assemblerkod, inklusive direktiv, och använda alla MIPS programmeringskonventioner. Kommentera noggrant, (10 p). Lösning 2.globl strcpy.ent strcpy strcpy: subu sp, sp, 16 sw ra, 8(sp) sw a0, 4(sp) sw a1, 0(sp) repeat: lb t0, 0(a1) sb t0, 0(a0) beq t0, zero, ready addi a0, a0, 1 addi a1, a1, 1 b repeat ready: ori a0, zero, 18 jal countcalls lw a1, 0(sp) lw a0, 4(sp) lw ra, 8(sp) addu sp, sp, 16 or v0, a0, a0.end strcpy # strcpy is a global name # strcpy is a subroutine # reserve 4 words on the stack # save return address # save first argument, t # save second argument, f # fetch next char from string f # store char in string t # ready if char is null # set a0 to point at next char in t # set a1 to point at next char in f # repeat # place 18 as argument # call subrutine countcalls # restore second argument # restore first argument # restore return address # return stack space # strcpy should return address to t # jump back to caller # that s all, folks Den här versionen av strcpy anropar en okänd subrutin countcalls. Man måste därför följa samtliga programmeringskonventioner för MIPS. Man vet ju inte vilka register som används inne i countcalls eller andra subrutiner som eventuellt anropas från den. Subrutinen strcpy är en existerande standardrutin i C, och är definierad som i uppgiften. Metoden att använda värdet noll för att markera slutet på en textsträng är standardmetoden för enkla textsträngar i språket C och operativsystemet Unix (och därför alltså även Linux). Sidan 5 av 8. Uppgifter finns på båda sidorna.
Uppgift 3 Studera följande instruktioner i MIPS-assembler:.set noreorder beq t0, t1, cont add t0, t0, t2 Beskriv hur beq-instruktionen fungerar och vad den utför, (3 p). I vilka fall kommer add-instruktionen att utföras, (2 p)? Beskriv vilka fält maskinkoden för beq-instruktionen består av, och vilka värden fälten innehåller, (3 p). I instruktionen finns ett läge, cont. Beskriv vad som egentligen finns lagrat i motsvarande maskinkod, (2 p). Lösning 3 Studera följande instruktioner i MIPS-assembler:.set noreorder beq t0, t1, cont add t0, t0, t2 Beskriv hur beq-instruktionen fungerar och vad den utför, (3 p). Instruktionen jämför innehållen i register t0 och t1. Om de är lika hoppar exekveringen till läget cont, och annars fortsätter den bara med följande instruktioner. I vilka fall kommer add-instruktionen att utföras, (2 p)? Den utförs alltid. Om exekveringen ska hoppa till cont, körs ändå den instruktion som ligger direkt efter beq. Notera att det är direktivet noreorder som gäller. Beskriv vilka fält maskinkoden för beq-instruktionen består av, och vilka värden fälten innehåller, (3 p). Maskininstruktionen innehåller fyra fält: Fält 1: operationskoden för instruktionen beq, sex bitar, värde 000100. Fält 2: nummer på första registret, fem bitar, värde 8 eller 01000, (t0 = $8). Fält 3: nummer på andra registret, fem bitar, värde 9 eller 01001, (t1 = $9). Fält 4: ett tal som anger hopp ett antal instruktioner framåt eller bakåt, sexton bitar. Uppgiften innehåller inte tillräckligt med information för att ange ett binärt värde för Fält 4. I instruktionen finns ett läge, cont. Beskriv vad som egentligen finns lagrat i motsvarande maskinkod, (2 p). Ett sexton bitars heltal i tvåkomplement, som anger hur många instruktioner framåt eller bakåt vi ska hoppa, från nästa instruktion. Assemblern räknar ut detta värde vid assembleringen. Sidan 6 av 8. Uppgifter finns på båda sidorna.
Uppgift 4 Vilken skillnad är det på instruktionerna add t0, t1, t2 och addu t0, t1, t2, (2 p)? Vilken matematisk operation motsvarar det att man skiftar ett heltal 2 steg åt höger med instruktionen sra, (2 p)? Hur kan man slå på och av samtliga användardefinierade avbrott i en MIPS-processor, (2 p)? När ett avbrott i MIPS är betjänat av avbrottsrutinen, skall man hoppa tillbaks till exekveringen av det program som avbröts. Hur vet man vart man ska hoppa, (2 p)? Vad är den typiska skillnaden mellan CISC och RISC när det gäller maskininstruktionernas längd, (2 p)? Lösning 4 Vilken skillnad är det på instruktionerna add t0, t1, t2 och addu t0, t1, t2, (2 p)? Instruktionen add testar resultatet för aritmetiskt fel (overflow), men det gör inte addu. Vilken matematisk operation motsvarar det att man skiftar ett heltal 2 steg åt höger med instruktionen sra, (2 p)? Division med fyra. Hur kan man slå på och av samtliga användardefinierade avbrott i en MIPS-processor, (2 p)? Man sätter den minst signifikanta biten i statusregistret till 1 (avbrott på) eller 0 (avbrott av). Biten kallas Interrupt Enable, IE. När ett avbrott i MIPS är betjänat av avbrottsrutinen, skall man hoppa tillbaks till exekveringen av det program som avbröts. Hur vet man vart man ska hoppa, (2 p)? Registret EPC innehåller adressen till den instruktion där exekveringen ska återupptas. Man hoppar dit med instruktionen jr. Vad är den typiska skillnaden mellan CISC och RISC när det gäller maskininstruktionernas längd, (2 p)? I en CISC-processor kan instruktionerna vara olika långa, men i en RISC-processor har de alla samma längd. Sidan 7 av 8. Uppgifter finns på båda sidorna.
Uppgift 5 Studera följande kod, skriven av den ökände MIPS-hackern Mr Larsson. Han har försökt att skriva en subrutin patch, som lägger in hackerns egen kod i ett existerande, färdigkompilerat program. Förklara hur det går till, (6 p). Det finns emellertid en bugg i koden. Vilken är den, (4 p)? Mr Larsson är också dålig på att skriva kommentarer. Han är ju trots allt en hacker. instr: jal mysub nop.globl patch.ent patch patch: la t0, instr la t1, mysub lw t2, 0(a0) lw t3, 4(a0) sw t2, 0(t1) sw t3, 4(t1) lw t2, 0(t0) lw t3, 4(t0) sw t2, 0(a0) sw t3, 4(a0).end patch.globl mysub.ent mysub mysub: nop nop # my secret code here....end mysub Lösning 5 Subrutinen patch lägger in ett anrop (jal) till subrutinen mysub, någonstans i maskinkoden till ett befintligt program. Subrutinen får en viss adress som argument i register a0. Först flyttas den instruktion som ligger på adressen a0 och nästföljande instruktion till början av subrutinen mysub, där det finns plats i form av två noppar. Sedan läggs två andra instruktioner in på de tomma platserna, nämligen jal och nop. Effekten blir att när det existerande programmet körs, och exekveringen kommer till adressen som angavs i a0, hoppar exekveringen till mysub, där det första som händer är att de två flyttade instruktionerna körs. Sedan körs den kod hackern placerat vid # my secrect code here... Till sist hoppar exekveringen tillbaks till det ursprungliga programmet. Detta är ett sätt att lägga in hemlig kod i ett existerande program, en så kallad trojansk häst. Metoden används också för att skicka uppdateringar till levererad programvara, och kallas då en patch. Hackern har dock slarvat. Hoppinstruktionen jal skriver ju över registret $31 eller ra. Om det existerande programmet vill använda värdet i ra kan det ha blivit förstört. För att göra en fungerande patch borde hackern ha lagt in en instruktion som sparade ra före jal-instruktionen. Sidan 8 av 8. Uppgifter finns på båda sidorna.