;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