Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lweb20 en 24 Julio 2013, 01:14 am



Título: Problemas con _fastcall e interrupciones
Publicado por: lweb20 en 24 Julio 2013, 01:14 am
Buenas, aquí estoy continuando con el desarrollo de mi sistema operativo.

Hoy decidí cambiar la convención de llamada de mi sistema de _cdecl a _fastcall porque si no me equivoco _fastcall reduce el tamaño del ejecutable y casi siempre usa registros en lugar de la pila, lo cual lo hace más veloz al SO. (Corríjanme si me equivoco).

Resulta que tuve un pequeño problema con las interrupciones del SO (el manejador del teclado, etc..).

El manejador del teclado dejó de funcionar :o. Entonces empecé a testear y testear, investigar e investigar y nada :(. Aquí les dejo el código a ver si alguien me da una mano:

Código:
void __cdecl Teclado::manejador(){
_asm cli // deshabilito interrupcionnes
_asm pushad // guardo registros generales en la pila

// aquí va todo el código para controlar las teclas... etc......

_asm popad // saco los registros guardados de la pila
_asm sti // habilito interrupciones si no me quedo colgado xD
_asm iret // salgo de la interrupción
}

El error que sale es Invalid opcode.

También tengo la duda si el manejador debe ser _cdecl o puede ser _fastcall porque con ninguna funciona :(

Ojalá alguien pueda ayudarme por favor  ;D


Título: Re: Problemas con _fastcall e interrupciones
Publicado por: xv0 en 24 Julio 2013, 04:06 am
El error dice que estas intentando ejecutar un opcode que no es valido para el procesador, tambien depende del modo de operacion del procesador.

Cual es ese opcode invalido?

Ya que he visto las instrucciones pushad y popad, te pregunto si estas en 64 bits?

Un saludo.


Título: Re: Problemas con _fastcall e interrupciones
Publicado por: lweb20 en 24 Julio 2013, 05:13 am
Ah si me olvidé mencionar que estoy trabajando en 32 bits.

Reformulo mi pregunta ya que he hecho varios cambios. ¿Es posible que un handler de interrupción (por ejemplo del PIT) sea fastcall? y cómo.

- pushad y popad meten y sacan los registros del CPU de 32 bits.

EDIT

- el tipo de llamada o convención _fastcall es más rápido que _cdecl verdad?


Título: Re: Problemas con _fastcall e interrupciones
Publicado por: xv0 en 24 Julio 2013, 06:21 am
Reformulo mi pregunta ya que he hecho varios cambios. ¿Es posible que un handler de interrupción (por ejemplo del PIT) sea fastcall? y cómo.

Lee esto.

Código:
http://www.agner.org/optimize/calling_conventions.pdf

Tambien he ledio por hay que fastcall no esta estandarizada.

- pushad y popad meten y sacan los registros del CPU de 32 bits.

Si lose, pero como no indicaste en que modo estabas esas instrucciones en 64 bits generan un opcode invalido, que es el error que muestras y te pregunte y que no contestaste, de donde viene ese opcode invalido?

- el tipo de llamada o convención _fastcall es más rápido que _cdecl verdad?

Si, ya que fastcall utiliza los registros y no el stack.

Pero ya veo que esto es C++ y Windows, cosa que no me gusta, asi que no puedo ayudarte mejor, mas bien era por el code en ASM.

Un saludo.


Título: Re: Problemas con _fastcall e interrupciones
Publicado por: lweb20 en 24 Julio 2013, 06:22 am
Gracias me haz aclarado muchas dudas.