x86-64 模拟器应该如何解释字节序列 0x40 0x55?
How should the byte sequence 0x40 0x55 be interpreted by an x86-64 emulator?
我正在使用模拟器,我 运行 遇到的其中一个二进制可执行文件在过程开始时具有以下序列
40 55
40
是一个REX前缀,但是none的REX位实际上是设置的。 Intel 软件开发人员手册的第 2.2.1.7 节指出,隐式引用堆栈指针的指令将具有 64 位宽度。由于 55
是 push ?bp
指令,似乎一个简单的 55
就足以生成 push rbp
。那么为什么会有 40
前缀呢?
正如 Jongware 在他的评论中所说的那样,40 REX 前缀被忽略了。然而,您看到这个的原因不是因为编译器损坏,而是因为编译器遵循 Windows x64 ABI。函数必须以至少两个字节长的指令开始,以允许 hotpatching。您可能还会看到其他带有无意义的 REX 前缀的推送指令。
我正在使用模拟器,我 运行 遇到的其中一个二进制可执行文件在过程开始时具有以下序列
40 55
40
是一个REX前缀,但是none的REX位实际上是设置的。 Intel 软件开发人员手册的第 2.2.1.7 节指出,隐式引用堆栈指针的指令将具有 64 位宽度。由于 55
是 push ?bp
指令,似乎一个简单的 55
就足以生成 push rbp
。那么为什么会有 40
前缀呢?
正如 Jongware 在他的评论中所说的那样,40 REX 前缀被忽略了。然而,您看到这个的原因不是因为编译器损坏,而是因为编译器遵循 Windows x64 ABI。函数必须以至少两个字节长的指令开始,以允许 hotpatching。您可能还会看到其他带有无意义的 REX 前缀的推送指令。