• Domingo 22 de Diciembre de 2024, 18:48

Autor Tema:  Mostrar Hora, Minutos Y Segundos X Pantalla (8086)  (Leído 8734 veces)

AJJENJJO

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Mostrar Hora, Minutos Y Segundos X Pantalla (8086)
« en: Sábado 4 de Diciembre de 2004, 10:45 »
0
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

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Mostrar Hora, Minutos Y Segundos X Pantalla (8086)
« Respuesta #1 en: Jueves 9 de Diciembre de 2004, 10:07 »
0
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
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
Quien de verdad sabe de qué habla, no encuentra razones para levantar la voz.

AJJENJJO

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Mostrar Hora, Minutos Y Segundos X Pantalla (8086)
« Respuesta #2 en: Viernes 10 de Diciembre de 2004, 11:42 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: Mostrar Hora, Minutos Y Segundos X Pantalla (8086)
« Respuesta #3 en: Sábado 18 de Diciembre de 2004, 01:23 »
0
se parece a un programa de un texto antiguo de ASM, mi docente lo adecueo de esta manera:
Código: Text
  1.  
  2. pantalla equ 0b800h
  3. .model tiny
  4. .code
  5. include bdos.mac
  6. org 100h
  7. inicio:
  8.         jmp instalar
  9.         se_g dw 0
  10.         des dw 0
  11.         hora db 8 dup('?')
  12. reloj proc
  13.        cli
  14.        push ax
  15.        push bx
  16.        push cx
  17.        push dx
  18.        push si
  19.        push di
  20.        push ds
  21.        push es
  22.       &#59;;*****************
  23.        mov ax,40h
  24.        mov es,ax
  25.        mov si,6ch
  26.        mov ax,es:[si]
  27.        mov dx,es:[si+2]
  28.        mov bx,32761
  29.        div bx
  30.        shr ax,1
  31.       &#59;;*******
  32.        jnc p0
  33.        add dx,bx
  34.  p0:   mov ch,al
  35.        mov ax,dx
  36.        mov dx,0
  37.        mov bx,1092
  38.        div bx
  39.        mov cl,al
  40.        mov ax,dx
  41.        mov dx,0
  42.        mov bx,18
  43.        div bx
  44.        mov dh,al
  45.       &#59;;******
  46.        mov bh,10
  47.        mov ah,0
  48.        mov al,ch
  49.        div bh
  50.        add ax,3030h
  51.        mov word ptr hora,ax
  52.        mov hora+2,':'
  53.        mov  ah,0
  54.        mov al,cl
  55.        div bh
  56.        add ax,3030h
  57.        mov word ptr hora+3,ax
  58.        mov hora+5,':'
  59.        mov ah,0
  60.        mov al,dh
  61.        div bh
  62.        add ax,3030h
  63.        mov word ptr hora+6,ax
  64.        mov hora+8,':'
  65.        mov ah,0
  66.        mov al,dl
  67.        div bh
  68.        add ax,3030h
  69.        mov word ptr hora+9,ax
  70.       &#59;;*********************************
  71.        mov ax,pantalla
  72.        mov es,ax
  73.        mov di,2*(80-length hora)
  74.        mov cx,length hora
  75.        mov si,0
  76. mover:
  77.        mov al,hora[si]
  78.        mov es:[di],al
  79.        inc di
  80.        mov byte ptr es:[di],07h
  81.        inc si
  82.        inc di
  83.        loop mover
  84. fin:
  85.        pop es
  86.        pop ds
  87.        pop di
  88.        pop si
  89.        pop dx
  90.        pop cx
  91.        pop bx
  92.        pop ax
  93.        sti
  94.        iret
  95. reloj endp
  96.  
  97. instalar:
  98.           GET_INT 1ch,se_g,des
  99.           SET_INT 1ch,,reloj
  100.           TSR_COM<offset instalar-offset inicio+100h>
  101.  
  102.  
  103.  
  104. ;;fin:  int 20h
  105.  
  106. end inicio
  107.  
  108.  
  109.  

y funciona bien.

AJJENJJO

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Mostrar Hora, Minutos Y Segundos X Pantalla (8086)
« Respuesta #4 en: Miércoles 22 de Diciembre de 2004, 14:31 »
0
GRACIAS, m ha servido de ayuda.



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

Código: Text
  1.  
  2. (...)
  3. CLI&#59;inhibir interrupciones
  4. MOV AX,OFFSET reloj&#59;desplazamiento de la rutina de usuario
  5. MOV ES:[DI],AX&#59;desplazamiento a tabla de vectores de int.
  6. MOV ES:[DI+2],CS&#59;segmento a tabla de vectores de int.
  7. STI&#59;activar interrupciones
  8.  
  9. MOV DX, OFFSET residente
  10. ;dirección de la instrucción siguiente a la última de la rutina que debe quedar residente
  11.  
  12. reloj:
  13. (...)
  14.  
  15. residente:
  16. 27h
  17.  
  18. END
  19.  
  20.  

Lo he intentado de varias maneras pero no he dado con la tecla, alguien me prodría ayudar?