![]() ![]() |
![]() ![]() |
; 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 |
![]() ![]() |
![]() ![]() |