MIPS Decimal to Hex Conversion: How To Guide

  • Thread starter Thread starter trouty323
  • Start date Start date
  • Tags Tags
    Mips
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
3 replies · 39K views
trouty323
Messages
23
Reaction score
0
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.
 
Physics news on Phys.org
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.

Code:
# 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.