;===========================================================================
;===========================================================================
; PROGRAMA : pe19_hex.asm
; FUNCION : Programa que imprime n?meros en Hexadecimal.
; REALIZADO POR : Prof. Juan Ju?rez Fuentes
; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
; FECHA : 201211185236
;===========================================================================
; DECLARACION DE CONSTANTES
;===========================================================================
CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
TAB EQU 09H
;===========================================================================
; DECLARACION DEL SEGMENTO DE DATOS
;===========================================================================
DATOS SEGMENT
ENCABEZADO DB 13,10,13,10,TAB,TAB,"====================================================="
DB 13,10,13,TAB,TAB," PROGRAMA QUE IMPRIME NUMEROS EN HEXADECIMAL"
DB 13,10,13,TAB,TAB,"=====================================================",13,10,13,10,"$"
DATOS ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE PILA
;===========================================================================
PILA SEGMENT STACK 'STACK'
DB 64 DUP('0')
PILA ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE C?DIGO
;===========================================================================
CODIGO SEGMENT ; Inicio del segmento de c?digo
;-----------------------------------------------------------------------
pe19_hex PROC NEAR ; Inicio procedimiento pe17_hex
;-------------------------------------------------------------------
ASSUME CS:CODIGO, SS:PILA, DS:DATOS
ORG 100H
;-------------------------------------------------------------------
MOV AX,DATOS ; AX=Direcci?n del segmento de datos
MOV DS,AX ; DS=AX. Indicar el segmento de datos
LEA DX, ENCABEZADO ; DS:DX = direcci?n de LINEA1
CALL ESCRIBE
;-------------------------------------------------------------------
MOV CX, 200H ; N?mero de veces a repetir el ciclo
XOR DX, DX ; DX = 0
CICLO:
CALL ESCRIBE_HEX ; Imprime el valor en DX
CALL ESCRIBE_CRLF ; Hacer un salto de linea
INC DX ; Incrementar DX
LOOP CICLO ; Regresa al ciclo
;-------------------------------------------------------------------
CALL SALIR ; Salimos del programa
;-------------------------------------------------------------------
pe19_hex ENDP ; Fin del procedimiento pe15_cbi
;-----------------------------------------------------------------------
;----------------------------------------------------------------------
; Imprime en Hexadecimal.
; Entrada: DX palabra con el valor a mostrar.
; Llama: ESCRIBE_DIGITO_HEX
;----------------------------------------------------------------------
ESCRIBE_HEX PROC NEAR
PUSH AX ; Guardar en el stack los registros que
PUSH CX ; se utilizaron en el procedimiento, para
PUSH DX ; no perder sus valores.
MOV CX,4 ; CX = 4 n?mero de digitos a imprimir.
OTRO_DIGITO: ; El ciclo se ejecuta una vez por d?gito.
PUSH CX ; Guarda el contador del ciclo.
MOV CL,4
ROL DX,CL ; Rotar el n?mero 4 bits a la izquierda, DX contiene en su nibble mas bajo, el d?gito.
CALL ESCRIBE_DIGITO_HEX ; Imprime el d?gito
POP CX ; Recupera el contador del ciclo.
LOOP OTRO_DIGITO ; Hacer el ciclo.
POP DX ; Recupera los registros guardados en
POP CX ; el stack
POP AX
RET ; Regresar del procedimiento.
ESCRIBE_HEX ENDP
;-----------------------------------------------------------------------
; Escibe un d?gito Hexadecimal.
; Entrada: DL el nibble menos significativo de DL, el valor del d?gito.
; Llama:
;----------------------------------------------------------------------
ESCRIBE_DIGITO_HEX PROC NEAR
PUSH AX ; Guarda los registros que queremos preservar.
PUSH DX
AND DX,0FH ; Apagar el nibble m?s alto.
CMP DL,10 ; Compara con 10.
JAE ES_MAYOR_A_10 ; Si es mayo o igual salta.
ADD DL,48 ; Suma 48 para imprimir su ASCII si es 0,...9.
JMP IMPRIME_DIGITO
ES_MAYOR_A_10:
ADD DL,55 ; Suma 55 para imprimir su ASCII si es A...F.
IMPRIME_DIGITO:
MOV AH,2 ; Servicio para imprimir un caracter.
INT 21H ; Llamar a DOS.
POP DX ; Recuperar los registros.
POP AX
RET ; Regresar dle procedimiento.
ESCRIBE_DIGITO_HEX ENDP
;----------------------------------------------------------------------
; Hace un CR y un LF
; Entrada:
; Llama:
;----------------------------------------------------------------------
ESCRIBE_CRLF PROC NEAR
PUSH AX
PUSH DX
MOV AH,2 ; Servicio par aimprimir un caracter.
MOV DL,13 ; Caracter 13 = CR
INT 21H ; Llamar a DOS.
MOV DL,10 ; Caracter 10 = LF.
INT 21H ; Llamar a DOS.
POP DX
POP AX
RET ; Regresar del procedimiento.
ESCRIBE_CRLF ENDP
;----------------------------------------------------------------------
ESCRIBE PROC ; Inicio procedimiento ESCRIBE
MOV AH,9 ; Funci?n DOS para escribir texto en pantalla
INT 21H ; Llamar a la interrupci?n del DOS
RET ; Volver o retornar
ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
;-----------------------------------------------------------------------
SALIR PROC NEAR
MOV AX,FIN ;Mueve la instruccion para terminar el programa.
INT DOS ;Ejecuta la interrupci?n.
RET
SALIR ENDP
;----------------------------------------------------------------------
CODIGO ENDS
;===========================================================================
END pe19_hex
;===========================================================================
;===========================================================================
;=======================
No hay comentarios:
Publicar un comentario