简单解决方案:
一种常见的方法是添加内联装配,并直接编码指令字节。
例如:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
编译(GCC -O3)成:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
因此,只需将0x90替换为您的Inst字节即可。当然,您不会在常规的objdump上看到实际说明,并且该程序可能不会在系统上运行(除非您使用其中一种NOP组合),但是如果模拟器在那里正确实现,则该程序应识别它。
请注意,当编译器不知道此说明时,您不能期望编译器对您进行优化,并且如果更改状态(寄存器,内存),请注意并使用Inline Assembly clobber/Intup/Outption选项确保正确性。仅在需要时才使用优化。
复杂的解决方案
另一种方法是在您的编译器中实施此功能 - 可以在GCC中完成,但是如评论中所述,LLVM可能是最好的游戏之一,因为它设计为编译器开发平台,但仍然非常复杂由于LLVM最适合IR优化阶段,并且在尝试修改特定于目标的后端时的友好程度较小。
不过,这是可行的,如果您还计划让编译器决定何时发布此说明,则必须这样做。但是,我建议从第一个选项开始,看看您的模拟器是否甚至可以与此添加一起使用,然后才花时间在编译器端。
如果并且当您决定在LLVM中实施此功能时,最好的选择是将其定义为固有功能,则在此处存在相对更多的文档 - http://llvm.org/docs/extdendingllvm.html