0

我的代码有问题。我正在创建一个程序,它将读取一个字符串,将其保存到一个数组中,然后输出每个字母在字符串中使用的次数。目前,我只是将字符串输出到屏幕时遇到问题。输出字符串但循环永远不会退出, $t2 值可能永远不会设置为值?

.data
intro: .asciiz "Andrew Lofgren, Letter Checker Program" 
question: .asciiz "\nPlease enter a string for evaluation: "
alphabet: .ascii "ABCDEFGHIJKLMONOPQRSTUVWXYZ"
results: .space 104
string: .space 1024

.text 

main:
jal setup
jal analyze
#jal results

li  $v0, 10
syscall 

setup:
li  $v0, 4  # outputing name and program information
la  $a0, intro
syscall

li  $v0, 4  # asksing for string input
la  $a0, question
syscall 

li  $v0, 8
la  $a0, string
li  $a1, 1024
syscall

jr  $ra     # return

analyze: 
la  $t0, string # taking string and saving into a tmp
move    $t2, $t0    # backup of orignal address
find:   
beq $t1, 0, print
addi    $t0, $t0, 1
j find

print:  
blt $t0, $t2, end   #PROBLEM HERE
li  $v0, 11
lb  $a0, 0($t0)
syscall
addi    $t0, $t0, 1
j print
end:
jr  $ra
4

1 回答 1

1

$t0永远不会小于$t2,因为在保持不变的情况下$t0不断增加。$t2为了解决这个问题,您需要第三个寄存器,比如$t7,它存储字符串的最终索引。要计算最后一个索引,只需将字符串的基地址添加到您定义为 1024 的长度。一旦$t0不再小于 1024 + 字符串,则字符串中没有字符,因此我们分支到end:. 这是在下面的代码段中完成并进一步解释的。

print:
    li      $t7 , 1024            # Load total byte length of the string
    add     $t7 , $t7 , $t2     # add it to the base address to get the end
    slt     $t6 , $t0 , $t7     # check to see if cur index < end
    beq     $t6 , $0 , end     # if we hit the end, branch to end

...

有关 MIPS 说明的更多信息,请访问此页面

于 2013-05-01T01:23:26.010 回答