Ensamblador - Programa residente con capturas de Interrupciones

 
Vista:

Programa residente con capturas de Interrupciones

Publicado por JJcorps (2 intervenciones) el 27/12/2005 21:48:40
Hola!
Quiero hacer un programa que implemente un cronometro para eso capturo la interrupcion 1ch q es la del reloj, creo q eso lo hago bien. El problema es al dejar eso residente q lo que hago es modificar la memoria de video (la direccion (A000h) y cuando pongo otro programa q lo unico q hace es visualizar el modo de video me sigue mostrando todo en negro.

En resumidas cuentas hago un programa q modifica un sector de la memoria de video y lo dejo residente, pero despues de entrar con otro programa y visualizar el modo de video, pasa q no ha ocurrido nada.

No se si esto pasa por algo del windows XP, o pq he hecho la residencia mal.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Programa residente con capturas de Interrupcion

Publicado por preth00nker (1 intervención) el 18/07/2007 03:11:52
bien, tu problema es que necesitas checar tmb la int 10h dentro de tu programa recidente, debido a que si otro programa llama la int 10h mientras tu recidente lo está ocupando pues se van a contradecir, te anexo un códig de muestra.

--------- [SOF] ------------------------------------------------------------
demores SEGMENT
ASSUME CS:demores, DS:demores

ORG 100h
inicio:
JMP main

controla_int08 PROC
PUSHF
CALL CS:ant_int08 ; llamar al gestor normal de INT 8
STI
CMP CS:in10,0
JNE fin_int08 ; estamos dentro de INT 10h

;
; Colocar aquí el proceso a ejecutar 18,2 veces/seg.
; que puede invocar funciones de INT 10h
fin_int08:
IRET
controla_int08 ENDP

controla_int10 PROC
INC CS:in10 ; indicar entrada en INT 10h
PUSHF
CALL CS:ant_int10
DEC CS:in10 ; fin de la INT 10h
IRET
controla_int10 ENDP

in10 DB 0 ; mayor de 0 si hay INT 10h
ant_int08 LABEL DWORD
ant_int08_off DW ?
ant_int08_seg DW ?
ant_int10 LABEL DWORD
ant_int10_off DW ?
ant_int10_seg DW ?

; Dejar residente hasta aquí.

main: PUSH ES
MOV AX,3508h
INT 21h ; obtener vector de INT 8
MOV ant_int08_seg,ES
MOV ant_int08_off,BX
MOV AX,3510h
INT 21h ; obtener vector de INT 10h
MOV ant_int10_seg,ES
MOV ant_int10_off,BX
POP ES

LEA DX,controla_int08
MOV AX,2508h
INT 21h ; nueva rutina de INT 8

LEA DX,controla_int10
MOV AX,2510h
INT 21h ; nueva rutina de INT 10h

PUSH ES
MOV ES,DS:[2Ch] ; dirección del entorno
MOV AH,49h
INT 21h ; liberar espacio de entorno
POP ES

LEA DX,main ; fin del código residente
ADD DX,15 ; redondeo a párrafo
MOV CL,4
SHR DX,CL ; bytes -> párrafos
MOV AX,3100h ; terminar residente
INT 21h

demores ENDS
END inicio

--------- [EOF] ------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar