Hi Daniweb,
I am working on an assignment that is aimed to help us understand floating points. The current task is to take a number as input, example 3.5, or 2.25 etc and output it as a binary decimal, ex 11.100000000, 10.0100000000.

To do this, I am taking the whole number and floating point seperately, converting them seperately and storing them seperately. The whole number part is working ok, however an issue is coming with the decimal part:

I am inputting it as a string, so .25 would be inputted as "25". I then convert it to binary by:

2) subtracting 48 from it to get the decimal equavalent, so '2' becomes 2
4) if the next character is either \$zero (null character) or 10 (newline character), skip to step 10
5) \$t3 contains 10, and this step it is multiplied by 10
6) repeat step 2 on \$t1
7) multiplying the number in \$t0 by 10, so \$t0 becomes 2x10 = 20
8) adding \$t0 to \$t1 so it becomes 25
9) go back to step 3
10)multiply the number in t0 by 2
11)if the result is greater than the number in \$t3 (in this case 50<100), store a 1 in memory. Else, store a 0

I also have a counter to enforce a maximum number of decimal places in binary

The problem that is arising is that when the QtSpim simulator comes to step 4, and is supposed to be loading the newline character, the number that comes in the register is 49. Hence it doesnt break out of the loop when its supposed to.

Can someone tell me whats going on? heres my code for input and conversion of the floating part of the numbers:
INPUT:

``````    la \$s1, firstdecfl

syscall         #input decimal part, take no more than 3 digits, store in firstdec
``````

CONVERSION:

``````    addi \$t6, \$zero, 20 #max num of dec places

#first we need to merge the character array into a number
la \$t5, newline
lb \$t5, 0(\$t5)      #t5 contains newline

la \$s3, firstbinfl  #\$s3 points to character array that will hold binary notation floating point
la \$s1, firstdecfl  #s1 points to char array that holds decimal notation floating point

lb \$t0, 0(\$s1)      #bring the nextfloat character into register
addi \$t0, \$t0, -48  #convert it to number

addi \$t3, \$zero, 10 #to compare if decimal values have exceeded two places, and also used to check for newline(=10) character, as well as multiply while merging
addi \$s1, \$s1, 1    #move to next char
addi \$t4, \$zero, 10 #will be 10^n where n is number of decimal places, or digits in firstdecl. Will be used to divide the dec floating point
concat:

lb \$t2, 0(\$s1)

beq \$t2, \$t5    firstflconv
beq \$t2, \$zero, firstflconv

mult \$t3, \$t4
mflo \$t4

addi \$t2, \$t2, -48  #else repeat for the one after that

mult \$t0, \$t3   #multiply the first digit by 10
mflo \$t1
add \$t1, \$t1, \$t2   #and add the second digit to it, so '2', '5' will become 2*10+5 = 25, store in t0

j concat

firstflconv:
beq \$t6, \$zero, printdot
sll \$t0, \$t0, 1     #multiply by two
bge \$t0, \$t4, storeone

storezero:
sb \$t5, 0(\$s3)      #store '0'
addi \$s3, \$s3, 1    #move pointer to next byte

blt \$t0, \$t4, firstflconv

storeone:
sb \$t5, 0(\$s3)      #store '1'

div \$t0, \$t4
mfhi \$t0        #restandardize the comparison numbers
blt \$t0, \$t4, firstflconv
``````

Print:

``````printdot:
addi \$t6, \$zero, 20 #max dec places again
la \$s3, firstbinfl
syscall

printdecs:
lb \$a0, 0(\$s3)
syscall
addi \$t6, \$t6, -1   #reduce counter
bne \$t6, \$zero, printdecs
``````

Alright turns out there is no problem in this code. There was a problem with how i was storing my strings. The SPIM compiler was storing them in adjacent memory bytes as i had initialized them as

`num1 .asciiz ""`
and
`num2 .asciiz ""`

and somewhere between the first two snippets of code above, I was changing a value using a register that I thought was pointing to num1, however since num2 was right next to it, and it had recently incremented, it actually changed the value of num2. The solution was just to increase the spaces between the quotes in the initialization :)

Be a part of the DaniWeb community

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