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 ;;***************** 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 ;;******* 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 ;;****** 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 ;;********************************* 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;inhibir interrupcionesMOV AX,OFFSET reloj;desplazamiento de la rutina de usuarioMOV 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: (...) residente:27h END
Lo he intentado de varias maneras pero no he dado con la tecla, alguien me prodría ayudar?
Navegación
Ir a la versión completa