diff --git a/src/args.S b/src/args.S index 8264a4b..cc465d9 100644 --- a/src/args.S +++ b/src/args.S @@ -24,6 +24,8 @@ fetch_argc: # @param[out] a1: address of argv[a0]. # @param[out] a2: sizeof(argv[a0]). fetch_argv: + addi sp, sp, -8 + sd s0, 0(sp) mv s0, a0 addi sp, sp, -16 @@ -38,6 +40,8 @@ fetch_argv: bltz a1, 2f # fail if a0 less than zero ld t0, sp_start addi t0, t0, 8 + addi sp, sp, -8 + sd s1, 0(sp) li s1, 0 ld a0, 0(t0) @@ -55,12 +59,15 @@ fetch_argv: mv a0, a1 addi s1, s1, 1 bne s1, s0, 1b # if we haven't retrieved the requested argument, go again - + j 3f 2: li a0, 1 # fail - j 4f + ld s0, 0(sp) + addi sp, sp, 8 + ret + 3: mv s0, a1 addi sp, sp, -16 @@ -79,6 +86,10 @@ fetch_argv: mv a1, s0 4: + ld s1, 0(sp) + addi sp, sp, 8 + ld s0, 0(sp) + addi sp, sp, 8 ret diff --git a/src/main.S b/src/main.S index e1e7700..7357107 100644 --- a/src/main.S +++ b/src/main.S @@ -13,12 +13,21 @@ _start: call save_sp call fetch_argc li t0, 1 - ble a1, t0, 1f # return 1 on no file given + ble a1, t0, 1f # return 1 if no file given + mv s0, a1 # store argc + li s1, 1 # i=1 (skip program name) - li a0, 1 - + + 3: + mv a0, s1 call fetch_argv - beqz a0, 2f + bnez a0, 1f # error if failed + mv a0, a1 + call cat_file + bnez a0, 1f # error if failed + addi s1, s1, 1 + blt s1, s0, 3b + j 2f 1: li a0, 1 @@ -26,10 +35,6 @@ _start: ecall # return 1 2: - mv a0, a1 - call cat_file - bnez a0, 1b # error if failed - li a0, 0 li a7, 93 ecall # return 0