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.
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
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.
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.