Complete argc argv

This commit is contained in:
2026-09-11 21:41:39 -04:00
parent 46406a2e87
commit 31849a5c74
2 changed files with 102 additions and 12 deletions
+93 -4
View File
@@ -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
+9 -8
View File
@@ -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