Resulta que estoy escribiendo un programa en lenguaje ensamblador... Se me ha pedido lo siguiente: El programa debe imprimir la hora, minutos, segundos y centécimas en una tira del color deseado, utilizando para ello la función 9 de la interrupción 10, e imprimiendo tantos espacios en blanco como caracteres tenga la tira donde va a ir el reloj. El problema que tengo es que el programa se me está ciclando a la hora de imprimir la hora (hora, minutos, segundos y centécimas) en la "etiqueta de color" (fondo)... a continuación dejo el código de mi programe espero que me puedan ayudar...
BIOS EQU 10H
DOS EQU 21H
TIEMPO EQU 2CH
FIN EQU 4C00H
DATOS SEGMENT
HORA DB ? ; Aquí se guardará la hora
MINUTO DB ? ; Aquí se guardarán los minutos
SEGUNDO DB ? ; Aquí se guardarán los segundos
CENTESIMA DB ? ; Aquí se guardarán las centesimas
DECENAS DB ? ; Aquí se guardará la decena dígito
UNIDAD DB ? ; Aquí se guardará la unidad dígito
CENTENAS DB ? ; Aquí se guardará la centenas
DATOS ENDS
PILA SEGMENT STACK
DB 64 DUP(?)
PILA ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
INICIO: MOV AX,DATOS ; Inicializar el segmento
MOV DS,AX ; de datos (DS=DATOS)
MOV AX,3 ; Establecer modo texto 80x25 color
INT BIOS ; (Servicio 0 interrupción 10H)
MOV AH,1 ; Servicio tamaño cursor
MOV CX,0FFFFH ; CH=-1, CL=-1 (quitar cursor)
INT BIOS ; (Servicio 1 interrupción 10H)
OTRA: MOV AH,2 ; Colocar cursor
MOV DX,0041H ; DH=0 (FILA), DL=65 (COLUMNA)
INT BIOS ; (Servicio 2 interrupción 10H)
MOV AH,TIEMPO ; Obtener la hora
INT DOS ; (Servicio 2C interrupción 21H)
MOV HORA,CH ; Guardar hora actual en memoria
MOV MINUTO,CL ; Guardar minuto actual en memoria
MOV SEGUNDO,DH ; Guardar segundo actual en memoria
MOV CENTESIMA,DL ; Guardar centesima actual en memoria
MOV AL,HORA ; AL=HORA
CALL CALCULO ; Separar dígitos e imprimirlos
MOV DL,':' ; Imprimir separador
CALL IMPRIME
MOV AL,MINUTO ; AL=MINUTOS
CALL CALCULO ; Separar dígitos e imprimirlos
MOV DL,':' ; imprimir separador
CALL IMPRIME
MOV AL,SEGUNDO ; AL=SEGUNDOS
CALL CALCULO ; Separar dígitos e imprimirlos
MOV DL,':'
CALL IMPRIME
MOV AL,CENTESIMA
CALL CALCULO
MOV AH,1 ; Ver si hay tecla en el buffer
INT 16H ; (Servicio 1 interrupción 16H)
JZ OTRA ; Si no hay actualizar hora
XOR AH,AH ; Si hay, sacar tecla del buffer
INT 16H ; (Servicio 0 interrupción 16H)
CMP AL,27 ; Se pulsó ESC?
JNE OTRA ; Si no se pulsó actualizar hora
MOV AX,FIN ; Si se pulsó salir al DOS
INT DOS ; (Servicio 4C interrupción 21H)
; Este procedimiento extrae de un número sus dígitos por separado
; Entrar en AL un numero inferior a 100 (0 a 99)
CALCULO PROC
XOR AH,AH ; AH=0. Entonces AX=valor
PUSH AX ; Guardar valor
MOV DL,10 ; Establecer divisor
DIV DL ; Obtener decenas
MOV DECENAS,AL ; Guardar decenas en memoria
MUL DL ; Multiplicar resultado por 10
MOV BX,AX ; BX=resultado (decenas*10)
POP AX ; Recuperar valor inicial
SUB AX,BX ; Obtener unidades
MOV UNIDAD,AL ; Guardar las unidades en memoria
MOV DL,DECENAS ; Obtener decenas
ADD DL,48 ; Calcular código ASCII del dígito
CALL IMPRIME ; Imprimir dígito
MOV DL,UNIDAD ; Obtener unidades
ADD DL,48 ; Calcula código ASCII del dígito
CALL IMPRIME ; Imprimir dígito
RET
CALCULO ENDP
; Procedimiento que imprime un carácter.
; Pasar en DL el código ASCII a imprimir
IMPRIME PROC
;AH = 09H
;AL = Código del carácter a escribir.
;BH = Página de vídeo donde escribir el carácter.
;BL = Atributo ó color que va a tener el carácter.
;CX = Cantidad de veces que se debe escribir el carácter, uno a continuación de otro.
;MOV AL, 255 ; Carácter que se despliega
;MOV BH, 0 ; Página número 0
;MOV BL, 61H ; Fondo café, primer plano azul
;MOV CX, 80 ; 80 caracteres repetidos
;int 10H ; Llama al BIOS
MOV AH, 09H ; Petición de despliegue
MOV BH, 0 ; Página número 0
MOV BL, 61H ; Fondo café, primer plano azul
;MOV CX, 10 ; caracteres repetidos
int 10H ; Llama al BIOS
MOV AH,2 ; Servicio que imprime un carácter
iNT DOS
RET
IMPRIME ENDP
CODIGO ENDS
END INICIO