jueves, 21 de septiembre de 2017

Programa 19

;===========================================================================
;===========================================================================
; 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