lunes, 22 de mayo de 2017

Ensamblador 8086 I

Tras analizar varias arquitecturas para un proyecto de electrónica relacionado con el medio ambiente (proyecto que colgaré de manera íntegra en lapsusmentis.com) he decidido decantarme por una arquitectura basada en el Intel 8086. En esta serie de post pondré varios ejemplos de código que he realizado y que me han facilitado el aprendizaje y el manejo de las instrucciones en esta arquitectura. El entorno de desarrollo que he elegido es emu8086.

Escribir un código que verifique si una cadena es igual o es subcadena de otra:

org 100h

comienzo:
mov si, x; contador de posición de cadena
mov al, msg2[si]; copio el carácter a al
cmp msg[si], al ;comparar letra por letra las cadenas, si uno no
                ;coincide manda directamente a fin
                ;y termina el programa
jne no_iguales: ; si no son iguales compruebo subcadena
cmp msg[si], "$" ;si es el final quiere decir que son iguales
jz iguales:
inc x; incremento el contador 

jmp comienzo  

;******************************
;todavía pude ser subcadena
;******************************
no_iguales:
mov si, 0 ;ponemos el contador si en 0

comienzo_sub:                           
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_no_iguales
jz final_no_iguales
cmp msg[si], al ;comparar si encuentra la primera letra de la cadena
jne seguir_sub  ;si he encontrado la primera continuo

mov di, 1 ;poner en 1 den di
comprobar_sub:
mov al, msg2[di]
mov bx, di
cmp msg[si+bx], al ;compruebo la posición de la letra coincidente +si
jne seguir_sub ;si no coincide mandar a seguir                  
inc di ;incrementar di para seguir recorriendo cadena
cmp msg2[di],"$" ;si es el fin de la cadena y el programa
                 ;y he llegado aqui es que es subcadena
jz si_es_subcadena
loop comprobar_sub ;bucle para recorrer  

seguir_sub:
inc si ;para seguir recorriendo la palabra
loop comienzo_sub ;bucle principal para recorrer


si_es_subcadena:
mov dx, offset msg5 ;copiar msg3 a dx
mov ah, 9 ;preparar ah con 9 para la interrupción 21h
int 21h ;mostrar contenido en dx
final:
ret            

final_no_iguales:
mov dx, offset msg4;paso el mensaje a dx 
mov ah, 9;salida del string almacenado en dx y debe acabar en $
int 21h; interrupción 21h 
ret

iguales:
mov dx, offset msg3;paso el mensaje a dx
mov ah, 9;salida del string almacenado en dx y debe acabar en $
int 21h; interrupción 21h
ret 


msg db "hello world $";cadena base,db para poder hacer cmp
msg2 db "helloo $";db para poder copiarse a al
msg3 dw "Son iguales $"
msg4 dw "Son diferentes $"   
msg5 dw "Si es subcadena $"
x dw 0

ret


 

Ejemplo de salida para las cadenas:

msg db "hello world $"
msg2 db "helloo $"





Ejemplo de salida para las cadenas:

msg db "hello world $"
msg2 db "hello $"




Ejemplo de salida para las cadenas:

msg db "hello world $"
msg2 db "hello world $"



No hay comentarios:

Publicar un comentario