3

そのため、MIPS で文字列の長さを見つける関数を作成しようとしています。

配列に沿って歩いたりトラバースしたり、各文字をロードしたりしています。各文字をヌル終了文字と比較して、文字列が「終了」したかどうかを確認したいと考えています。連続する反復ごとにカウンターをインクリメントし、文字列が「終了」したら、そのカウンターを $v0 に格納します。ただし、現在読み込まれている文字がヌル終了文字「\0」であるかどうかを比較するにはどうすればよいですか? より具体的には、このヌル終了文字をどのように表現すればよいでしょうか? 以下で行ったように、$zero ですか? もしそうなら、他に何が間違っていますか?アドレスエラーを取得しています。

.data
msg1:.asciiz "Please insert text (max 20 characters): "
msg2:.asciiz "\nThe length of the text is: "

newline: .asciiz "\n"

str1: .space 20
.text
.globl main
main:
addi $v0, $v0,4
la $a0,msg1
syscall #print msg1
li $v0,8
la $a0,str1
addi $a1,$zero,20
syscall   #get string 1

la $a0,str1  #pass address of str1
jal len

len: 
addi $t2, $zero, 0 # $t2 is what we want to return in the end -- the count of the length of the character array
addi $s1, $zero, 0 # Index i for array traversing | init. to 0 | i = 0

Loop:

add $s1, $s1, $a0 # Adds the location of the index to the location of the base of the array | $t1 is now the location of: array[index]
lw $t0, 0($s1)

beq $t0, $zero, exit
addi $t2, $t2, 1 # Count = Count + 1
addi $s1, $s1, 1 # i = i + 1
j Loop

exit: 
la $a0,msg2 
li $v0,4
syscall
move $a0,$t0 #output the results 
li $v0,1
syscall

li $v0,10
syscall
4

2 に答える 2

5

バイト文字列を処理していて、文字列の末尾にあるゼロバイトを探していると仮定すると、lbu $t0, 0($s1). lbu「符号拡張なしのロードバイト」を意味します。$t0次に、レジスターと比較できます$zero。現在のコードはlw $t0, 0($s1)、4 バイトを にロードするものを使用しています$t0

あなたのコードには他にもバグがいくつかありますが、これは宿題のように見えるので、それらを理解するのはあなたに任せます。

于 2012-09-12T01:42:37.460 に答える
1

次のプログラムは文字列の長さを計算します

.data   
theStr: .asciiz "berjee"
.text
main:
    li $s1, 0
    la $s0, theStr

loop:
    lb $a0, 0($s0)
    beqz $a0, out
    addi $s0, $s0, 1
    addi $s1, $s1, 1
    j loop

out:
    li $v0, 1
    add $a0, $0, $s1
    syscall
    li $v0, 10
    syscall
于 2013-10-30T13:29:02.093 に答える