• Viernes 29 de Marzo de 2024, 13:10

Autor Tema:  Interceptar Interrupciones  (Leído 3023 veces)

BAJA

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Interceptar Interrupciones
« en: Domingo 25 de Mayo de 2008, 01:09 »
0
:hola: Hola, amigos y amigas.

Primero un saludo a los que aquí se queman las pestañas en el bajísimo mundo de la programación.

Ya leí las recomendaciones que dan antes de exponer uno algun comentario en el foro, debo decir que siempre dan miedo, entiendo porque las hacen, pero igual dan miedo, siente uno que lo van a bloquear de una vez. Luego, es cierto que llegue aqui debido a algo que no logro hacer, y es de hecho por una tarea que me asignaron, PERO que no busco que me la hagan, de hecho ni voy mencionar de que se trata, pero si necesito ver si me pueden a clarar la duda.

He buscado por todo lado, me he informado y no es tampoco la primera vez que programo en ensamblador 8086, pero este asunto de interceptar una interrupcion me ha sacado las canas, porque hasta me ha puesto a dudar de la organizacion de la memoria.

Esto es lo que tengo:
*- Se que con las interrupciones 25h y 35h de DOS, puedo obtener el segmento y el offset de donde se encuentran y asignar el nuevo segmento y desplazamiento para la atencion de la interrupcion.

En el caso espcifico del puerto COM1, se que el puerto es 3F8H

Y he intentado las siguientes lineas con exito:

PUERTO_BASE DW 03f8h ; corresponde COM1

MOV DX, PUERTO_BASE
ADD DX,3                    ; LRC
MOV AL,128                 ; bit 7 DLAB
OUT DX,AL                   ; activa bit 7

y luego ahi sigo entrado a los diferentes registros del CHIP 16550.


Tambien he usado la funcion 14H de DOS( si no me equivoco), para la configuracion del CHIP

MOV AL,01000011B ; 300,8,1
MOV DX,0              ; COM1: DX=0
MOV AH,0              ; Funcion 0 de la int. 14H inicializa puerto
INT   14H               ; Llama a la interrupcion 14H

Y he usado ambas para darme cuenta que he podido, acceder a el, en ambas formas. Pero esta bien, hasta ahi, con todo esto lo unico que me queda es hacer polling de las banderas, cosa bastante ineficiente.

Entonces con lo que se me hace un enredo es el vector de interrupciones, hasta donde entiendo son 256, desde la posicion real de memoria 00H hasta FFH. En la informacion que he encontrado tengo INT OCH para el COM1 e INT14H para manejo serial, es me tiene completamente confuso si esta 14H es del DOS o del BIOS, tambien no se si es en la OCH donde debo poner el segmente y el offset de mi rutina o es en la 14H.

Luego, algo que lei en el libro de Peter Abel, que me imagino hay gente aqui familiarizada con el, detallan las interrupciones a partir de la 40[0]H, y ahi si es cierto que me perdi.

Porque en parrafo anterior tenia todo eso que escribi, y ahore me dice Abel que tengo que empezar en la 40H, entiendo que es la 400H, por la multiplicacion interna por 10H, pero eso me pierde tambien, ya que si lo que dan es el offset de las interrupciones, entonces no se como acceder a ellas si asi:
MOV AX, [40H*10H+offset_int]
o:
MOV AX, [(40H+offset_int)*10H]

Se que asi no se direcciona, pero lo hago para ejemplificar.

Siceramente parece que mi problema, es entendiendo la organizacion de la memoria y sobre todo en esta parte de vector de interrupcion. No lo veo, no se por que, leo y leo, y nada.

No se si a la hora de que cambie el segmento y el offset de la interrupcion, ya no voy a apoder acceder a los registros del COM1 a traves del puerto 3F8H, aunque estoy casi seguero que de igual manera los voy acceder por ahi, ya que eso no deberia cambiar.

Tengo el mismo problema para atender el teclado por medio de interrupcion. Pero preferiria aclarar esto primero.


Les agradezco mucho a los que lean este largo mensaje. Y si tienen alguna forma de ayudarme, les doy la mayor de las gracias desde ahora.


Jjejej, espero no me maten por lo la largo, pero quise darme a entender lo mejor que pude.

 :hola: Ciao.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #1 en: Domingo 25 de Mayo de 2008, 12:14 »
0
Cita de: "BAJA"
Ya leí las recomendaciones que dan antes de exponer uno algun comentario en el foro, debo decir que siempre dan miedo, entiendo porque las hacen, pero igual dan miedo, siente uno que lo van a bloquear de una vez. Luego, es cierto que llegue aqui debido a algo que no logro hacer, y es de hecho por una tarea que me asignaron, PERO que no busco que me la hagan, de hecho ni voy mencionar de que se trata, pero si necesito ver si me pueden a clarar la duda.

