2015-01-06 3 views
1

Я пытаюсь написать подпрограмму strlen в MIPS. Функция работает, когда строка находится в памяти, но если строка является входом от пользователя, ответ всегда = (correct_value + 1). Например:Подпрограмма Strlen (MIPS)

String: Hello 
Length: 6 

Почему не работает для входов? Вот мой код. Я использую MARS.

.data 
str1: .asciiz String: " 
strTest:.space 20 
str2: .asciiz "Length: " 
    .text 
    .globl main 

main: 
    addiu $sp, $sp, -4   # save space 
    sw  $ra, 0($sp)    # push $ra 

    la  $a0, str1    # print(str1) 
    li  $v0, 4 
    syscall 

    li  $a1, 20     # read strTes 
    la  $a0, strTest 
    li  $v0, 8 
    syscall 


    jal  strlen     # call strlen 

    move $t0, $v0    # save result to $t0 

    la  $a0, str2    # print str2 
    li  $v0, 4 
    syscall 

    move $a0, $t0    # print result 
    li  $v0, 1 
    syscall 

    lw  $ra, 0($sp)    # restore $ra 
    addiu $sp, $sp, 4    # restore $sp 
    jr  $ra 


strlen: 
    li  $v0, 0     # len = 0 

while: lb  $t0, ($a0)    # get char 
    beqz $t0, wh_end    # if(char == '\0') --> end while 
    addi $v0, $v0, 1    # len++ 
    addiu $a0, $a0, 1    # *s++ 
    j  while 
wh_end: 
    jr  $ra 

ответ

3

Мое предположение заключается в том, что MARS также включает ввод/возврат, который нажимается после того, как пользователь вводит свою строку. Ваш код выглядит хорошо, поэтому было бы логично, что MARS возвращает "hello\n" вместо "hello", как и вы хотели бы этого.

Для решения этой проблемы вы можете добавить проверку, аналогичную сделанному для "\0", но затем для "\n". Я не уверен, если он будет работать, но вы можете попробовать добавить

subi $t1, $t0, 10 
beqz $t1, wh_end 

после beqz $t0, wh_end. Это может работать, поскольку значение ASCII символа завершения \ n равно 10, поэтому, если вы вычтите 10 из $ t0 и в итоге получите 0, у вас будет символ окончания.

Удачи вам!

+0

Да, это было! Я добавил beq \t $ t0, '\ n', wh_end Кажется, что MARS добавляет символ '\ n'. Спасибо за помощь! – user3342163