首页 > 解决方案 > 如何在内联汇编中使用 INT %0 和来自 C 变量的中断号?

问题描述

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

标签: cassemblygccx86inline-assembly

解决方案


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

如果interrupt可以将其评估为编译时常量,那么您可以这样做

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

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

如果您在运行时之前确实不知道中断号,您的选择是汇编所有 256 条可能的int指令并跳转到正确的指令,或者使用自修改代码。


推荐阅读