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.

È stato utile?

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); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top