如何使用来自 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 r8
或 INT r/m8
这样允许寄存器或内存操作数的东西。
如果 interrupt
可以计算为编译时常量,那么您可以这样做
asm volatile("int %0" : : "i" (interrupt));
请注意,为了让中断做一些有用的事情,您可能必须事先将各种值加载到寄存器中,并检索返回的值。这些将需要作为同一 asm
块的一部分来完成,需要更多的操作数和约束。您不能在前面的块中放置类似 asm("mov [=17=]x1a, %%ah");
的内容;编译器不需要在块之间保留寄存器内容。
如果你真的直到运行时才知道中断号,你的选择是 assemble 所有 256 条可能的 int
指令并跳转到正确的指令,或者使用自修改代码。
我想调用 bios 内联我的 C 代码。我试过 asm("int %%al"::"a" (interrupt));
但 gcc 写 Error: operand size mismatch for 'int'
。我想知道代码是否有效。
int
指令必须将其向量作为立即数;它没有从寄存器中获取数字的形式。见 instruction description;请注意,第二种形式是 INT imm8
并且没有像 INT r8
或 INT r/m8
这样允许寄存器或内存操作数的东西。
如果 interrupt
可以计算为编译时常量,那么您可以这样做
asm volatile("int %0" : : "i" (interrupt));
请注意,为了让中断做一些有用的事情,您可能必须事先将各种值加载到寄存器中,并检索返回的值。这些将需要作为同一 asm
块的一部分来完成,需要更多的操作数和约束。您不能在前面的块中放置类似 asm("mov [=17=]x1a, %%ah");
的内容;编译器不需要在块之间保留寄存器内容。
如果你真的直到运行时才知道中断号,你的选择是 assemble 所有 256 条可能的 int
指令并跳转到正确的指令,或者使用自修改代码。