Sobre interrupciones, supongo que cualquier aclaraci?n-aportaci?n nos vendr? bien, sobre todo en el sistema a seguir sobre el paso de par?metros, ya que el tipo de interrupci?n a llamar parece claro que debe efectuarse mediante eax:
http://www.cs.uaf.edu/2006/spring/cs321/le...interrupts.htmlRecordar tambi?n que en la parte m?s baja de la memoria (al menos en modo real) tenemos los llamados vectores de interrupci?n, siendo un total de 256,formados por sus correspondientes segmento:desplazamientos (4 bytes si no me equivoco en modo real), con lo cual para calcular el offset o desplazamiento necesitariamos multiplicar el n?mero de vector por 4.
Y ya puestos otras direcciones de memoria por encima de estos vectores (vector=apuntan a direcciones de memoria) se encuentra la famosa BDA o ?rea de datos bios 0040:0000 en adelante (tambi?n existe una EDBA).
El que existan estos vectores de interrupci?n no significa que se utilicen todos, muchos de ellos estan documentados en la web de Ralf Brown, otros simplemente son OEM que cada fabricante implementa como partes de la int 15h y que no necesariamente tienen porque estar documentados.
El hecho de que sean vectores significa que si modificamos la direcci?n a la que apuntan y lo direccionamos a otra donde ubicamos nuestro c?digo, cada vez que se llame a dicha interrupci?n har? lo que especifiquemos (no se si habre?s leido alguna vez sobre el mandato swapvectors o similares).
Retornamos de una llamada de interrupci?n mediante IRET (Interrupt Return).
Lo que no tengo muy claro es el resto de par?metros, si bien es cierto que podemos seguir pas?ndolos con el resto de registros disponibles, lo cual lleva a que interrupciones nos modifican en su retorno dichos registros y si debemos salvaguardarlos previamente.
Por ejemplo si una funci?n de C o Pascal la pasamos a ensamblador vemos que para que todo funcione bien los parametros de la funcion llamante se ponen en orden inverso:
function llamar (a,b,c,d:byte):byte;
se pondr?an el la cola de la pila en el orden d,c,b,a de manera que el c?digo que lo recoge saque primero el valor de la pila LIFO (Last In First Out: ?ltimo en entrar primero en salir) y de esa forma el primer valor que coger?a ser?a el a, luego el b, luego el c y despu?s el d que es el orden establecido inicialmente como queriamos.
Os dejo este enlace donde podeis leer m?s sobre esto:
http://www.hackinthebox.org/modules.php?op...order=0&thold=0No os extra?eis por el c?digo en ensamblador, est? en el formato AT&T que aunque a mi no me va mucho es la otra opci?n al que probablemente esteis acostumbrados de Intel, pero observ?ndolo un poco se entiende. El modo de entender aqu? los mandatos es por ejemplo al rev?s:
movl $4,%eax mueve $4 al registro eax
similar al formato Intel:
movl eax,04h
:rolleyes:
Solo una nota final:
En el modo protegido del procesador lo que se utilizan son descriptores siendo los principales:
- LDT.: Local Descriptor Table o Tabla de Descriptores Locales.
- GDT: Global Descriptor Table o Tabla de Descriptores Globales.
- IDT: Interrupt Descriptor Table o Tabla de descriptores de Interrupci?n.
Se cargan con una orden similar precedidos por una L de Load, y ah? a?n me pierdo, salvo que la cosa ya no va como se maneja en modo real el segmento de C?digo (CS) y el segmento de Datos (DS).
Bastante m?s complicado pero tambi?n tiene sus interrupciones con sus prioridades.
Al utilizar tablas permite por ejemplo que la memoria sea como un mapa reubicable de forma que se puede gestionar de una manera l?gica que luego se traduce a la real o f?sica (como dato curioso linux puede llegar a funcionar esquivando zonas de memoria defectuosa de forma similar a como se hace en un disco duro marcando las partes erroneas como no utilizables).
Como sigo aprendiendo si hay fallos, comentarios ayudas ya sabeis postear.