Computer Architecture, First Course
Assembly 2: Mobile Phones, Calculators, and SPIM's Memory-Mapped I/O
Den här uppgiften går ut på att skriva en simulator för en miniräknare som brukar finnas i många mobiltelefoner. Inlämningsuppgiften syftar till att framförallt ge övning i att skriva enkla I/O rutiner för inmatning och utmatning i MIPS.
-
1. Bakgrund
-
2. Ledtrådar
-
3. Exempel på en körning med programmet
-
4. Utförande
-
5. Möjlig (frivillig) utökning #1
-
6. Möjlig (frivillig) utökning #2
1. Bakgrund
All in- och utmatning måste ske programstyrt (även kallat pollad-I/O, eller memory mapped I/O). Beskrivning av hur programstyrt I/O fungerar i praktiken på SPIM simulatorn står i avsnitt A.8 av Hennessy & Patterson, Appendix A. Lägg särskilt märke till vad som står i det sista stycket. Notera skillnaden mellan polling och interrupts. Det är polling som ska implementeras; interrupts är också möjliga att simulera i SPIM men själva programmeringen är lite svårare.
Endast korrekt indata ska tillåtas, och i enkla mobiler betyder det endast siffror 0,1,2,...,9, samt räkneoperationerna +,-,*, och /. Även tre andra tecken ska kunna användas: y = "Yes"-knappen, n = "No"-knappen, och x = "Avsluta programmet"-knappen (se exempel nedan). Alla andra tecken ska ignoreras (skall inte skrivas ut).
I fall ni inte har en mobil så finns det några "virtuella" mobiler på webben, prova t.ex. Sony Ericsson T100 (klicka på "Testa telefonen" i menyn till vänster). Dessa sidor kräver dock vissa plugin som normalt finns installerade i flera webbläsare.
I den här uppgiften skall endast positiva heltal hanteras. Programmet behöver inte klara av att räkna ihop tal vars resultat blir större än 2147483647 (2^31 - 1), och det får inte använda några systemanrop (syscalls).
2. Ledtrådar
Det kan vara trixigt att få den pollade in- och utmatningen att fungera. Därför rekommenderas att lösningen delas upp i två programmeringssteg. Skriv/testa först rutinerna för pollad-I/O. Skriv sedan resten av programmet/simulatorn som använder sig av de nya rutinerna.
3. Exempel på en körning med programmet
Tecken inom parenteser, t.ex. [y] (visa resultat), är "osynliga" tecken som styr miniräknarens funktioner. Det är alltså endast vänster kolumnen nedan som skall skrivas ut.
Calculator 0 123 [+] (addera) 123+256 [*] (multiplicera) 379*1111 [y] (visa resultat) =421069 [/] (dela) 421069/3 [y] (visa resultat) =140356 [n] (nollställ miniräknare) 0 5 [*] 5*10 [-] 50-42 [y] 8 [x] Good Bye!
4. Utförande
Först och främst (som alla redan vet): tänk först innan ni börjar med kodningen! Det kommer att spara er mycket tid. I den här uppgiften har ni mycket frihet för att strukturera koden. Programmet kan naturligtvis använda sig av proceduren int_to_string (från förra uppgiften). Ni kan t.ex. skriva det mesta i main, eller använda rutiner för att dela upp lösningen i mindre delar.
Utgå t.ex. från följande kod-exempel:
############################################################ ############################################################ ## ## DARK1, Fall 2004, Distance -- Calculator Simulator ## ## AUTHOR(S): ... write your name(s) and e-mail(s) here ... ## DATE: ... write the date ... ## ############################################################ ############################################################ ############################################################ ## Data Segment ############################################################ .data ### ... reserve your data/variables here ... ############################################################ ## Text Segment ############################################################ .text .globl main #----------------------------------------------------------- # Main Start #----------------------------------------------------------- main: addi $sp, $sp, -4 # make room for 1 item on stack sw $ra, 0($sp) # save return address ### ... write your code here ... exit: lw $ra, 0($sp) # restore return address addi $sp, $sp, 4 # pop sp jr $ra # return to caller #----------------------------------------------------------- # Main End #----------------------------------------------------------- #----------------------------------------------------------- # PROCEDURE: int_to_string # # DESCRIPTION: This procedure converts an integer to a # string. It assumes that the string is large # enough for the number, and that the number # is smaller than 2147483648. The end-of-string # should be marked with a null-byte. The # maximum string length should though be 11 # bytes (10 for digits + 1 for null-byte). # # INPUT: $a0 - the number to be converted # $a1 - the address of the string # # OUTPUT: None. #----------------------------------------------------------- int_to_string: ### ... same as in Ass#1 ... jr $ra # return to caller
5. Möjlig (frivillig) utökning #1
Naturligtvis vill användaren av miniräknaren kunna hantera negativa tal. Utöka int_to_string så att även negativa tal hanteras korrekt.
6. Möjlig (frivillig) utökning #2
Hantera overflow. Vid overflow kan t.ex. texten "Too large value entered" skrivas ut.