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.
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:
Resultado: en este caso las cadenas son iguales, siendo asi el mensaje debe ser de confirmación.
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
Publicar un comentario