2

C変数を使用してCコードでアセンブリを使用しようとしています。私のコードは次のようになります。

__asm { INT interruptValue };

ここで、「interruptValue」はユーザーから取得した変数です(例:15または15h)。コンパイルしようとすると、次のようになります。

アセンブラエラー:'無効な命令オペランド'

割り込み値の正しいタイプがわかりません。long \ int \ short \ char \ char *を試しましたが、どれも機能しませんでした。

4

1 に答える 1

8

INTオペコードでは、変数(レジスタまたはメモリ)を引数として指定することはできません。次のような定数式を使用する必要がありますINT 13h

本当に変数割り込みを呼び出したい場合(そしてそうする場合は想像できません)、switchステートメントのようなものを使用して、使用する割り込みを決定します。

このようなもの:

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

編集:

これは単純な動的アプローチです。

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); 
}
于 2009-10-01T14:46:23.720 に答える