Pese a las mismas, que poca gente lee, se hace todo lo que ahi se prohibe.

Cita de: "BAJA"
Tambien he usado la funcion 14H de DOS( si no me equivoco), para la configuracion del CHIP

Esta interrupcion es de la BIOS, no de MS-DOS. Y el puerto no tiene nada que ver, estas mezclando cosas.

Interupciones (esto esta en la KB): http://www.ctyme.com/intr/int.htm

Cita de: "BAJA"
Entonces con lo que se me hace un enredo es el vector de interrupciones, hasta donde entiendo son 256, desde la posicion real de memoria 00H hasta FFH. En la informacion que he encontrado tengo INT OCH para el COM1 e INT14H para manejo serial, es me tiene completamente confuso si esta 14H es del DOS o del BIOS, tambien no se si es en la OCH donde debo poner el segmente y el offset de mi rutina o es en la 14H.

Eso dependera de lo que quieras hacer realmente, esto es la 0Ch, es llamada por el UART no por un programa, de http://www.ctyme.com/intr/rb-0055.htm:
IRQ4 - SERIAL COMMUNICATIONS (COM1)

Desc: Automatically asserted by the UART when COM1 needs attention, if the UART has been programmed to generate interrupts


Cita de: "BAJA"
Luego, algo que lei en el libro de Peter Abel, que me imagino hay gente aqui familiarizada con el, detallan las interrupciones a partir de la 40[0]H, y ahi si es cierto que me perdi.

Yo no al menos, estos temas son arcaicos, nadie trabaja en 16 bits y MS-DOS salvo que sean tareas escolares.

La IDT en modo real es un array de DWORDs de 256 elementos. Si queres acceder a la interrupcion 10h entonces tenes que multiplicar por 4 y sumar al offset del inicio de la IDT. IDT_Offset + int_to_hook * 4.

Mas y mejor info: http://en.wikipedia.org/wiki/Interrupt_descriptor_table

Cita de: "BAJA"
No se si a la hora de que cambie el segmento y el offset de la interrupcion, ya no voy a apoder acceder a los registros del COM1 a traves del puerto 3F8H, aunque estoy casi seguero que de igual manera los voy acceder por ahi, ya que eso no deberia cambiar.

El puerto es independiente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

BAJA

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #2 en: Domingo 25 de Mayo de 2008, 20:40 »
0
Primeramente agredecerle Eternal Idol, por haber respondido, y haberme aclarado varias dudas.

Entonces para sintetizar un poco lo que me parece entender:

- La interrupcion 0CH, seria la que tendria que interceptar, ante algun evento en el UART. Entonces el segmento y offset que tengo que cambiar es el que estaria justo en 0CH, y por el segmento y offset de la la rutina de interrupcion que estaria haciendo.

- El puerto del COM1 seria 3F8H, y de ahi leeria los registros y banderas que necesitase.

- Las interrupciones 25H y 35H, para modificar la interrupcion 0CH.

- La interrupcion 14H como una alternativa para el manejo del UART.

Y un comentario, para que tal vez le ayude a comprender porque pregunto ciertas cosas y es porque lo que tengo que hace es un chat sencillo a traves del puerto serie, con un monton de cosas ahi adicionales. Pero es la parte de interrupciones la que me dejo :blink:


Dudas que me quedaron:

1)
Cita de: "Eternal Idol"
Si queres acceder a la interrupcion 10h entonces tenes que multiplicar por 4 y sumar al offset del inicio de la IDT. IDT_Offset + int_to_hook * 4.
Eso quiere decir que si quiero acceder a la interrupcion 09H, mediante la interrupcion 25H, tengo primero que multiplicarla por 4?

2)
Para interceptar la interrupcion no tiene que ser necesariamente un programa residente el que se debe escribir, verdad?

3)
Con respecto al teclado, el puerto seria el 60H y la interrupcion la 09H, en eso no creo que estar mal. Pero, segun la informacion de lo links que me envio, ya algunos si los habis visistado otros no, pero gracias a ud. me confirmo cosas que no entendia o no estaba seguro; me di cuenta que interceptar la interrupcion del teclado, no tan sencillo como se ve para el UART, ya que a lo que entendi y vi, en la misma interrupcion 09H, estan siendo leidos los registros de estado y la codificacion de la tecla. O estoy equivocado en esto, y funciona igualmente que para el UART?


Luego algo opcional que no le comprendi fue este comentario:

Cita de: "Eternal Idol"
Pese a las mismas, que poca gente lee, se hace todo lo que ahi se prohibe.
Lo dijo por mi?


