newassemblyuser 0 Newbie Poster

Hello Everyone:
I am new to assembly and am trying to learn division and multiplication . I have the code below that I wrote to perform unsigned division, I have looked it over in detail but cant figure out what I'm doing wrong. Note that for division the divisor apparently needs to start in the left half of the 64 bit register but I cant figure out what that means for my algorithm below:

# This program performs restorative division
# based on the quotient, remainder and the dividend
# and the divisor

# STRING CONSTANTS
.data
GETA : .asciiz "Enter A "
GETB : .asciiz "Enter B "
NL : .asciiz "\n"
ERR : .asciiz "Divide by zero error\n"
preshiftmsg: .asciiz "Preshift value="
postshiftmsg: .asciiz "Postshift value="
iniRemMsg: .asciiz "Initial remainder before shifting="
preRemMsg: .asciiz "Initial remainder="
postRemMsg: .asciiz "Final remainder="
preDivMsg: .asciiz "The initial divisor="
divisorMsg: .asciiz "The shifted divisor="
remainder: .word 0
quotient: .word 0
dividend: .word 0
divisor: .word 0
repetitions: .word 32
QMSG : .asciiz "Q = "
RMSG : .asciiz "R = "

.text
.globl main

main:

# read in the first number
li $v0,4
la $a0,GETA
syscall

# store the integer in a register
li $v0,5
syscall
move $s0,$v0

# enter a newline
li $v0,4
la $a0,NL
syscall

li $v0,4
la $a0,GETB
syscall


# store the second integer in a register
li $v0,5
syscall
move $s1,$v0

# The restoring division algorithm
# Step 1: subtract the divisor register from the remainder register
# and place the result in the remainder register
# Step 2: if (remainder>=0)
# {
# shift the quotient register to the left
# setting the new rightmost bit to 1
# }
# else
# {
# restore the original value by adding
# the divisor register to the remainder
# and place the sum in the remainder register
# Shift quotient register to the left setting
# the new least significant bit to 0
# }
# Step 3: Shift the Divisor register right 1 bit
# Step 4: if less than 33rd repetition repeat
# Step 5 :else
# Step 6: quit
# $s0 = Dividend
# $s1 = Divisor
# $s2 = Remainder
# $s3 = quotient
# $s4 = Repetitions

Start:
li $s4,32
move $s2,$s0

Loop:
#li $v0,1
#move $a0,$s2
#syscall
#move $s2,$a0
#li $v0,4
#la $a0,NL
#syscall

li $v0,1
move $a0,$s3
syscall
move $s3,$a0
li $v0,4
la $a0,NL
syscall


sub $s2,$s2,$s1
bltz $s2,Label2b
sll $s3,$s3,1
ori $s3,$s3,1
j Label3

Label2b:
add $s2,$s2,$s1
sll $s3,$s3,1

Label3:
srl $s1,$s1,1
addi $s4,$s4,-1
bgtz $s4,Loop


end:
li $v0,4
la $a0,QMSG
syscall

li $v0,1
move $a0,$s3
syscall

# enter a newline
li $v0,4
la $a0,NL
syscall

# print the remainder message
li $v0,4
la $a0,RMSG
syscall

# print the remainder
li $v0,1
move $a0,$s2
syscall

# enter a newline
li $v0,4
la $a0,NL
syscall

#exit
li $v0,10
syscall

An extra pair of eyes would be much appreciated.

Thanks Again

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.18 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.