Complete argc argv
This commit is contained in:
+93
-4
@@ -10,13 +10,102 @@ save_sp:
|
|||||||
|
|
||||||
# Fetch argument count
|
# Fetch argument count
|
||||||
# @param[in] a0: unused.
|
# @param[in] a0: unused.
|
||||||
# @param[out] a0: number of arguments.
|
# @param[out] a0: result code.
|
||||||
|
# @param[out] a1: number of arguments.
|
||||||
fetch_argc:
|
fetch_argc:
|
||||||
ld t0, sp_start # dereference the buffer
|
ld t0, sp_start
|
||||||
ld a0, 0(t0) # dereference the address
|
ld a1, 0(t0) # dereference the buffer
|
||||||
|
li a0, 0 # success
|
||||||
ret
|
ret
|
||||||
|
|
||||||
# Fetch argument value
|
# Fetch argument value
|
||||||
# @param[in] a0: argv[a0].
|
# @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:
|
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 save_sp
|
||||||
call fetch_argc
|
call fetch_argc
|
||||||
|
mv a0, a1
|
||||||
|
li t0, 1
|
||||||
|
sub a0, a0, t0
|
||||||
|
|
||||||
li t0, 48
|
call fetch_argv
|
||||||
add a0, a0, t0
|
beqz a0, 1f
|
||||||
sd a0, argc, t0
|
li a0, 1
|
||||||
|
li a7, 93
|
||||||
|
ecall
|
||||||
|
|
||||||
# li a0, 1
|
1:
|
||||||
# call fetch_argv
|
|
||||||
|
|
||||||
li a0, 1
|
li a0, 1
|
||||||
la a1, argc
|
|
||||||
li a2, 1
|
|
||||||
li a7, 64
|
li a7, 64
|
||||||
ecall
|
ecall
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user