Я написал следующий код для вычисления длины строки:
strlen:
# PROLOGUE
subu $sp, $sp, 8
sw $ra, 8($sp)
sw $fp, 4($sp)
addu $fp, $sp, 8
# BODY
#string stored at a0 at the start
li $v0, 4
syscall #print string
li $v0, 0 #starts counter over
andi $a2, $a0, 0xff #obtain first byte
j while
while:
beqz $a2, ret #exit if null byte encountered
srl $a0, $a0, 8 #shift to next byte
andi $a2, $a0, 0xff #obtain first byte again
add $v0, $v0, 1 #increment counter to be returned
j while
ret:
# EPILOGUE
move $sp, $fp
lw $ra, ($fp)
lw $fp, -4($sp)
jr $ra
Он работает, проходя строку байта за байтом и увеличивая v0, пока не встретится нулевой байт, после чего управление переходит к метка ret и программа заканчивается. Однако моя функция всегда возвращает 0, что означает, что v0 никогда не увеличивается, а это означает, что a2 равно 0 в тот момент, когда начинается l oop. Почему это так? Я убедился, что входная строка на самом деле является строкой, содержащейся в a0, через системный вызов печати.