# Unsigned integer division algorithm (final version) of the textbook. # Implemented in software. # Argument passing, # \$4: dividend, # \$5: divisor, # \$6: address for quotient, # \$7: address for remainder. # \$7 and \$6 is used also as a 64-bit remainder register, \$7 is the left # half and \$6 the right half. .text divide: move \$8, \$6 # \$8 and \$9 store the old value of move \$9, \$7 # of \$6 and \$7, which is the address of the results addi \$3, \$0, 0 # counter for the number of operations move \$6, \$4 # right half of the remainder reg contains dividend move \$7, \$0 # zero the left half Loop: addi \$3, \$3, 1 # one more operation # (1) Shift the remainder registers (\$7,\$6) left 1 bit as a whole 64-bit slt \$2, \$6, \$0 # left most bit in \$6 is now in \$2 sll \$6, \$6, 1 # shift the 2 words remainder left 1 bit sll \$7, \$7, 1 # ajust the bit lost in \$6 or \$7, \$7, \$2 # left most bit in \$6 gets into right most in \$7 # (2) Subtract divisor from left half of remainder subu \$7, \$7, \$5 # overflow ignored # (3) Test the remainder slt \$2, \$7, \$0 # \$2 = 1 if \$7 is negative beq \$2, \$0, Positive # implement if-else statment # (3b) Remainder < 0 quotient gets zero addu \$7, \$7, \$5 # reverse the subtraction in step (2) j Exit # jump over the code for remainder positive Positive: # (3a) Remainder >= 0 ori \$6, \$6, 1 # quotient gets a one Exit: # (4) count == 32? slti \$2, \$3, 32 # \$2 = 1 if count < 32 bne \$2, \$0, Loop # loop until count == 32 sw \$6, 0(\$8) # save results in proper addresses sw \$7, 0(\$9) j \$31