PDA

View Full Version : MIPS Decimal to Hex


trouty323
Apr6-11, 07:49 PM
Hello. I was simply wondering if anyone has any idea on how to write a MIPS code to convert a decimal number to its hexadecimal equivalent. I have no idea on how I would go about this. Should I be trying to manipulate the ASCII values in some way? Or should I use some sort of shift/rotation method? I simply do not know the algorithm for completing this task. I'm completely lost.

Grep
Apr6-11, 10:36 PM
You mean integers, I take it? Not floating point?

The wiki on hexadecimal goes through how to convert from base-10 to base-16, and should have what you want:

http://en.wikipedia.org/wiki/Hexadecimal

trouty323
Apr7-11, 03:12 PM
The easiest way that I found was to have the user enter in an integer. I would then use a rotation instruction to rotate it 4 bits to the left. I would then mask those four bits with 0xf(1111). If those 4 digits were less than or equal to 9, I would add 48 to it to get the ASCII value. If it was 10 or above, I would add 55 to it. Here is my code in case anyone was wondering.


# Write a MIPS code that asks the user for decimal number
# Convert it to hex and print the result

.data

prompt: .asciiz "Enter the decimal number to convert: "
ans: .asciiz "\nHexadecimal equivalent: "
result: .space 8

.text
.globl main

main:

la $a0, prompt
li $v0, 4
syscall

li $v0, 5
syscall

move $t2, $v0

la $a0, ans
li $v0, 4
syscall

li $t0, 8 # counter
la $t3, result # where answer will be stored

Loop:

beqz $t0, Exit # branch to exit if counter is equal to zero
rol $t2, $t2, 4 # rotate 4 bits to the left
and $t4, $t2, 0xf # mask with 1111
ble $t4, 9, Sum # if less than or equal to nine, branch to sum
addi $t4, $t4, 55 # if greater than nine, add 55

b End

Sum:

addi $t4, $t4, 48 # add 48 to result

End:

sb $t4, 0($t3) # store hex digit into result
addi $t3, $t3, 1 # increment address counter
addi $t0, $t0, -1 # decrement loop counter

j Loop

Exit:

la $a0, result
li $v0, 4
syscall

la $v0, 10
syscall

Mark44
Apr9-11, 12:33 PM
Your program seems to work correctly, although I have done only minimal testing. One thing you should change is your next to last line. Instead of la $v0, 10, you should have li $v0, 10.