ensamblador en línea en C: comando INT y las variables de C
-
19-09-2019 - |
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ó.
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);
}