.equ SYS_WRITE, 64 .equ SYS_EXIT, 94 .equ STDOUT, 1 .equ SUCCESS, 0 .global _start _start: # The decrement li s2, 1 # The final value li s1, 1 # The first value then the current value li s0, 100 loop: # Print the current value add a0, zero, s0 call num_print # Decrement sub s0, s0, s2 # End of loop? ble s1, s0, loop # BLT : Branch If Lower Or Equal # Print the end-of-line li a0, STDOUT la a1, eol addi a2, x0, 1 addi a7, x0, SYS_WRITE ecall # Exit li x10, SUCCESS addi x17, x0, SYS_EXIT ecall # Written by code4eva 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 eol: .ascii "\n"