# Unit tests harness # Read suite name from stdin, then run that suite .org 0 # Provide program starting address to linker .global read .global streq # .extern fmt_decimal /* newlib system calls */ .set SYSEXIT, 93 .set SYSREAD, 63 .set SYSWRITE, 64 .section .rodata inputs: .word 0, 1, 2, 3, 9, 10, 100, 0x80000000 inputs_end: .section .bss buf: .skip 11 inbuf: .skip 80 .text _start2: la a0, inbuf li a1, 80 jal read mv a2, a0 # move bytes read to a2 li t0, SYSWRITE # "write" syscall li a0, 1 # 1 = standard output (stdout) la a1, inbuf # load address of buffer ecall # invoke syscall to print the string li t0, SYSEXIT # "exit" syscall la a0, 0 # Use 0 return code ecall # invoke syscall to terminate the program # Read from stdin # arguments: # a0: address of buffer to read into # a1: number of bytes to read # return: # a0: count of bytes read, or error if < 0 read: li t0, SYSREAD # "read" syscall mv a2, a1 # bytes to read mv a1, a0 # buffer address li a0, 0 # 0 = standard input (stdin) ecall # invoke syscall ret # Determine if two strings are equal # arguments: # a0: address of first string # a1: length of first string # a2: address of second string # a3: length of second string # return: # a0: 1 if equal, 0 otherwise streq: bne a1, a2, 2f # If the lengths are not the same then the strings are different 1: beqz a1, 3f # If the remaining length is zero, string are the same lbu a4, 0(a0) # load byte from string 1 lbu a5, 0(a2) # load byte from string 2 bne a4, a5, 2f # return false if bytes are not equal addi a1, a1, -1 # decrement a1 addi a0, a0, 1 # go to next byte of string 1 addi a2, a2, 1 # go to next byte of string 2 j 1b # loop 2: li a0, 0 # 0 = false ret 3: li a0, 1 # 1 = true ret