Complete argc argv
This commit is contained in:
+93
-4
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user