我正在使用模拟器,并且我遇到的其中一个二进制可执行文件在过程开始时具有以下顺序
40 55
40
是REX前缀,但实际上并未设置任何REX位。英特尔软件开发人员手册的第2.2.1.7节规定,隐式引用堆栈指针的指令将具有64位宽度。由于55
是push ?bp
指令,因此似乎简单的55
就足以生成push rbp
。那么为什么那里有40
前缀?
答案 0 :(得分:7)
正如Jongware在评论中所述,忽略了40个REX前缀。你之所以看到这个,不是因为编译器坏了,而是因为编译器遵循Windows x64 ABI。要求函数以至少两个字节长的指令开始,以允许hotpatching。您可能还会看到其他推送指令带有无意义的REX前缀。