martes, 6 de diciembre de 2016

Programa 27:Suma de dos números introducidos como binarios.

; FUNCION : Suma de dos numeros introducidos como binarios.
 ;Guillermo Arturo Mireles García

 ; DECLARACION DE CONSTANTES

 CR EQU 13 ; Constante CR (Retorno de carro)
 LF EQU 10 ; Constante LF (Salto de linea)
 IMPRIMIR EQU 9
 FIN EQU 4C00H
 DOS EQU 21H
 TAB EQU 09H
 BELL EQU 07H

 ; DECLARACION DEL SEGMENTO DE DATOS

 DATOS SEGMENT

  M_ENCABEZADO DB      13,10,13,10,TAB,TAB,"====================================================="
 DB 13,10,13,10,TAB,TAB,"Programa 27:PROGRAMA QUE SUMA DOS NUMEROS (dados como constantes)"
 DB 13,10,13,10,TAB,TAB,"=====================================================",13,10,"$"
 M_ESPACIO DB 13,10,13,10,13,10,13,10,13,10,13,10,"$"
 M_RESULTADO DB 13,10,13,10,13,10,TAB,TAB,TAB,BELL,"El resultado es: ","$"
 NUMERO_1 DW 00010000B ; Variable que guarda la cantidad uno convertida a binario
 NUMERO_2 DW 00010000B ; Variable que guarda la cantidad dos convertida a binario.
 RESULTADO DB 11 DUP (?),"$"

 DATOS ENDS

 ; DECLARACION DEL SEGMENTO DE PILA

 PILA SEGMENT STACK

 DB 64 DUP('PILA')

 PILA ENDS

 ; DECLARACION DEL SEGMENTO DE CODIGO

CODIGO SEGMENT

 ASSUME CS:CODIGO,DS:DATOS,SS:PILA

 EMPIEZA: ; Etiqueta de comienzo de programa

 MOV AX, DATOS ; Inicializa DS con la direccion de @Data
 MOV DS, AX
 MOV DX, Offset M_ENCABEZADO ; Despliega el mensaje de bienvenida
 CALL IMPRIME
 MOV SI, OFFSET RESULTADO ; Inicializa la variable RESULTADO, SI TIENE LA PRIMERA DIRECCION DE 11 VARIABLES
 ADD SI, 11 ; SI SE DEZPLAZA 11 POSIIONES PAR AUBICARSE EN LA ULTIMA DIRECCION DE LA VARIABLE
 MOV AL, "$" ; SE PONE UN FIN DE CADENA EN LA PARTE BAJA DEL REGISTRO A.
 MOV [SI], AL ; EN LA DIRECCION DONDE APUNTA (SI), QUE ES LA ULTIMA DE LA VARIABLE SE PONE EL

; FIN DE CADENA


 CALL SUMA ; Suma las dos cantidades

 ;TERMINA EL PROGRAMA

 MOV AX, FIN ; Termina el progrma sin error
 INT DOS ; 21H

 ; RUTINAS DE SOPORTE

 ; Rutina: Suma
 ; Proposito: Suma dos numeros enteros sin signo
 ; Parametros: En el registro Ax el primer numero y en BX el segundo
 ; Regresa: El resultado en el registro par DX:AX, que es desplegado en la pantalla.

 SUMA PROC NEAR
 XOR DX, DX ; Dx = 0 Por si acaso existe acarreo.
 MOV AX, NUMERO_1 ; SE CARGA EL PRIMER NUMERO (Primera cantidad)
 MOV BX, NUMERO_2 ; SE CARGA EL SEGUNDO NUMERO (Segunda cantidad)
 ADD AX, BX ; SE SUMAN LAS DOS CANTIDADES
 JNC CONVERTIR_SUMA ; ¿Hubo acarreo? NO? ENTONCES BRINCA
 ADC DX, 0 ; Si
 CONVERTIR_SUMA: ; CONTINUA
 CALL ConvASCII ; LLAMA AL PROCEDIMIENTO QUE: Convierte resultado en ASCII
 MOV DX, OFFSET M_RESULTADO ; Despliega cadena del resultado
 CALL IMPRIME
 MOV DX, OFFSET RESULTADO ; Despliega el resultado
 CALL IMPRIME
 MOV DX, OFFSET M_ESPACIO ; Despliega espacios despues del reusltado
 CALL IMPRIME
 RET
 SUMA ENDP
 ;-------------------------------------------------------------
 ; Rutina: Imprime
 ; Proposito: Despliega una cadena
 ; Parametros: El registro DX contiene el desplazamiento de la cadena
 ; Regresa: Nada
 ;-------------------------------------------------------------

IMPRIME PROC NEAR
 MOV AH, IMPRIMIR ; Prepara para desplegar la cadena a traves de la INT 21h
 INT DOS
 RET
 IMPRIME ENDP

 ;-------------------------------------------------------------
 ; Rutina: ConvASCII
 ; Proposito: Convertir un valor binario en ASCII
 ; Parametros: El registro par DX:AX
 ; Regresa: Nada, pero almacena el resultado en el buffer RESULTADO
 ;-------------------------------------------------------------

ConvASCII PROC Near

 ; Lo primero que se hace es inicializar la variable que contendra al resultado de la conversion
 ;-------------------------------------------------------------
 PUSH DX
 PUSH AX ; Guarda el resultado
 MOV SI, OFFSET RESULTADO ;Inicializa la variable RESULTADO llenandolacon CEROS.
 MOV CX, 10
 MOV Al, "0"
 CICLO_CEROS:
 MOV [SI], AL
 INC SI
 LOOP CICLO_CEROS
 POP AX
 POP DX
 MOV BX, AX ; Palabra baja de la cantidad
 MOV AX, DX ; Palabra alta de la cantidad
 MOV SI, OFFSET RESULTADO ; Cadena donde se guardara el resultado
 ADD SI, 11
 MOV CX, 10 ; Divisor = 10
 OBTENDIGITO:
 Dec SI
 XOR DX, DX ; Borra DX, contendra el residuo
 DIV CX ; Divide la palabra alta (AX)
 MOV DI, AX ; Guarda cociente (AX)
 MOV AX, BX ; AX = palabra baja (BX)
 DIV CX ; DX tenia un residuo de la division anterior
 MOV BX, AX ; Gurada el cociente
 MOV AX, DI ; Regresa la palabra alta
 ADD Dl, 30h ; Convierte residuo en ASCII
 MOV [SI], Dl ; Lo almacena
 OR AX, AX ; ? Palabra alta es 0 ?
 Jnz OBTENDIGITO ; No, sigue PROCesando
 OR BX, BX ; ? Palabra baja es 0 ?
 JNZ OBTENDIGITO ; No, sigue procesando
 RET

 ConvASCII ENDP

 CODIGO ENDS

 END EMPIEZA














No hay comentarios:

Publicar un comentario