PDA

Visualizza la versione completa : [ASSEMBLY] Verificare se una stringa contenuta in un'altra (MIPS)


bennystefa
06-07-2019, 12:44
Salve a tutti, sto svolgendo un esercizio in assembly mips nel quale mi chiede di inserire il input due stringhe e verificare se la seconda contenuta nella prima. Io l'ho implementato in questo modo, ma non funziona https://www.iprogrammatori.it/forum-programmazione/images/smilies/icon_sad.gif in particolare, quando arriva a "exit2", invece di tornare al main, torna a "contenuta" e non capisco il perch, qualcuno potrebbe darmi una mano? grazie in anticipo https://www.iprogrammatori.it/forum-programmazione/images/smilies/icon_smile.gif

# Programma che ricerca sottostringa in stringa inserita.data
str1: .asciiz "Inserisci la stringa: "
str2: .asciiz "Inserisci sottostringa da ricercare: "
str3: .asciiz "La sottostringa presente"
str4: .asciiz "La sottostringa non presente"
str5: .asciiz " SONO TORNATO QUA "
.text
.globl main
main:
addi $sp,$sp,-60 #alloco spazio su stack per stringhe

la $a0,str1
li $v0,4
syscall

# prima stringa -> 0($sp)
move $a0,$sp
li $a1,24
li $v0,8
syscall

la $a0,str2
li $v0,4
syscall

# seconda stringa (sottostringa) -> 25($sp)
addi $a0,$sp,25
li $a1,24
li $v0,8
syscall

jal contenuta

beq $v0,0,nocontenuta
la $a0,str3
li $v0,4
syscall

li $v0,10
syscall


nocontenuta:
la $a0,str4
li $v0,4
syscall

li $v0,10
syscall

# PROCEDURA CONTENUTA
contenuta:
move $s0,$sp # s0 = puntatore a primo carattere prima stringa
addi $s1,$sp,25 # s1 = puntatore a primo carattere seconda stringa
li $v0,0 # valore di ritorno: se 1 contenuta, se 0 no (inizializzato a 0)
loop:
lb $t0,($s0) # t0 = valore puntato da s0
lb $t1,($s1) # t1 = valore puntato da s1
beqz $t1,exit2
beqz $t0,exit
beq $t0,$t1,uguali
beq $v0,1,modifica
addi $s0,$s0,1
addi $s1,$sp,25
j loop
uguali:
li $v0,1
addi $s0,$s0,1
addi $s1,$s1,1
j loop
modifica:
li $v0,0
addi $s1,$sp,25
j loop
exit:
li $v0,0
jr $ra
exit2:
li $v0,1
jr $ra

bennystefa
08-07-2019, 16:36
Alla fine ho risolto, se qualcuno fosse interessato a capire quale fosse il problema, era nella riga


beqz $t1,exit2

della procedura "contenuta". Infatti, $t1 non assumeva mai il valore 0 perch non era quest'ultimo il terminatore della stringa. La riga corretta la seguente


beq $t1,10,exit2

dove infatti "10" nella tabella ascii il line feed

Loading