所以我正在尝试编写一个能在MIPS中找到字符串长度的函数。
我正在沿着数组行走/遍历,加载每个字符,我想将每个字符与空终止字符进行比较,以查看该字符串是否已“结束”。在每次连续迭代中,我递增一个计数器,然后在字符串“结束”后将计数器存储在$ v0中。但是,如何比较当前加载的字符是否为空终止字符“\ 0”?更具体地说,我如何表示这个空终止字符?它是零美元,正如我在下面所做的那样?如果是这样,那我还有什么不对的?收到地址错误。
.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
答案 0 :(得分:3)
假设您正在处理一个字节字符串,并且您正在查找字符串末尾的零字节,那么您应该使用lbu $t0, 0($s1)
。 lbu
表示“加载没有符号扩展名的字节”。然后,您可以将$t0
与$zero
注册进行比较。您当前的代码使用lw $t0, 0($s1)
将{4}加载到$t0
。
你的代码中还有其他一些错误,但我会留给你弄清楚,因为这看起来像是家庭作业。
答案 1 :(得分: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