Pregunta

Estoy tratando de utilizar el montaje en código C, utilizando las variables de C. Mi código es el siguiente:

__asm { INT interruptValue };

Donde 'interruptValue' es una variable que recibo de que el usuario (por ejemplo 15 o 15 h). Cuando intento compilar me sale:

  

error de ensamblador: 'instrucción no válida   operandos

No sé lo que es el tipo correcto para interruptValue. Probé larga \ int \ corta \ Char \ char * pero ninguno de ellos funcionó.

¿Fue útil?

Solución

El código de operación INT no permite especificar una variable (registro o memoria) como argumento. Usted tiene que utilizar una expresión constante como INT 13h

Si su realmente desee llamar a las interrupciones variables (y no me puedo imaginar cualquier caso para hacerlo), usar algo como una sentencia switch para decidir qué interrumpir su uso.

Algo como esto:

switch (interruptValue)
{
   case 3:
       __asm { INT 3 };
       break;
   case 4:
       __asm { INT 4 };
       break;
...
}

EDIT:

Este es un simple aproach dinámica:

void call_interrupt_vector(unsigned char interruptValue)
{       
    //the dynamic code to call a specific interrupt vector
    unsigned char* assembly = (unsigned char*)malloc(5 * sizeof(unsigned char));
    assembly[0] = 0xCC;          //INT 3
    assembly[1] = 0x90;          //NOP
    assembly[2] = 0xC2;          //RET
    assembly[3] = 0x00;
    assembly[4] = 0x00;

    //if it is not the INT 3 (debug break)
    //change the opcode accordingly
    if (interruptValue != 3)
    {
         assembly[0] = 0xCD;              //default INT opcode
         assembly[1] = interruptValue;    //second byte is actual interrupt vector
    }

    //call the "dynamic" code
    __asm 
    {
         call [assembly]
    }

    free(assembly); 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top