字节序列0x40 0x55应该如何被x86-64仿真器解释?

Joh*_*lén 6 assembly x86-64

我正在使用模拟器,我遇到的其中一个二进制可执行文件在过程开始时具有以下顺序

40 55
Run Code Online (Sandbox Code Playgroud)

40是REX前缀,但实际上没有设置任何REX位.英特尔软件开发人员手册的第2.2.1.7节规定,隐式引用堆栈指针的指令将具有64位宽度.由于55push ?bp指令,似乎简单55就足以生成一个push rbp.那么为什么40前缀呢?

Ros*_*dge 7

正如Jongware在他的评论中所述,忽略了40个REX前缀.你之所以看到这个,不是因为编译器坏了,而是因为编译器遵循Windows x64 ABI.函数需要以至少两个字节长的指令开头才能进行热修补.您可能还会看到其他带有无意义REX前缀的推送指令.