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