SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: juanito20 en Lunes 26 de Febrero de 2007, 05:23
-
RESUMEN
1 como modifico el vector de interrupciones?
2 como subo a memoria un conjunto de instrucciones?
..............................................................................
Necesito hacer un sistema de arranque y un minishell, el cual sera capaz de realizar algunas funciones basicas como DETECTAR cantidad de cabezas, sectores,pistas y cilindros de alguna unidad, LEER un sector, y determinar TAMANO del disco. Todavia no se si podre hacer las funciones, espero que si, pero lo que me preocupa y que definitivamente no tengo idea de como hacer es que debo crear esas funciones y, subirlas a memoria y crear nuevas interrupciones que ejecuten esas funciones de manera que el minOS al recibir un comando, ejemplo:
Konzole/:>TAMANO C
lo que haga el sistema sea una simple llamada a una interrupcion con el paramentro en algun registro, o sea, algo asi:
MOV AH, 80h ; el 80h es puro ejemplo
INT 99 ;
A todo esto mis preguntas son,
1 como modifico el vector de interrupciones?
2 como subo a memoria un conjunto de instrucciones?
Ya tengo el shell y el sistema de arranque, lo que me faltan son las funciones y como crear las nuevas interrupciones.
-
De manera simple para "crear" una nueva interrupcion lo que se hace es escribir en una estructura que ya esta en memoria. El chiste es hacer que una de sus entradas apunte a nuestro codigo (eso seria lo que denominas "subir a memoria un conjunto de instrucciones", en realidad ya estan en memoria si tu codigo se esta ejecutando).
Para saber la direccion de esta estructura en memoria necesitamos obtener el valor contenido en el registro IDTR, no accesible directamente, usando la instruccion lidt.
http://pdos.csail.mit.edu/6.828/2005/readings/i386/LGDT.htm (http://pdos.csail.mit.edu/6.828/2005/readings/i386/LGDT.htm)
Aca mucha mas informacion sobre la estructura:
http://www.acm.uiuc.edu/sigops/roll_your_own/i386/idt.html (http://www.acm.uiuc.edu/sigops/roll_your_own/i386/idt.html)