pe19_hex.asm 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 1 / 4 ;=========================================================================== ;=========================================================================== ; 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 December 13, 2012 Crimson Editor pe19_hex.asm 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 2 / 4 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. ; Hacer el ciclo. LOOP OTRO_DIGITO 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. December 13, 2012 Crimson Editor pe19_hex.asm 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 3 / 4 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 December 13, 2012 Crimson Editor pe19_hex.asm 130: 131: 132: 133: 134: 135: 136: 137: 4 / 4 SALIR ENDP ;---------------------------------------------------------------------CODIGO ENDS ;=========================================================================== END pe19_hex ;=========================================================================== ;=========================================================================== ;=========================================================================== December 13, 2012 Crimson Editor