Programación General > ASM (Ensamblador)

 Mostrar Hora, Minutos Y Segundos X Pantalla (8086)

(1/1)

AJJENJJO:
Hola, querría saber si alguien m puede ayudar para poder mostrar la horas, minutos y segundos del ordenador por pantalla; con este código sólo se m muestra bien la hora, pro no m va bien los minutos y no sé q hacer.

.MODEL SMALL

.STACK 100

.DATA
   min DW 1
.CODE

   MOV AL,3h    ;establece modo texto
   MOV AH,0
   INT 10h

   XOR AX,AX
   MOV ES,AX
   MOV DI,1Ch

   CLI         ;inhibir interrupciones
   MOV AX,OFFSET reloj   ;desplazamiento de la rutina de usuario
   MOV ES:[DI],AX      ;desplazamiento a tabla de vectores de int.
   MOV ES:[DI+2],CS   ;segmento a tabla de vectores de int.
   STI         ;activar interrupciones

   MOV DX, OFFSET residente
   ;dirección de la instrucción siguiente a la última de la rutina que debe quedar residente

reloj:
   MOV AX,40h      ;segmento
   MOV ES,AX      ;empleamos el segmento extra
   MOV SI,6Ch      ;desplazamiento
   MOV AX,ES:[SI]      ;parte inferior contador
   MOV DX,ES:[SI+2]   ;parte superior contador
   MOV BX,32760      ;1/2 hora
   DIV BX         ;DX=resto, AX=horas*2
   SHR AX,1      ;AX=horas
   MOV CH,AL      ;hh:mm:ss pasan a CH:CL:DH
   MOV min,DX         ;guardamos los minutos antes de machacar

   MOV AL,CH
   MOV BH,10
   DIV BH

;MOSTRAMOS PRIMER DIGITO DE LA HORA
   MOV BX,0B800h      ;metemos en BX la posición donde se sitúa
   MOV ES,BX      ;empleamos el segmento extra
   MOV BX,144      ;desplazamiento el modo texto      
   MOV CL,48      ;carácter a mostrar por pantalla
   ADD CL,AL
   MOV ES:[BX],CL

;MOSTRAMOS SEGUNDO DIGITO DE LA HORA
   MOV BX,0B800h      ;metemos en BX la posición donde se sitúa
   MOV ES,BX      ;empleamos el segmento extra
   MOV BX,146      ;desplazamiento el modo texto      
   MOV CL,48      ;carácter a mostrar por pantalla
   ADD CL,AH
   MOV ES:[BX],CL

;MOSTRAMOS LOS DOS PUNTOS
   MOV BX,0B800h      ;metemos en BX la posición donde se sitúa
   MOV ES,BX      ;empleamos el segmento extra
   MOV BX,148      ;desplazamiento el modo texto      
   MOV CL,':'      ;carácter a mostrar por pantalla
   MOV ES:[BX],CL   

   MOV DX,0
   MOV AX,min
   MOV BX,1092      ;min
   DIV BX   
   MOV AH,0
   MOV CL,AL      ;DX=resto, AX=MIN
            ;hh:mm:ss pasan a CH:CL:DH
   MOV BH,10
   DIV BH

;MOSTRAMOS PRIMER DIGITO DE LOS MINUTOS
   MOV BX,0B800h      ;metemos en BX la posición donde se sitúa
   MOV ES,BX      ;empleamos el segmento extra
   MOV BX,150      ;desplazamiento el modo texto      
   ADD CL,48      ;carácter a mostrar por pantalla
   ADD CL,AL
   MOV ES:[BX],CL
   

;MOSTRAMOS SEGUNDO DIGITO DE LOS MINUTOS
   MOV BX,0B800h      ;metemos en BX la posición donde se sitúa
   MOV ES,BX      ;empleamos el segmento extra
   MOV BX,152      ;desplazamiento el modo texto      
   ADD CL,48      ;carácter a mostrar por pantalla
   ADD CL,AH
   MOV ES:[BX],CL
   
   
;AQUI FALTA CONVERSION PARA MIN Y SEG, CON LAS 4 ULT INST PERO 1092 Y QUEDA DX=0 AX=MIN
;IGUAL CON SEG


residente:
   INT 27h         ;solicitud a DOS de TSR




END

He visto q hay un post referido a esto, pro va a través de interrupciones. Y yo no lo quiero hacer así, yo lo quiero hacer a través del segmento de datos, y una vez hecho bien dejarlo resident

A vé si m podéis ayudar, GRACIAS

deldar:
Despues de leer el código he observado algo extraño:

