使用汇编 mips 的 strcmp
Strcmp using assembly mips
我的代码有问题,我开发它是为了当一个字符串相等时它返回 0,当它不同时它返回 0 returns 1. 我首先用这个字符串测试了我的代码 bruno
和 bruna
和这个程序 returns 0,它与 crazy
和 craza
一起出现。当尝试使用 bruna
测试第一个字符串,使用 bruno
测试第二个字符串时,我的程序 returns 1.
.data
str1: .space 32 # para reservar 32 caracteres para as strings
str2: .space 32
msg1: .asciiz "Insira a primeira string\n"
msg2: .asciiz "Insira a segunda string\n"
.text
strcmp:
li $v0,4
la $a0,msg1
syscall
li $v0,8
la $a0,str1
addi $a1,$zero,32
syscall
li $v0,4
la $a0,msg2
syscall
li $v0,8
la $a0,str2
addi $a1,$zero,32
syscall #got string 2
la $a0,str1 #pass address of str1
la $a1,str2 #pass address of str2
jal strAux #call strcmp
strAux: add $t0,$zero,$zero
add $t1,$zero,$a0
add $t2,$zero,$a1
loop3:
lb $t3,($t1) #load a byte from each string
lb $t4,($t2)
beqz $t3,checkt2 #str1 end
beqz $t4,missmatch
slt $t5,$t3,$t4 #compare two bytes
bnez $t5,missmatch
addi $t1,$t1,1 #t1 points to the next byte of str1
addi $t2,$t2,1
j loop3
missmatch:
addi $v0,$zero,1
j endfunction
checkt2:
bnez $t4,missmatch
add $v0,$zero,$zero
endfunction:
move $a0,$v0
li $v0,1 # Opção para imprimir uma string
syscall
slt
是 "Set on Less Than" 指令。只有当第一个字符串中的字符 小于 第二个字符串中的相应字符时,您才会检测到不匹配 - 但在两个失败的示例中,不相等的字符是 greater 在第一个字符串中。我想你想要一个 subu
指令 - 只有当两个字符相等时,减法的结果才会为零。或者,将那里的两行替换为 bne $t3, $t4, missmatch
- 如果您以后不打算使用它,则无需在 $t5 中输入值。
我的代码有问题,我开发它是为了当一个字符串相等时它返回 0,当它不同时它返回 0 returns 1. 我首先用这个字符串测试了我的代码 bruno
和 bruna
和这个程序 returns 0,它与 crazy
和 craza
一起出现。当尝试使用 bruna
测试第一个字符串,使用 bruno
测试第二个字符串时,我的程序 returns 1.
.data
str1: .space 32 # para reservar 32 caracteres para as strings
str2: .space 32
msg1: .asciiz "Insira a primeira string\n"
msg2: .asciiz "Insira a segunda string\n"
.text
strcmp:
li $v0,4
la $a0,msg1
syscall
li $v0,8
la $a0,str1
addi $a1,$zero,32
syscall
li $v0,4
la $a0,msg2
syscall
li $v0,8
la $a0,str2
addi $a1,$zero,32
syscall #got string 2
la $a0,str1 #pass address of str1
la $a1,str2 #pass address of str2
jal strAux #call strcmp
strAux: add $t0,$zero,$zero
add $t1,$zero,$a0
add $t2,$zero,$a1
loop3:
lb $t3,($t1) #load a byte from each string
lb $t4,($t2)
beqz $t3,checkt2 #str1 end
beqz $t4,missmatch
slt $t5,$t3,$t4 #compare two bytes
bnez $t5,missmatch
addi $t1,$t1,1 #t1 points to the next byte of str1
addi $t2,$t2,1
j loop3
missmatch:
addi $v0,$zero,1
j endfunction
checkt2:
bnez $t4,missmatch
add $v0,$zero,$zero
endfunction:
move $a0,$v0
li $v0,1 # Opção para imprimir uma string
syscall
slt
是 "Set on Less Than" 指令。只有当第一个字符串中的字符 小于 第二个字符串中的相应字符时,您才会检测到不匹配 - 但在两个失败的示例中,不相等的字符是 greater 在第一个字符串中。我想你想要一个 subu
指令 - 只有当两个字符相等时,减法的结果才会为零。或者,将那里的两行替换为 bne $t3, $t4, missmatch
- 如果您以后不打算使用它,则无需在 $t5 中输入值。