ref: 847cd0b5262ebdf9deb3c294bedffc162b4a80d2
dir: /posix-mips/start.s/
.data
argc: .word 0
_tos: .word 0
argv: .word 0
sp: .word 0
.text
.globl start
start:
# entry point
lw $t0, argc # $t0 = argc
lw $t1, _tos # $t1 = _tos
lw $t2, argv # $t2 = argv
lw $t3, sp # $t3 = stack pointer
# push argv onto stack
move $t4, $t0 # $t4 = argc
addi $t4, $t4, 1 # $t4 = argc + 1
sll $t4, $t4, 2 # $t4 = (argc + 1) * 4
subu $sp, $sp, $t4 # $sp = $sp - ((argc + 1) * 4)
move $t4, $sp # $t4 = stack pointer
move $t5, $t2 # $t5 = argv
move $t6, $t4 # $t6 = destination pointer
copy_argv_loop:
lw $t7, 0($t5) # Load argv[i] to $t7
sw $t7, 0($t6) # Store argv[i] to stack
addiu $t5, $t5, 4 # Increment argv
addiu $t6, $t6, 4 # Increment destination pointer
addi $t0, $t0, -1 # Decrement argc
bne $t0, $zero, copy_argv_loop # Loop if argc != 0
# push argc onto stack
subu $sp, $sp, 4 # $sp = $sp - 4
sw $t3, ($sp) # Push stack pointer
# jump to entry point
j $t0
nop
.section .note.GNU-stack,"",@progbits