Первый байт строки неожиданно обнуляется - PullRequest
0 голосов
/ 14 апреля 2020

Я написал следующий код для вычисления длины строки:

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, через системный вызов печати. ​​

1 Ответ

0 голосов
/ 15 апреля 2020

Вот что у меня сработало:

Удалите команду srl и замените

andi $a2, $a0, 0xff #obtain first byte again

на

addu $a2, $a0, $v0
lbu  $a2, ($a2)

, чтобы загрузить байт v0 из a0 после выполнения адрес математика.

v0 просто нужно увеличить, прежде чем вы вызовете addu.

...