assembly inline in C: comando INT e variabili C
-
19-09-2019 - |
Domanda
Sto cercando di utilizzare assembly in codice C utilizzando le variabili C. Il mio codice è simile al seguente:
__asm { INT interruptValue };
Dove 'interruptValue' è una variabile che ricevo da parte dell'utente (per esempio 15 o 15 ore). Quando provo a compilare ottengo:
Errore Assembler: 'istruzione non valido operandi
Non so qual è il tipo corretto per interruptValue. Ho cercato a lungo \ int \ breve \ char \ char *, ma nessuno di loro ha lavorato.
Soluzione
Il codice operativo INT non permette di specificare una variabile (registro o memoria) come argomento. Devi usare un'espressione costante come INT 13h
Se la vostra voglia di chiamare gli interrupt variabili (e non riesco a immaginare comunque per farlo), usare qualcosa come un'istruzione switch per decidere quale interrompere da usare.
Qualcosa di simile a questo:
switch (interruptValue)
{
case 3:
__asm { INT 3 };
break;
case 4:
__asm { INT 4 };
break;
...
}
EDIT:
Questo è un semplice aproach dinamica:
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);
}