MIPS Help (converting numbers to diff bases)

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
5 replies · 10K views
CsRookie
Messages
3
Reaction score
0
Alright, I have a program that converts numbers from base 2-10 and it works just fine but I can not get the program to convert past base 10 whenever i input any char such as 1A it says invalid input. I have tried changing some of the lines in the code but it ends with errors. Right now it is error free for up to base 10. What direction do i need to be looking into in order to get this to convert up to base 36. Thanks in advance for the help! :smile:

Code:
	.data
msg1: .asciiz "Please insert value (A > 0) : "
msg2: .asciiz "Please insert the number system B you want to 
convert to (2<=B<=10): "
#Above sting must be in one line
msg3: .asciiz "\nResult : "
.text
.globl main
main:
addi $s0,$zero,2
addi $s1,$zero,10
getA:

li $v0,4
la $a0,msg1
syscall
li $v0,5
syscall
blt $v0,$zero,getA

move $t0,$v0
getB:

li $v0,4
la $a0,msg2
syscall
li $v0,5
syscall
blt $v0,$s0,getB
bgt $v0,$s1,getB

add $t1,$zero,$v0

li $v0,4
la $a0,msg3
syscall

add $a0,$zero,$t0
add $a1,$zero,$t1

jal convert

li $v0,10
syscall

convert:
#a0=A
#a1=B

addi $sp,$sp,-16

sw $s3,12($sp) #counter,used to know
#how many times we will pop from stack
sw $s0,8($sp) #A
sw $s1,4($sp) #B
sw $ra,0($sp)

add $s0,$zero,$a0
add $s1,$zero,$a1

beqz $s0,end

div $t4,$s0,$s1 #t4=A/B
rem $t3,$s0,$s1 #t3=A%B
add $sp,$sp,-4
sw $t3,0($sp) #save t3

add $a0,$zero,$t4 #pass A/B
add $a1,$zero,$s1 #pass B
addi $s3,$s3,1
jal convert        #call convert

end:

lw $ra,0($sp)
lw $s1,4($sp)
lw $s0,8($sp)
lw $s3,12($sp)
beqz $s3,done
lw $a0,16($sp)
li $v0,1
syscall
done: 
addi $sp,$sp,20
jr $ra   #return
 
on Phys.org
CsRookie said:
Alright, I have a program that converts numbers from base 2-10 and it works just fine but I can not get the program to convert past base 10 whenever i input any char such as 1A it says invalid input. I have tried changing some of the lines in the code but it ends with errors. Right now it is error free for up to base 10. What direction do i need to be looking into in order to get this to convert up to base 36. Thanks in advance for the help! :smile:

Code:
	.data
msg1: .asciiz "Please insert value (A > 0) : "
msg2: .asciiz "Please insert the number system B you want to 
convert to (2<=B<=10): "
#Above sting must be in one line
msg3: .asciiz "\nResult : "
.text
.globl main
main:
addi $s0,$zero,2
addi $s1,$zero,10
getA:

li $v0,4
la $a0,msg1
syscall
li $v0,5
syscall
blt $v0,$zero,getA

move $t0,$v0
getB:

li $v0,4
la $a0,msg2
syscall
li $v0,5
syscall
blt $v0,$s0,getB
bgt $v0,$s1,getB

add $t1,$zero,$v0

li $v0,4
la $a0,msg3
syscall

add $a0,$zero,$t0
add $a1,$zero,$t1

jal convert

li $v0,10
syscall

convert:
#a0=A
#a1=B

addi $sp,$sp,-16

sw $s3,12($sp) #counter,used to know
#how many times we will pop from stack
sw $s0,8($sp) #A
sw $s1,4($sp) #B
sw $ra,0($sp)

add $s0,$zero,$a0
add $s1,$zero,$a1

beqz $s0,end

div $t4,$s0,$s1 #t4=A/B
rem $t3,$s0,$s1 #t3=A%B
add $sp,$sp,-4
sw $t3,0($sp) #save t3

add $a0,$zero,$t4 #pass A/B
add $a1,$zero,$s1 #pass B
addi $s3,$s3,1
jal convert        #call convert

end:

lw $ra,0($sp)
lw $s1,4($sp)
lw $s0,8($sp)
lw $s3,12($sp)
beqz $s3,done
lw $a0,16($sp)
li $v0,1
syscall
done: 
addi $sp,$sp,20
jr $ra   #return

If your number base is larger than 10, it will use letters instead of numerals. So for example, if the base is 16, a possible input number might be AF2. You are using syscall with $v0 set to 5 to read an integer, but AF2 isn't considered an integer. (It has nonnumeric characters.) To input a number in a base larger than 10 you're going to have to read the number in as a string (syscall with $v0 set to 8), and then process the characters in the string.
 
Mark44 said:
If your number base is larger than 10, it will use letters instead of numerals. So for example, if the base is 16, a possible input number might be AF2. You are using syscall with $v0 set to 5 to read an integer, but AF2 isn't considered an integer. (It has nonnumeric characters.) To input a number in a base larger than 10 you're going to have to read the number in as a string (syscall with $v0 set to 8), and then process the characters in the string.

I am still having trouble getting this run properly.

I have tried to change syscall and make it so that if the ints are greater than 9 then add 55 to process the ascii code for it but I can not get this to compile correctly.

Does anyone have any examples or links with helpful info?
 
CsRookie said:
I am still having trouble getting this run properly.

I have tried to change syscall and make it so that if the ints are greater than 9 then add 55 to process the ascii code for it but I can not get this to compile correctly.
Adding 55 won't work. Suppose you have entered 16 for the base (hexadecimal). If the number string contains the character 'A', you need to convert this to 10 by subtracting 55 from the ASCII value of 'A' (which is 65). If the character is A through F, subtract 55 to get 10 through 15.

If you need to work with bases other than 16 that are larger than 10, you need to adjust things accordingly.

How many different bases are you going to accept in your program?
CsRookie said:
Does anyone have any examples or links with helpful info?
 
Mark44 said:
Adding 55 won't work. Suppose you have entered 16 for the base (hexadecimal). If the number string contains the character 'A', you need to convert this to 10 by subtracting 55 from the ASCII value of 'A' (which is 65). If the character is A through F, subtract 55 to get 10 through 15.

If you need to work with bases other than 16 that are larger than 10, you need to adjust things accordingly.

How many different bases are you going to accept in your program?

The idea was to accept any base from 2-36

but I would be perfectly fine getting it to accept bases
2,10,16,36
 
So what you need to do in your program is enter the base B (syscall with an integer value).

If 2 <= B <= 10, the input string will consist of decimal digits.
If B >= 11, the input string will consist of decimal digits and alpha characters. If B == 36, the digits will be 0, 1, 2, ..., 8, 9, A, B, C, ..., X, Y, Z, with A == 10, B = 11, ..., Y = 34, Z = 35. What I said before about subtracting 55 to get the value of a digit that is an alpha character still applies.

In base-36, to convert 2AY to decimal, this is 2*(36)^2 + 10 * (36) + 34. The best way to do the conversion is to loop through the characters in the string.