2009-10-01 9 views
1

J'essaie d'utiliser l'assemblage en code C en utilisant des variables C. Mon code ressemble à ceci:Assemblage en ligne dans la commande C: INT et les variables C

__asm { INT interruptValue }; 

Où interruptValue 'est une variable que je reçois de l'utilisateur (15 ou 15h par exemple). Quand je tente de compiler je reçois:

Assembler error: 'Invalid instruction operands'

Je ne sais pas quel est le type correct pour interruptValue. J'ai essayé long \ int \ short \ char \ char * mais aucun d'eux n'a fonctionné.

Répondre

8

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); 
} 
+2

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

+1

@Falaina: vous devez faire attention à INT 3 car cela a un opcode différent, mais cela semble être une bonne idée. –

+0

@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