shithub: drawcpu

ref: ed92e5c04403ed8f187510a1d6484df2a213c490
dir: /posix-mips/start.s/

View raw version
.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