Problemas con _fastcall e interrupciones

Iniciado por lweb20, 24 Julio 2013, 01:14 AM

0 Miembros y 2 Visitantes están viendo este tema.

lweb20

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:

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

cpu2

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.

lweb20

#2
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?

cpu2

Cita de: lweb20 en 24 Julio 2013, 05:13 AMReformulo 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.

http://www.agner.org/optimize/calling_conventions.pdf

Tambien he ledio por hay que fastcall no esta estandarizada.

Cita de: lweb20 en 24 Julio 2013, 05:13 AM- 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?

Cita de: lweb20 en 24 Julio 2013, 05:13 AM- 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.

lweb20