Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [ASSEMBLY] Verificare se una stringa è contenuta in un'altra (MIPS)

    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 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
    codice:
    # 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

  2. #2
    Alla fine ho risolto, se qualcuno fosse interessato a capire quale fosse il problema, era nella riga

    codice:
    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

    codice:
    beq $t1,10,exit2
    dove infatti "10" nella tabella ascii è il line feed

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.