# A function to compute the maximum of two numbers. They have to be passed in registers # a0 and a1 and the result will be in register a0. .equ SYS_WRITE, 64 .equ SYS_EXIT, 94 .equ STDOUT, 1 .equ SUCCESS, 1 .global _start _start: li a0, -1042 li a1, 666 call max add s0, zero, a0 # Header li a0, STDOUT la a1, msg li a2, 5 li a7, SYS_WRITE ecall # Print the "winner" add a0, zero, s0 call num_print # Exit li a0, SUCCESS li a7, SYS_EXIT ecall max: blt a0, a1, smallerfirst ret smallerfirst: add a0, zero, a1 ret num_print: addi sp, sp, -40 # create stack space sd s0, 32(sp) # store frame pointer addi s0, sp, 40 # new frame pointer addi t0, zero, 0 # initialize sign_bit addi t1, zero, 10 # divisor and new-line char addi t2, s0, -16 # t2: string[n] add a1, zero, t2 # a1: string[0] currently string[n] addi t3, zero, '\n' # '\n' char sb t3, 0(a1) # store '\n' bge a0, zero, PVE # if num >= 0 go to L1 else get absolute xori a0, a0, -1 # (num ^ -1) addi a0, a0, 1 # num + 1 addi t0, zero, 1 # set sign-bit to 1 PVE: remu t3, a0, t1 # num % 10 addi t3, t3, 48 # convert to ascii addi a1, a1, -1 # decrement start pointer sb t3, 0(a1) # store value divu a0, a0, t1 # num /= 10 blt zero, a0, PVE # if num > 0 loop beq t0, zero, print # if sign_bit = 0 go to print else, add '-' char addi t3, zero, '-' # ascii '-' addi a1, a1, -1 # decrement start pointer sb t3, 0(a1) # store '-' print: sub t4, t2, a1 # t4: len -- string[n] - string[0] addi a2, t4, 1 # len + 1 addi a0, zero, 1 # file descriptor to write to addi a7, zero, 64 # pk SYS_write ecall # transfer control to os ld s0, 32(sp) # restore frame pointer addi sp, sp, 40 # restore stack pointer ret # return from function .data msg: .ascii "Max: "