;------------------------------------------------------------------------------------------------------------------------------
;Universidad del Valle de Guatemala
;Programacion en Assembler
;Josue Rendon 08168
;Laboratorio 1
;------------------------------------------------------------------------------------------------------------------------------

;Este programa consiste en determinar cuantos numeros son impares de un grupo de 3 numeros.
;Se usara la instruccion DIV, divide lo que esta en AX por su parametro y coloca el resultado en AL y el residuo en AH
;Entonces, el parametro sera 2, y si el residuo es 0 significa que es par. De lo contrario el numero es inpar. 

;------------------------------------------------------------------------------------------------------------------------------

.MODEL	SMALL
.STACK	64

.DATA				;Definicion de datos

;------------------------------------------------------------------------------------------------------------------------------
;------------------ESTOS SON LOS DATOS QUE HAY QUE CAMBIAR PARA PORBAR EL PROGRAMA---------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------

NUM1	DW	97		;El primer numero a evaluar
NUM2	DW	20		;El segundo numero a evaluar
NUM3	DW	22  	;El tercer numero a evaluar
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------

DOS		DB	2		;Numero 2, por quien dividiremos.
DIEZ	DB	10		;Numero 10 
CERO 	DB 	0		;Numero 0, para inicializar
UNO		DB	1		;Numero 1 
ASCII	DB	48		;Numero 48, para sumarle a los resultados con fin de desplegar su ascii en pantalla
MENSAJE DB 'Cantidad de impares: ','$'
MENSAJE_2 DB 'Estos son impares: ','$'


.CODE				;segmento de codigo
MAIN	PROC			
	MOV	AX,@data	;inicializa el segmento de datos
	MOV	DS,AX		
	
	MOV CL,CERO		;mueve el cero a CL	(inicializar contador de impares)

;--------------------DESPLEGAR MENSAJE-------------------------	
	MOV	AH,09H		;peticion de la funcion para desplegar
	MOV DX, OFFSET MENSAJE_2		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar


;----------------------------------------------------------------------
;--------------------EVALUA NUMERO 1-----------------------------------	
	
	MOV	AX,NUM1		;mueve el numero 1 a el registro AX
	DIV DOS			;divide lo que esta en AX por 2 y coloca el resultado en AL y el residuo en AH
	ADD CL,AH		;SUMA AL contador el residuo de la anterior (lo que esta en AH). Si el numero es impar el residuo es 1. 

;----------------DESPLIEGA EL NUMERO 1 SI ES INPAR ----------	
	MOV	DH,UNO		;guarda en DH 1 para compararlo con el residuo
	CMP UNO,AH		;mira si AH ES uno o cero
	JNZ CONTINUAR	;salta a CONTINUAR si no es inpar de lo contrario, imprimira el numero

	MOV AX,NUM1		;nuevamente mueve el numero 1 a el registro AX
	DIV DIEZ		;Divide dentro de Diez
	
	MOV	DH,ASCII	;Para que sea un ASCII desplegable, mueve el numero x30 al registro DH
	MOV BH,AH		;mueve a BH lo que esta en AH porque AH pronto sera utilizado
	ADD BH,DH		;y aquí le suma 48 al registro BH, para desplegarlo
	MOV BL,AL		;mueve a BL lo que esta en AL porque AL pronto sera utilizado
	ADD BL,DH		;y aquí le suma 48 al registro BL, para desplegarlo
			
	MOV	AH,02H		;peticion de la funcion para desplegar
	MOV	DL,BL		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar	
	
	MOV	AH,02H		;peticion de la funcion para desplegar
	MOV	DL,BH		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
	
	MOV	AH,02H		;IMPRIMIR ESPACIO peticion de la funcion para desplegar
	MOV	DL,32		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
	
	
;----------------------------------------------------------------------
;--------------------EVALUA NUMERO 2-----------------------------------
	CONTINUAR:
	
		MOV	AX,NUM2		;mueve el numero 1 a el registro AX
		DIV DOS			;divide lo que esta en AX por 2 y coloca el resultado en AL y el residuo en AH
		ADD CL,AH		;SUMA AL contador el residuo de la anterior (lo que esta en AH). Si el numero es impar el residuo es 1. 

