如何使用来自 C 变量的中断号在内联 asm 中使用 INT %0?

How use INT %0 in inline asm with the interrupt number coming from a C variable?

我想调用 bios 内联我的 C 代码。我试过 asm("int %%al"::"a" (interrupt)); 但 gcc 写 Error: operand size mismatch for 'int'。我想知道代码是否有效。

int指令必须将其向量作为立即数;它没有从寄存器中获取数字的形式。见 instruction description;请注意,第二种形式是 INT imm8 并且没有像 INT r8INT r/m8 这样允许寄存器或内存操作数的东西。

如果 interrupt 可以计算为编译时常量,那么您可以这样做

asm volatile("int %0" : : "i" (interrupt));

请注意,为了让中断做一些有用的事情,您可能必须事先将各种值加载到寄存器中,并检索返回的值。这些将需要作为同一 asm 块的一部分来完成,需要更多的操作数和约束。您不能在前面的块中放置类似 asm("mov [=17=]x1a, %%ah"); 的内容;编译器不需要在块之间保留寄存器内容。

如果你真的直到运行时才知道中断号,你的选择是 assemble 所有 256 条可能的 int 指令并跳转到正确的指令,或者使用自修改代码。