0

我正在使用基于PIN的模拟器来测试一些新的架构修改。我需要使用我的模拟器测试带有两个操作数(一个寄存器和一个内存位置)的“新”指令。

由于使用 GCC 机器描述仅添加一条指令很乏味,因此使用 NOP 或未定义指令似乎是合乎逻辑的。PIN可以很容易地使用 检测 NOP 指令INS_IsNop,但它会干扰自然添加到代码中的 NOP,它也没有操作数或单个内存操作数。

剩下的唯一选择是使用未定义的指令。未定义的指令永远不会干扰代码的其余部分,并且可以通过PIN使用INS_IsInvalid.

问题是我不知道如何使用 GCC 内联汇编添加未定义的指令(带有操作数)。我怎么做?

4

2 回答 2

2

所以事实证明,x86 有一个明确的“未知指令”(参见this)。gcc 可以通过简单地使用来产生这个:

asm("ud2");

至于带有操作数的未定义指令,我不确定这意味着什么。一旦你有一个未定义的操作码,额外的字节都是未定义的。

但也许你可以得到你想要的东西:

asm(".byte 0x0f, 0x0b");
于 2016-01-10T21:27:56.880 回答
0

尝试使用通常不适用于指令的前缀。例如

rep add eax, [rsi + rax*4 - 15]

会组装得很好。一些指令集扩展就是这样完成的。eglzcnt被编码为rep bsf,因此它bsf在旧 CPU 上执行,而不是生成非法指令异常。(根据 x86 ISA 的要求,不适用的前缀将被忽略。)

这将让您利用汇编器对指令操作数进行编码的能力,正如 David Wohlferd 在他的回答中指出的那样,如果您使用ud2.

于 2016-01-12T05:47:38.617 回答