Ub3_A1.s Summen

Help Contents DLX-Beispielprogramme Ub3_A1.s Summen
Ub2_A3.s addiereMehrereZahlen Ub3_A2a.s C-for

Ub3_A1.s Summen

; Systemnahe Informatik 2004 Uebung 3 Aufgabe 1

; liest eine Zahl ein
; und schreibt alle Summen bis zu dieser Zahl
; ab Stelle 0x600 (=Summen) in den Speicher.

		.data
Zahl:		.space	4
Prompt:		.asciiz	"Geben Sie die Obergrenze der Summen ein: "
		.align	2

		.data	0x600
Summen:		.space	0x100

		.text
		.global	main
main:		addi	r1,r0,Prompt
		jal	InputUnsigned	;liest Zahl ein r1=Zahl
		sw	Zahl,r1

		add	r2,r0,r0	;r2=Summe=0
		addi	r3,r0,1		;r3=N=1
		addi	r4,r0,Summen	;r4=SummenPtr=&Summen

N_Schleife:	add	r2,r2,r3	;Summe+=N
		sw	(r4),r2
		addi	r4,r4,4		;SummenPtr+=4
		addi	r3,r3,1		;N++
		sle	r5,r3,r1	;r5=(N lessOrEqual Zahl)
		bnez	r5,N_Schleife
		nop
		trap	0

;*********** 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_A3.s addiereMehrereZahlen Ub3_A2a.s C-for