• Sábado 4 de Mayo de 2024, 20:10

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - BAJA

Páginas: [1]
1
ASM (Ensamblador) / Interceptar Interrupciones
« en: Domingo 25 de Mayo de 2008, 01:09 »
: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.

Páginas: [1]