C 中的内联汇编:INT 命令和 C 变量

发布于 2024-08-06 04:16:00 字数 284 浏览 3 评论 0原文

我正在尝试使用 C 变量在 C 代码中使用汇编。 我的代码如下所示:

__asm { INT interruptValue };

其中“interruptValue”是我从用户那里获得的变量(例如 15 或 15h)。 当我尝试编译时,我得到:

汇编器错误:'无效指令 操作数'

我不知道中断值的正确类型是什么。我尝试了 long\int\short\char\char* 但没有一个起作用。

I'm trying to use assembly in C code using C variables.
My code looks like this:

__asm { INT interruptValue };

Where 'interruptValue' is a variable I get from the user (e.g 15 or 15h).
When I try to compile I get:

Assembler error: 'Invalid instruction
operands'

I don't know what is the correct type for interruptValue . I tried long\int\short\char\char* but none of them worked.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

稍尽春風 2024-08-13 04:16:00

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

The INT opcode does not allow to specify a variable (register or memory) as an argument. You have to use a constant expression like INT 13h

If your really want to call variable interrupts (and I cannot imagine any case for doing so), use something like a switch statement to decide which interrupt to use.

Something like this:

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

EDIT:

This is a simple dynamic aproach:

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); 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文