Skip to main content
Department of Information Technology

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

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.

T100.jpg

Updated  2004-12-01 09:58:26 by Zoran Radovic.