.globl _start .option rvc # enable compressed instructions .section .rodata newline: .ascii "\n" # TODO: sort env, buffer output .text _start: # arguments are passed on the stack: # --bottom of stack-- # dd argc # dd argv[0] # dd ... # dd 0 # dd envp[0] # dd ... # dd 0 ld s0, 0(sp) # get argc addi s1, sp, 16 # add 8 for argc, 8 for the NULL at the end of argv # compute start of envp # we could use a sh3add instruction (from the bitmanip extension) # but it's not supported by the tools i'm using #sh3add s1, sp, s0 sll t0, s0, 3 # argc*8 add s1, s1, t0 # allocate space for two iovecs on the stack # an iovec is just a pointer and a length addi sp, sp, -(8+8)*2 # initialize the second iovec with "\n", 1 la t0, newline sd t0, 16(sp) li t1, 1 sd t1, 24(sp) loop: # check for null pointer, which signals the end of envp ld a1, 0(s1) beqz a1, end sd a1, 0(sp) # compute length of string mv t1, a1 strlen: lbu t0, 0(t1) addi t1, t1, 1 bnez t0, strlen addi t1, t1, -1 # NUL sub a2, t1, a1 sd a2, 8(sp) li a7, 66 # sys_writev li a0, 1 # stdout mv a1, sp # pointer to iovec li a2, 2 # number of iovecs ecall bltz a0, write_error # increment envp and loop addi s1, s1, 8 j loop end: li a7, 93 # exit li a0, 0 ecall write_error: li a7, 93 # exit li a0, 1 ecall