Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema función 09 interrupción 10h ENSABLADOR

Estas en el tema de Problema función 09 interrupción 10h ENSABLADOR en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/04/2012, 10:34
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 13 años
Puntos: 0
Problema función 09 interrupción 10h ENSABLADOR

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

Etiquetas: programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:41.