Ub2_A3.s addiereMehrereZahlen

Help Contents DLX-Beispielprogramme Ub2_A3.s addiereMehrereZahlen
Ub2_A2c.s addiereZweiZahlen Ub3_A1.s Summen

Ub2_A3.s addiereMehrereZahlen



; Systemnahe Informatik 2004 2.Uebung Aufgabe 3

; Hauptprogramm ÜB2_A3.s:
; berechnet die Summe mehrerer Zahlen.
; Zunächst wird die Anzahl der Zahlen über die Tastatur eingelesen,
; dann werden die Zahlen eingelesen und addiert.
; Eine Zwischensumme wird nach jeder Addition ausgegeben.

		.data
Anzahl:		.space	4

		.text
		.global	main
main:
		jal	liesAnzahl
		nop
		sw	Anzahl,r1
		sw	Wert,r0

Schleife:	jal	liesZahl
		nop
		jal	Addieren
		nop
		jal	gibWertAus
		nop
		lw	r1,Anzahl
		subi	r1,r1,1
		sw	Anzahl,r1
		bnez	r1,Schleife
		trap	0

; Systemnahe Informatik 2.Uebung Aufgabe 1b
; Addiert r1 zu Wert
		.data
Wert:		.word	64
Save:		.word	0

		.text
		.global	Addieren
Addieren:	sw	Save,r2
		lw	r2,Wert
		add	r2,r1,r2	; r2:=r1+Wert
		sw	Wert,r2
		lw	r2,Save
		jr	r31
		nop
		nop

; Systemnahe Informatik 2.Uebung Aufgabe 2a
; gibt Wert aus
		.data
Save1:		.space	4
Save14:		.space	4

FormatStr:	.asciiz	"Summe: %d\n"
		.align	2
TextAdr:	.word	FormatStr
AusgabeZahl:	.space	4

		.text
		.global gibWertAus
gibWertAus:	sw	Save1,r1
		sw	Save14,r14
		lw	r1,Wert
		sw	AusgabeZahl,r1
		addi	r14,r0,TextAdr
		trap	5
		lw	r1,Save1
		lw	r14,Save14
		jr	r31
		nop
		nop

; Systemnahe Informatik 2.Uebung Aufgabe 2b
; liest eine Zahl ein. benötigt Modul INPUT.s

		.data
Prompt:		.asciiz	"Geben Sie eine Zahl ein : "
		.align	2
save31:		.space	4

		.text

		.global liesZahl
liesZahl:	nop
		nop
		sw	save31,r31
		addi	r1,r0,Prompt
		jal	InputUnsigned
		nop
		lw	r31,save31
		jr	r31
		nop

; liest die Anzahl ein. benötigt Modul INPUT.s

		.data
Prompt2:	.asciiz	"Geben Sie die Anzahl der aufzusummierenden Zahlen ein : "
		.align	2
save31n:	.space	4

		.text

		.global liesAnzahl
liesAnzahl:	nop
		nop
		sw	save31n,r31
		addi	r1,r0,Prompt2
		jal	InputUnsigned
		nop
		lw	r31,save31n
		jr	r31
		nop

; INPUT.s
;*********** WINDLX Bsp.1: Einlesen eines positiven Integerwerts *************

;-----------------------------------------------------------------------------
;Unterprogrammaufruf bei Symbol InputUnsigned
;Erwartet in R1 die Adresse eines mit 0 abgeschlossenen Prompt-Strings
;Liefert in R1 den eingelesenen, positiven Integerwert zurueck.
;Veraendert die Register R1, R13, R14
;-----------------------------------------------------------------------------

		.data

		;*** Daten für Read-Trap
ReadBuffer:	.space		80
ReadPar:	.word		0,ReadBuffer,80

		;*** Daten für Printf-Trap
PrintfPar:	.space		4

SaveR2:		.space		4
SaveR3:		.space		4
SaveR4:		.space		4
SaveR5:		.space		4


		.text

		.global		InputUnsigned
InputUnsigned:
		;*** Registerwerte sichern
		sw		SaveR2,r2
		sw		SaveR3,r3
		sw		SaveR4,r4
		sw		SaveR5,r5

		;*** Prompt ausgeben
		sw		PrintfPar,r1
		addi		r14,r0,PrintfPar
		trap		5

		;*** Trap-3 zum Einlesen einer Zeile aufrufen
		addi		r14,r0,ReadPar
		trap		3

		;*** Zahl ermitteln
		addi		r2,r0,ReadBuffer
		addi		r1,r0,0
		addi		r4,r0,10	;Dezimalsystem

Loop:		;*** Bis das Zeilenende erkannt wird Zeichen als Ziffern beh.
		lbu		r3,0(r2)
		seqi		r5,r3,10	;LF -> Exit
		bnez		r5,Finish
		subi		r3,r3,48	;´0´
		multu		r1,r1,r4	;Shift um eine Dezimalstelle
		add		r1,r1,r3	;Neue Einerstelle hinzu
		addi		r2,r2,1		;Zeichenpointer inkrementieren
		j		Loop

Finish:		;*** Alte Registerwerte laden und zurueck
		lw		r2,SaveR2
		lw		r3,SaveR3
		lw		r4,SaveR4
		lw		r5,SaveR5
		jr		r31		; Return

Ub2_A2c.s addiereZweiZahlen Ub3_A1.s Summen