我正在使用基于 PIN 的模拟器来测试一些新的架构修改。我需要使用我的模拟器测试带有两个操作数(寄存器和内存位置)的“新”指令。
由于使用GCC机器描述仅添加一条指令很麻烦,因此使用NOP或未定义指令似乎是合乎逻辑的。 PIN 可以很容易地使用INS_IsNop
检测NOP指令,但它会干扰代码自然添加的NOP,它也没有操作数或单个内存操作数。
剩下的唯一选择是使用和未定义的指令。未定义的指令永远不会干扰代码的其余部分,并且可以使用INS_IsInvalid
通过 PIN 进行检测。
问题是我不知道如何使用GCC内联汇编添加未定义的指令(带操作数)。我该怎么做?
答案 0 :(得分:2)
事实证明,x86有一个明确的"未知指令" (见this)。 gcc可以通过简单地使用:
来产生这个asm("ud2");
对于带有操作数的未定义指令,我不确定这意味着什么。一旦你有一个未定义的操作码,额外的字节都是未定义的。
但也许你可以通过以下方式得到你想要的东西:
asm(".byte 0x0f, 0x0b");
答案 1 :(得分:0)
尝试使用通常不适用于指令的前缀。 e.g。
rep add eax, [rsi + rax*4 - 15]
组装就好了。一些指令集扩展以这种方式完成。例如lzcnt
编码为rep bsf
,因此它在较旧的CPU上执行为bsf
,而不是生成非法指令异常。 (根据x86 ISA的要求,将忽略不适用的前缀。)
这将让你利用汇编程序编写指令操作数的能力,正如David Wohlferd在他的回答中指出的那样,如果你使用ud2
就会出现问题。