c - 如何在内联汇编中使用 INT %0 和来自 C 变量的中断号?
问题描述
我想调用bios内联我的c代码。我试过asm("int %%al"::"a" (interrupt));
但 gcc write Error: operand size mismatch for 'int'
。我想知道该代码是否有效。
解决方案
该int
指令必须将其向量作为立即数;它没有从寄存器中获取数字的形式。见说明书说明;请注意,第二种形式是INT imm8
并且没有任何类似INT r8
或INT r/m8
允许寄存器或内存操作数的东西。
如果interrupt
可以将其评估为编译时常量,那么您可以这样做
asm volatile("int %0" : : "i" (interrupt));
请注意,为了让中断做一些有用的事情,您可能必须事先将各种值加载到寄存器中,并检索返回的值。这些将需要作为同asm
一块的一部分完成,需要更多的操作数和约束。你不能把类似的东西asm("mov $0x1a, %%ah");
放在前面的块中;编译器不需要在块之间保留寄存器内容。
如果您在运行时之前确实不知道中断号,您的选择是汇编所有 256 条可能的int
指令并跳转到正确的指令,或者使用自修改代码。
推荐阅读
- c++ - 是否可以在 C++ 中使用 void 指针传递二维数组?
- haskell - 有什么可生成的吗?
- react-native - React Native App - 向右滑动意味着所有组件卸载....这可以停止吗?
- java - 如果在使用 jpa 的映射表中但我在类中省略了表字段怎么办?
- python - git: pre-commit-hook: python + nodejs: 如何配置
- c# - 这段代码中是否有任何问题可能会阻止我的跳跃能力
- python - Embarcadero RAD Studio 10.4 的 Android SDK 问题(Delphi 和 C++ Builder 的问题相同)
- visual-studio-code - 如何在 VSCode 中跳转到单词的末尾?
- javascript - Firebase 身份验证重复错误
- c - ARM Cortex M4 - C 编程和内存访问优化