--- Citar --- MOV BX,0B800h ;metemos en BX la posición donde se sitúa
MOV ES,BX ;empleamos el segmento extra
MOV BX,150 ;desplazamiento el modo texto
ADD CL,48 ;carácter a mostrar por pantalla
ADD CL,AL
MOV ES:[BX],CL


;MOSTRAMOS SEGUNDO DIGITO DE LOS MINUTOS
MOV BX,0B800h ;metemos en BX la posición donde se sitúa
MOV ES,BX ;empleamos el segmento extra
MOV BX,152 ;desplazamiento el modo texto
ADD CL,48 ;carácter a mostrar por pantalla
ADD CL,AH
MOV ES:[BX],CL
--- Fin de la cita ---
CL mantiene valores de las operaciones anteriores. ¿Que tal si lo resuelves igual que con las horas?. Me explico:
En lugar de ADD CL,48 utiliza MOV CL,48
Con este cambio queda:

--- Citar --- MOV BX,0B800h ;metemos en BX la posición donde se sitúa
MOV ES,BX ;empleamos el segmento extra
MOV BX,150 ;desplazamiento el modo texto
MOV CL,48 ;*************************** Cambio
ADD CL,AL
MOV ES:[BX],CL


;MOSTRAMOS SEGUNDO DIGITO DE LOS MINUTOS
MOV BX,0B800h ;metemos en BX la posición donde se sitúa
MOV ES,BX ;empleamos el segmento extra
MOV BX,152 ;desplazamiento el modo texto
MOV CL,48 ;*************************** Cambio
ADD CL,AH
MOV ES:[BX],CL
--- Fin de la cita ---

AJJENJJO:
GRACIAS, ya m di cuenta y lo cambié; pro aún así na d na.

He incluso los segundos llegan hasta 99 y no sé q hacer. A ver si m podéis ayudar

Super_G:
se parece a un programa de un texto antiguo de ASM, mi docente lo adecueo de esta manera:

--- Código: Text --- pantalla equ 0b800h.model tiny.codeinclude bdos.macorg 100hinicio:        jmp instalar        se_g dw 0        des dw 0        hora db 8 dup('?')reloj proc       cli       push ax       push bx       push cx       push dx       push si       push di       push ds       push es      &#59;;*****************       mov ax,40h       mov es,ax       mov si,6ch       mov ax,es:[si]       mov dx,es:[si+2]       mov bx,32761       div bx       shr ax,1      &#59;;*******       jnc p0       add dx,bx p0:   mov ch,al       mov ax,dx       mov dx,0       mov bx,1092       div bx       mov cl,al       mov ax,dx       mov dx,0       mov bx,18       div bx       mov dh,al      &#59;;******       mov bh,10       mov ah,0       mov al,ch       div bh       add ax,3030h       mov word ptr hora,ax       mov hora+2,':'       mov  ah,0       mov al,cl       div bh       add ax,3030h       mov word ptr hora+3,ax       mov hora+5,':'       mov ah,0       mov al,dh       div bh       add ax,3030h       mov word ptr hora+6,ax       mov hora+8,':'       mov ah,0       mov al,dl       div bh       add ax,3030h       mov word ptr hora+9,ax      &#59;;*********************************       mov ax,pantalla       mov es,ax       mov di,2*(80-length hora)       mov cx,length hora       mov si,0mover:       mov al,hora[si]       mov es:[di],al       inc di       mov byte ptr es:[di],07h       inc si       inc di       loop moverfin:       pop es       pop ds       pop di       pop si       pop dx       pop cx       pop bx       pop ax       sti       iretreloj endp instalar:          GET_INT 1ch,se_g,des          SET_INT 1ch,,reloj          TSR_COM<offset instalar-offset inicio+100h>   ;;fin:  int 20h end inicio   
y funciona bien.

AJJENJJO:
GRACIAS, m ha servido de ayuda.



Ahora tengo otra pregunta: como puedo poner ese programa residente utilizando la interrupción 27h?


--- Código: Text --- (...)CLI&#59;inhibir interrupcionesMOV AX,OFFSET reloj&#59;desplazamiento de la rutina de usuarioMOV ES:[DI],AX&#59;desplazamiento a tabla de vectores de int.MOV ES:[DI+2],CS&#59;segmento a tabla de vectores de int.STI&#59;activar interrupciones MOV DX, OFFSET residente ;dirección de la instrucción siguiente a la última de la rutina que debe quedar residente reloj: (...) residente:27h END  
Lo he intentado de varias maneras pero no he dado con la tecla, alguien me prodría ayudar?

Navegación

[0] Índice de Mensajes

Ir a la versión completa