Programa Detector de Subcadenas

Los siguientes programas se encargaran de detectar la presencia de una subcadena dentro de otra cadena. Me explico. Por ejemplo digamos que tenemos las cadenas:

cadena1= Ambrocio
cadena2 = ocio

Podemos darnos cuenta de que la cadena2 es una subcadena de Ambrocio o dicho de otro modo la cadena Ambrocio contiene a la cadena ocio. Esto lo vamos a emular en un programita.

org 100h 
include 'emu8086.inc'
mov si, 0    ;ponemos si en 0 
    
comienzo: 
mov al, msg2[0]   ;copiar la primera letra de la palabra A al
cmp msg[si],"$"   ;si es el fin de la cadena mandar a final
 jz noAceptada    ; brinca si en efecto es el final de la cadena
                  ;si no continuo con las siguientes lineas
cmp msg[si], al   ;comparar si encuentra la primera letra de la cadena en msg2
 jne seguir    ;brica si es diferente
               ;si no continuo con la ejecución

mov di, 1         ;poner en 1 di  

comprobar:
 mov al, msg2[di]       ;extraigo el siguiente caracter de msg2
 mov bx, di             ;igualo bx=di
 cmp msg[si+bx], al     ;consiguo el caracter ubicado en la posicion si+bx y lo comparo con al (al contiene el caracter de msg2)
 jne seguir             ;si no coincide mandar a seguir  
                        ;si no continuo con las siguientes lineas

 inc di                 ;incrementar di para seguir recorriendo cadena

 cmp msg2[di],"$"       ;si es el fin de la cadena y el programa llego 
 jz resultado           ;aca quiere decir que la cadena es parte de la palabra


loop comprobar         ;bucle para recorrer cadena
                                                   
                                                   
seguir:  

 inc si       ;para seguir recorriendo la palabra

loop comienzo   ;bucle principal para recorrer palabra

resultado:
  print "La contiene"
  jmp final  ;brinco al final 
  
noAceptada:  
  print "No la contiene" 
  jmp final ;brinco al final
 


final:
ret   

msg db "tecnologico$"
msg2 db "jose$"

Resultado:

En este caso jose no es una subcadena de tecnologico, es asi que debera marcarnos que la cadena1 no contiene a la cadena2

Con Macros:
Veamos otro pequeño ejemplo, es el mismo programa, sin embargo en este caso utilizaremos macros para simplificar un poco el código:
org 100h 
include 'emu8086.inc'
mov si, 0    ;ponemos si en 0 
      
comienzo: 
mov estado,0 ;establezco el estado a 0
endcadena msg[si] ;verifico que no este en el final de la cadena, si no es asi continuo con las demas lineas
comparacadena msg[si],msg2[0] ;si no es el final compraro la posición actual de la cadena msg con la primer letra de msg2

mov di, 1         ;Si son iguales aumento dx en 1  

comprobar:  
 mov estado,1     ;Y cambiare el estado a 1, puesto que es posible que msg contenga a msg2
 mov bx, di       ;de ser asi igualo el valor de bx=di
 comparacadena msg[si+bx],msg2[di] ;comparo entonces el caracter de msg[si+bx] con el caracter que apunta msg2[di]
 inc di                 ;incrementar di para seguir recorriendo cadena 
 endcadena msg2[di]    ;verifico que no este en el final de la cadena, si no es asi continuo con las demas lineas
loop comprobar         ;bucle para recorrer cadena
                                                   
                                                   
seguir:  
 inc si       ;para seguir recorriendo la palabra
loop comienzo   ;bucle principal para recorrer palabra

resultado:  
  cmp estado,0  ;Si el estado final es 0
  je Ncontiene  ;Entondes la cadena1 no contiene a la cadena 2
  jmp contiene  ;Si es 1 por el contrario si la contiene
 
contiene:
  print "La primer cadena contiene a la segunda cadena"
close   
  
Ncontiene:  
  print "La primer cadena no contiene la segunda cadena"
close

close macro 
    gotoxy 5,5   ;Me coloco en la posición 5,5
    print "Ejecucion terminada..."  ;Imprimo esto
    mov ah,4ch;Cierro la ejecución con el servicio 4ch con la interrupcion 21h
    int 21h
endm    ;cierro la macro
        
endcadena macro cadena
    cmp cadena,"$"  ;Si es el final de la cadena
    jz resultado    ;me voy a la etiqueta resultado
endm    

comparacadena macro cadena,cadena2   
    mov al, cadena2
    cmp cadena,al
    jne seguir    ;Si las cadenas no son iguales voy a la etiqueta seguir
endm

msg db "tec$"
msg2 db "tec$"  
estado db 0 
;La variable de estado me sirve para controlar el estado de aceptacion
;Si estado vale:
;1: quiere decir que es aceptada
;0: quiere decir que nunca se encontro coincidencias y por tanto no es aceptada

 Resultado: en este caso las cadenas son iguales, siendo asi el mensaje debe ser de confirmación.


Comentarios