MIPS найти конец строки - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий код mips (запускающий его в QTSPIM), который должен подсчитать количество символов в строке и распечатать их.

Логика, стоящая за ним, очень проста, но работает не так, как должна.Все идет хорошо, пока не достигнет конца строки, и затем он продолжит считать, хотя я сравниваю каждый элемент с $ ноль, чтобы найти конец строки (\ 0).

Есть ли что-то не так с моим условием длявыйти из цикла, или my_string не содержит \ 0 в конце, поэтому он не выйдет?

    .data
endl: .asciiz "\n"
my_string: .asciiz "thisisastring"
star: .asciiz "*"
str_end: .word 0
space: .asciiz " "

    .text
    .globl main

main:
    la $a0, my_string
    li $v0, 4
    syscall

    la $a0, endl
    li $v0, 4
    syscall

    la $t0, my_string   #   load mystring to $t0
    li $t1, 0           #   make $t1 = 0, character counter
    lb $t2, ($t0)       #   make $t2 point to the first character of "my_string"
    li $t3, 1           #   $t3 is the ++ register to go to the next character  
    li $t4, 0           #   character counter
    la $t5, str_end

cont:
    beqz $t0, print #   if \0 is found print and exit
    addi $t4, $t4, 1        #   increase the counter

    lbu $a0, ($t0)          #   print current character
    li $v0, 11
    syscall

    addi $t0, $t0, 1        #   go to next char
    #move $t2, $t0


    j cont

print:
    move $a0, $t4
    li $v0, 1
    syscall
    j exit

exit:
    li $v0, 10
    syscall

1 Ответ

0 голосов
/ 14 июня 2018

Проблема в порядке инструкций, логики кода.

Вот исправленная версия без избыточного кода:

    .data
endl: .asciiz "\n"
my_string: .asciiz "thisisastring"
str_end: .word 0

    .text
    .globl main

main:
    la $a0, my_string
    li $v0, 4           #   print the string
    syscall

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

    la $t0, my_string   #   load mystring to $t0
    li $t1, 0           #   make $t1 = 0, character counter
    lb $t2, 0($t0)      #   make $t2 point to the first character of "my_string"
    la $t5, str_end

cont:
    lb $a0, 0($t0)          #   print current character
    beqz $a0, print         #   if \0 is found print and exit

    addi $t1, $t1, 1        #   increase the counter
    addi $t0, $t0, 1        #   go to next char

    li $v0, 11
    syscall

    j cont


print:
    move $a0, $t1
    li $v0, 1
    syscall
    j exit

exit:
    li $v0, 10
    syscall
...