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 位宽度。由于 55push ?bp 指令,似乎一个简单的 55 就足以生成 push rbp。那么为什么会有 40 前缀呢?

正如 Jongware 在他的评论中所说的那样,40 REX 前缀被忽略了。然而,您看到这个的原因不是因为编译器损坏,而是因为编译器遵循 Windows x64 ABI。函数必须以至少两个字节长的指令开始,以允许 hotpatching。您可能还会看到其他带有无意义的 REX 前缀的推送指令。