L'opcode INT ne permet pas de spécifier une variable (registre ou mémoire) en tant qu'argument. Vous devez utiliser une expression constante comme INT 13h
Si vous voulez vraiment appeler des interruptions variables (et je ne peux imaginer aucun cas pour le faire), utilisez quelque chose comme une instruction switch pour décider quelle interruption utiliser.
Quelque chose comme ceci:
switch (interruptValue)
{
case 3:
__asm { INT 3 };
break;
case 4:
__asm { INT 4 };
break;
...
}
EDIT:
Ceci est une aproche dynamique simple:
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);
}
Comme un exercice amusant, vous pouvez coder probablement une variable d'interruption en utilisant l'auto code modification , vous devrez juste changer la valeur du second octet de l'instruction INT pour l'interruption que vous voulez. – Falaina
@Falaina: vous devez faire attention à INT 3 car cela a un opcode différent, mais cela semble être une bonne idée. –
@Falina: Comment puis-je modifier le code? Tout ce que je peux penser est de mettre l'instruction dans une fonction différente et ensuite de changer quelques octets avec un décalage de l'adresse de la fonction. – Eldad