Ub5_A2b.s Division mit Rest 2

Help Contents DLX-Beispielprogramme Ub5_A2b.s Division mit Rest 2
Ub5_A2a.s Division mit Rest 1 Ub5_A3.s Quersumme

Ub5_A2b.s Division mit Rest 2

; Systemnahe Informatik 2004 Uebung 5 Aufgabe 2b
; Division mit Rest mit Shift-Operationen
; r1=r1/r2, r2=r1 mod r2

		.data
Dividend:	.word 100
Divisor:	.word 3

		.text
main:		lw r1,Dividend
		lw r2,Divisor
		jal Division
		trap 0

		.data
DivSave3:	.space 4
DivSave4:	.space 4
DivSave5:	.space 4
DivSave6:	.space 4
		.text
Division:	sw DivSave3,r3
		sw DivSave4,r4
		sw DivSave5,r5
		sw DivSave6,r6
		beqz r2,Division_durch_Null
		sgt r3,r2,r1	;r3=(Divisor>Divident)
		bnez r3,nur_Rest
		add r3,r2,r0	;r3=Divisor
		add r5,r0,r0	;r5=i=0
while_shift:	sgt r4,r3,r1	;r4=(r3>r1)
		bnez r4,after_while_shift
		addi r5,r5,1	;i++
		slli r3,r3,1	;r3=r3<<1
		j while_shift
after_while_shift:
		subi r5,r5,1	;i--
		add r4,r0,r0	;r4=Quotient
		addi r6,r0,1	;r6=1
		sll r6,r6,r5	;r6=r6<>
		sll r2,r2,r5	;r2=Divisor<>
Div_Schleife:	sle r3,r2,r1	;r3=(r2<=Dividend)	//>>
		beqz r3,greater
		sub r1,r1,r2	;r1=Dividend-(Divisor<>j
		add r4,r4,r6	;Quotient+=Mask
greater:	beqz r5,Division_end	;Sprung wenn i==0
		srli r2,r2,1	;(Divisor<>1
		srli r6,r6,1
		subi r5,r5,1	;i--
		j Div_Schleife
Division_end:	add r2,r1,r0	;r2=Remainder
		add r1,r4,r0	;r1=Quotient
		lw r3,DivSave3
		lw r4,DivSave4
		lw r5,DivSave5
		lw r6,DivSave6
		jr  r31

nur_Rest:	add r4,r0,r0
		j Division_end

Division_durch_Null:
		trap 0

Ub5_A2a.s Division mit Rest 1 Ub5_A3.s Quersumme