# strlen.asm
# Function: int strlen(char *str)
# Arguments: $a0 - str
# Returns: $v0 - length

.text
.globl strlen

strlen:
    addi $sp, $sp, -8     # Allocate stack space
    sw $ra, 4($sp)        # Save return address
    sw $s0, 0($sp)        # Save s0

    move $s0, $a0         # str -> s0
    li $v0, 0             # n = 0
    li $t0, 0             # i = 0

strlen_loop:
    lb $t1, 0($s0)        # Load byte from str[i]
    beq $t1, $zero, strlen_end  # If str[i] == '\0', end loop

    addi $v0, $v0, 1      # n++
    addi $s0, $s0, 1      # i++

    j strlen_loop         # repeat loop

strlen_end:
    lw $s0, 0($sp)        # Restore s0
    lw $ra, 4($sp)        # Restore return address
    addi $sp, $sp, 8      # Free stack space
    jr $ra                # Return to caller
