# Program to read numbers until a zero, printing each in hexadecimal .data .align 2 ret: .word 0 # space for return address s: .space 8 .asciiz "\n" tr: .ascii "0123456789ABCDEF" .text # Code .align 2 .globl main main: sw $ra,ret # save return address ml1: li $v0,5 # code to read number syscall # beq $v0,$0,exit # if number is 0, exit move $a0,$v0 # copy number to arg register jal itohex # convert to hex in s[] la $a0,s # prepare to print s[] li $v0,4 # code to print string syscall # print the string b ml1 # repeat exit: move $v0,$0 # zero exit status lw $ra,ret # restore return address jr $ra # return from main itohex: la $t2,s # $t2 = &s[0] (used as end test) add $t0,$t2,7 # $t0 = &s[7] (k) loop: andi $t1,$a0,0xF # $t1 = I & 0xF lb $t1,tr($t1) # $t1 = tr[I&0xF] sb $t1,0($t0) # s[k] = $t1 srl $a0,$a0,4 # I = I >> 4 addi $t0,$t0,-1 # k-- bge $t0,$t2,loop # -->loop if k>=0 jr $ra # return