Встроенная сборка в команде C: INT и переменных C - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь использовать ассемблер в C-коде с использованием C-переменных. Мой код выглядит так:

__asm { INT interruptValue };

Где 'interruptValue' - это переменная, которую я получаю от пользователя (например, 15 или 15 часов). Когда я пытаюсь скомпилировать, я получаю:

Ошибка ассемблера: «Неверная инструкция операнды

Я не знаю, каков правильный тип для interruptValue. Я пробовал long \ int \ short \ char \ char *, но ни один из них не работал.

1 Ответ

8 голосов
/ 01 октября 2009

Код операции INT не позволяет указывать переменную (регистр или память) в качестве аргумента. Вы должны использовать константное выражение типа INT 13h

Если вы действительно хотите вызывать переменные прерывания (и я не могу представить ни одного случая для этого), используйте что-то вроде оператора switch, чтобы решить, какое прерывание использовать.

Примерно так:

switch (interruptValue)
{
   case 3:
       __asm { INT 3 };
       break;
   case 4:
       __asm { INT 4 };
       break;
...
}

EDIT:

Это простой динамический подход:

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); 
}
...