MIPS Help (converting numbers to diff bases)

Click For Summary
The discussion focuses on enhancing a number conversion program to handle bases beyond 10, specifically up to base 36. The current implementation successfully converts numbers from base 2 to 10 but fails with inputs containing alphabetic characters, such as "1A," which are invalid in the current setup. To address this, it is suggested to read input as a string using syscall with $v0 set to 8, allowing the program to process both numeric and alphabetic characters. For bases greater than 10, the conversion requires adjusting ASCII values: for example, characters 'A' to 'F' need to be converted to their respective integer values (10 to 15) by subtracting 55 from their ASCII values. The program should loop through each character in the string to compute the decimal equivalent based on the specified base. The goal is to support bases from 2 to 36, where bases 11 and above will include both digits and letters.
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
 
Technology news 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.
 
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 4 ·
Replies
4
Views
1K
  • · Replies 1 ·
Replies
1
Views
8K
  • · Replies 1 ·
Replies
1
Views
10K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 4 ·
Replies
4
Views
7K
  • · Replies 5 ·
Replies
5
Views
6K
  • · Replies 4 ·
Replies
4
Views
5K
  • · Replies 1 ·
Replies
1
Views
7K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 20 ·
Replies
20
Views
33K