MIPS Help (converting numbers to diff bases)

Click For Summary

Discussion Overview

The discussion revolves around a programming challenge related to converting numbers from various bases (specifically from base 2 to base 36) using MIPS assembly language. Participants are seeking guidance on how to modify their existing code to handle inputs that include alphanumeric characters for bases greater than 10.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes their current program that successfully converts numbers from base 2 to 10 but fails with inputs like "1A" for bases greater than 10, indicating a need for assistance in extending functionality to base 36.
  • Another participant suggests that for bases larger than 10, the program should read input as a string instead of an integer, as alphanumeric characters are not recognized as integers in MIPS.
  • There is a discussion about converting characters to their respective numeric values, with a participant mentioning the need to adjust ASCII values for characters 'A' to 'F' when processing hexadecimal inputs.
  • One participant proposes that the program should accept any base from 2 to 36, while another participant expresses a willingness to limit it to bases 2, 10, 16, and 36.
  • Another participant emphasizes the importance of correctly handling the conversion of characters in the input string based on the specified base, noting that the conversion logic should account for both digits and letters.

Areas of Agreement / Disagreement

Participants generally agree on the need to modify the input handling for bases greater than 10, but there are differing opinions on the specifics of implementation and the range of bases to support. The discussion remains unresolved regarding the best approach to achieve the desired functionality.

Contextual Notes

Participants mention limitations related to the current implementation, including the handling of alphanumeric characters and the need for adjustments in ASCII value processing for characters representing values greater than 9. There is also uncertainty about how to structure the conversion logic for various bases.

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.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 1 ·
Replies
1
Views
8K
  • · Replies 1 ·
Replies
1
Views
11K
  • · 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