85 lines
2.1 KiB
ArmAsm
85 lines
2.1 KiB
ArmAsm
# 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
|