diff --git a/src/args.S b/src/args.S index 5165b65..a45f4a4 100644 --- a/src/args.S +++ b/src/args.S @@ -10,13 +10,102 @@ save_sp: # Fetch argument count # @param[in] a0: unused. -# @param[out] a0: number of arguments. +# @param[out] a0: result code. +# @param[out] a1: number of arguments. fetch_argc: - ld t0, sp_start # dereference the buffer - ld a0, 0(t0) # dereference the address + ld t0, sp_start + ld a1, 0(t0) # dereference the buffer + li a0, 0 # success ret # Fetch argument value # @param[in] a0: argv[a0]. -# @param[out] a0: address of arg. +# @param[out] a0: result code. +# @param[out] a1: address of argv[a0]. +# @param[out] a2: sizeof(argv[a0]). fetch_argv: + mv s0, a0 + + addi sp, sp, -16 + sd ra, 8(sp) + sd s0, 0(sp) + call fetch_argc + ld ra, 8(sp) + ld s0, 0(sp) + addi sp, sp, 16 + + bge s0, a1, 2f # fail if a0 larger than argc + bltz a1, 2f # fail if a0 less than zero + ld t0, sp_start + addi t0, t0, 8 + li s1, 0 + + ld a0, 0(t0) + + 1: + addi sp, sp, -24 + sd ra, 16(sp) + sd s1, 8(sp) + sd s0, 0(sp) + call _next_argv + ld ra, 16(sp) + ld s1, 8(sp) + ld s0, 0(sp) + addi sp, sp, 24 + mv a0, a1 + addi s1, s1, 1 + bne s1, s0, 1b + + j 3f + + 2: + li a0, 1 # fail + j 4f + 3: + mv s0, a1 + addi sp, sp, -16 + sd ra, 8(sp) + sd s0, 0(sp) + + mv a0, a1 + call _argv_size + + ld ra, 8(sp) + ld s0, 0(sp) + addi sp, sp, 16 + + li a0, 0 + mv a2, a1 + mv a1, s0 + + 4: + ret + + +# Fetch argument value +# @param[in] a0: address of current argv. +# @param[out] a0: result code. +# @param[out] a1: address of next argv. +_next_argv: + lb t2, 0(a0) # deref val at reg + addi a0, a0, 1 # inc reg + bnez t2, _next_argv # deref val != 0 + mv a1, a0 + li a0, 0 # success + ret + +# Fetch argument value +# @param[in] a0: address of argv. +# @param[out] a0: result code. +# @param[out] a1: address of next argv. +_argv_size: + li t0, 0 + 1: + lb t1, 0(a0) # deref val at reg + addi a0, a0, 1 # inc reg + addi t0, t0, 1 + bnez t1, 1b # deref val != 0 + + mv a1, t0 + li a0, 0 # success + ret diff --git a/src/main.S b/src/main.S index 00a9c20..4a4718a 100644 --- a/src/main.S +++ b/src/main.S @@ -12,17 +12,18 @@ _start: call save_sp call fetch_argc + mv a0, a1 + li t0, 1 + sub a0, a0, t0 - li t0, 48 - add a0, a0, t0 - sd a0, argc, t0 + call fetch_argv + beqz a0, 1f + li a0, 1 + li a7, 93 + ecall - # li a0, 1 - # call fetch_argv - + 1: li a0, 1 - la a1, argc - li a2, 1 li a7, 64 ecall