;----------------DESPLIEGA EL NUMERO 2 SI ES INPAR ----------	
	
		MOV	DH,UNO		;guarda en DH 1 para compararlo con el residuo
		CMP UNO,AH		;mira si AH ES uno o cero
		JNZ CONTINUAR_2	;salta a CONTINUAR si no es inpar de lo contrario, imprimira el numero

		MOV AX,NUM2		;nuevamente mueve el numero 1 a el registro AX
		DIV DIEZ		;Divide dentro de Diez

		MOV	DH,ASCII	;Para que sea un ASCII desplegable, mueve el numero x30 al registro DH
		MOV BH,AH		;mueve a BH lo que esta en AH porque AH pronto sera utilizado
		ADD BH,DH		;y aquí le suma 48 al registro BH, para desplegarlo
		MOV BL,AL		;mueve a BL lo que esta en AL porque AL pronto sera utilizado
		ADD BL,DH		;y aquí le suma 48 al registro BL, para desplegarlo

		MOV	AH,02H		;peticion de la funcion para desplegar
		MOV	DL,BL		;entero a desplegar
		INT	21H			;llama a la interrupcion para desplegar	

		MOV	AH,02H		;peticion de la funcion para desplegar
		MOV	DL,BH		;entero a desplegar
		INT	21H			;llama a la interrupcion para desplegar
		
		MOV	AH,02H		;IMPRIMIR ESPACIO peticion de la funcion para desplegar
		MOV	DL,32		;entero a desplegar
		INT	21H			;llama a la interrupcion para desplegar
		
;----------------------------------------------------------------------
;--------------------EVALUA NUMERO 3-----------------------------------
	CONTINUAR_2:

	MOV	AX,NUM3		;mueve el numero 1 a el registro AX
	DIV DOS			;divide lo que esta en AX por 2 y coloca el resultado en AL y el residuo en AH
	ADD CL,AH		;SUMA AL contador el residuo de la anterior (lo que esta en AH). Si el numero es impar el residuo es 1. 

;----------------DESPLIEGA EL NUMERO 3 SI ES INPAR ----------	

	MOV	DH,UNO		;guarda en DH 1 para compararlo con el residuo
	CMP UNO,AH		;mira si AH ES uno o cero
	JNZ CONTINUAR_3	;salta a CONTINUAR si no es inpar de lo contrario, imprimira el numero

	MOV AX,NUM3		;nuevamente mueve el numero 1 a el registro AX
	DIV DIEZ		;Divide dentro de Diez

	MOV	DH,ASCII	;Para que sea un ASCII desplegable, mueve el numero x30 al registro DH
	MOV BH,AH		;mueve a BH lo que esta en AH porque AH pronto sera utilizado
	ADD BH,DH		;y aquí le suma 48 al registro BH, para desplegarlo
	MOV BL,AL		;mueve a BL lo que esta en AL porque AL pronto sera utilizado
	ADD BL,DH		;y aquí le suma 48 al registro BL, para desplegarlo

	MOV	AH,02H		;peticion de la funcion para desplegar
	MOV	DL,BL		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar	

	MOV	AH,02H		;peticion de la funcion para desplegar
	MOV	DL,BH		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
	
;----------------------------------------------------------------------
	
	CONTINUAR_3: 
			
	MOV	AH,02H		;IMPRIMIR BREAKLINE peticion de la funcion para desplegar
	MOV	DL,10		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
	
		
;--------------------DESPLEGAR MENSAJE-------------------------	
	MOV	AH,09H		;peticion de la funcion para desplegar
	MOV DX, OFFSET MENSAJE		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
	
	
;--------------------DESPLEGAR CONTADOR-------------------------	
	MOV	DH,ASCII	;Para que sea un ASCII desplegable, mueve el numero x30 al registro DH
	ADD	CL,DH		;y aquí le suma 48 al registro AH, donde esta el residuo
	MOV	AH,02H		;peticion de la funcion para desplegar
	MOV	DL,CL		;entero a desplegar
	INT	21H			;llama a la interrupcion para desplegar
		
	
;--------------------FINALIZAR-------------------------	
	MOV	AH,4CH		;prepara el registro AH
	INT	21H			;para llamar interrupcion de salida al DOS
	
MAIN	ENDP
	END MAIN