Bueno, muchas gracias por la ayuda de fijo me hizo comprender bastante cosas, me hace falta ahora ponerlas en practica a ver que resultados obtengo. Y espero despues de entregar mi tarea, exponer algunos resultados que le puedan ayudar a otros, claro, si me lo permiten.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #3 en: Domingo 25 de Mayo de 2008, 20:52 »
0
Cita de: "BAJA"
Eso quiere decir que si quiero acceder a la interrupcion 09H, mediante la interrupcion 25H, tengo primero que multiplicarla por 4?

No se que tiene que ver la interrupcion 25h. Estaba hablando de la IDT, lo mismo que mencionaste al principio, y la misma esta formada por 255 elementos de 4 bytes cada uno.

Cita de: "BAJA"
2)Para interceptar la interrupcion no tiene que ser necesariamente un programa residente el que se debe escribir, verdad?

El codigo tiene que estar siempre cargado en memoria mientras sea referenciado en  una entrada de la IDT.

Cita de: "BAJA"
Lo dijo por mi?

No, lo digo por la gran cantidad de hilos que tengo que cerrar o borrar.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

BAJA

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #4 en: Domingo 25 de Mayo de 2008, 21:18 »
0
Ahh, excelente Eternal, muchas gracias. :D

Entonces, con lo que respecta del teclado, si es algo mas complicado, asi como lo expuse, o al contrario, o estoy completamente perdido?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #5 en: Domingo 25 de Mayo de 2008, 22:22 »
0
No se, tendria que ponerme a mirarlo con mas detenimiento, si queres "filtrar" lo que hagan otros programas tenes que interceptar la 14h y no la 0Ch.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

BAJA

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #6 en: Lunes 2 de Junio de 2008, 05:55 »
0
Hola, saludos!

Aqui estoy, ya un poco mas "fogueado", en el tema de interrupiones, no quise abrir una nueva discusion, ya que me parece que sigue dentro de este tema, y espero para cuando logre sacar esto exponer lo que hice.

Entonces el problema que me aparecio es el siguiente:

Tengo este codigo:


PILA   SEGMENT PARA STACK 'stack'
   
   BUFFERKL DW   10 DUP(0)

PILA   ENDS

DATOS   SEGMENT PARA 'data'

   TEXT   DB   'ENTRA CUALQUIER COSA', 0AH, 0DH, '$'
   SALTO   DB   0AH, 0DH, '$'            ;Representa los saltos de linea en el dialogo
                        ;en el chat
   BUFFER_TECLADO DB   71 DUP('0')
   BUFFER_ARCHIVO DB   100 DUP('0')

   ES_INT9   DW   ?      ; variables para las pruebas de intercepcion de de interrupciones
   OFF_INT9   DW   ?
   COMPA   DW   ?

DATOS   ENDS

CODIGO   SEGMENT PARA 'code'
   
   BEGIN   PROC   FAR


      ASSUME   SS:PILA, DS:DATOS, CS:CODIGO
      MOV   AX, DATOS
      MOV   DS, AX
      MOV   AX, PILA
      MOV   SS, AX


   MOV DX, 3F8H
   ADD DX,3
   MOV AL,128
   OUT DX,AL

   MOV DX,3F8H
   MOV AL,48
   OUT DX,AL

   MOV DX, 3F8H
   ADD DX, 1
   MOV AL, 0
   OUT DX, AL

   MOV DX, 3F8H
   ADD DX, 3
   MOV AL, 0
   OUT DX, AL

   MOV AL, 3
   OUT DX, AL
;????????????????????????????????????????
;--->> JUSTO AQUI ES DONDE ME SUCEDE EL PROBLEMA <<---
   MOV DX, 03F8H
   ADD DX, 5H
   IN  AL, DX


   BEGIN   ENDP
CODIGO   ENDS
   END BEGIN


Presento todo el codigo, para que que se visualice mejor la dua que tengo, este programita asi como esta, cuando llega a la parte señalada me aparece un error por una insturccion no permitida, lo extraño o mas bien lo que me llama la atecion y no entiendo por que, es que cuando al inicio del codigo le agrego las directivas

.MODEL SMALL
DOSSEG

ya se soluciona el problema y puede leer perfectamente el registro LCR del UART, no entiendo bien que podria solucionar ya que hasta donde tengo entendido los modelos son organizaciones de memoria de algunos segmentos para la programacion.

Pero bueno, espero alguien me puedo responder algo al respecto.

Gracias :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Interceptar Interrupciones
« Respuesta #7 en: Lunes 2 de Junio de 2008, 17:27 »
0
Asi con solo ver el codigo no te puedo decir nada y ahora no tengo acceso a ninguna maquina util. Depuralo con debug.exe, observa atentamente el estado del proceso en el momento del error (registros, memoria relevante de haberla, etc) y comparalo con el estado del proceso cuando funciona correctamente. Seria bueno que lo probaras en MS-DOS y no en una consola de Windows.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.