.data
str1:.asciiz "\nInsert a number in hexadecimal: "
str2:.asciiz "\nDecimal value: "
newline:.asciiz "\n"
hex: .space 33
strsize: .word 0
.text
.globl main
main:
li $v0,4 #prints str1
la $a0,str1
syscall
li $v0,8 #reads string
la $a0,hex
li $a1,32
syscall
li $v0,4 #prints str2
la $a0,str2
syscall
jal fixstr #replace \n with \0
jal converthex #converts to decimal
move $a0,$v0
li $v0,1
syscall
li $v0,4 #prints newline
la $a0,newline
syscall
li $v0,10 #exit
syscall
fixstr:
la $t0,hex
li $t1,0
li $t3,10 # new line \n
loop:
lb $t2,($t0)
beq $t2,$t3,foundnewline
addi $t0,$t0,1
addi $t1,$t1,1
j loop
foundnewline:
sb $zero,($t0)
sw $t1,strsize
jr $ra
hexchar2dec:
li $t0,47
blt $a0,$t0,terminate
li $t0,70
bgt $a0,$t0,terminate
li $t0,57
ble $a0,$t0,ok
li $t0,65
blt $a0,$t0,terminate
ok: #between 48...57 or 65...70 = 0-9 or A-F
li $t0,58
blt $a0,$t0,number
addi $v0,$a0,-55
jr $ra
number:
addi $v0,$a0,-48
jr $ra
terminate:
li $v0,-1
jr $ra
power:
move $t0,$a0
beqz $t0,ret1
li $t1,1
li $t2,16
p_loop:
mul $t1,$t1,$t2
addi $t0,$t0,-1
beqz $t0,done
j p_loop
done:
move $v0,$t1
jr $ra
ret1:
li $v0,1
jr $ra
converthex:
la $t0,hex
li $t1,0
lw $t3,strsize
addi $t3,$t3,-1
li $t4,-1
li $t6,0 #sum
c_loop:
lb $t1,($t0)
beqz $t1,finish
move $a0,$t1
addi $sp,$sp,-8
sw $ra,0($sp)
sw $t0,4($sp)
jal hexchar2dec
lw $ra,0($sp)
lw $t0,4($sp)
addi $sp,$sp,8
beq $v0,$t4,badstring
move $t5,$v0 # save current char
move $a0,$t3 # pos
addi $sp,$sp,-16
sw $ra,0($sp)
sw $t0,4($sp)
sw $t1,8($sp)
sw $t2,12($sp)
jal power # 16^pos
lw $ra,0($sp)
lw $t0,4($sp)
lw $t1,8($sp)
lw $t2,12($sp)
addi $sp,$sp,16
mul $t5,$t5,$v0
add $t6,$t6,$t5 # sum += currentchar^16^pos
addi $t3,$t3,-1 # pos-1
addi $t0,$t0,1 # next char
j c_loop
badstring:
li $v0,-1
jr $ra
finish:
move $v0,$t6
jr $ra