Windows “66:PUSH 08”中的66代表什么?

Windows “66:PUSH 08”中的66代表什么?,windows,assembly,nasm,portable-executable,disassembly,Windows,Assembly,Nasm,Portable Executable,Disassembly,测试平台是windows 32位 我使用IDA pro反汇编一个PE文件,做一些非常繁琐的转换工作,然后将其重新组装成一个新的PE文件 但是,如果我使用OllyDbg,则重新组装的PE文件与原始文件有一些不同 调试新的PE文件,尽管在我转换的程序集文件中该部分没有区别 以下是原始版本的一部分: 见 PUSH 8 PUSH 0 这是正确的 以下是我的新PE文件的一部分: 现在看 PUSH 8 PUSH 0 改为 66:6A 08 66:6A 00 并导致新PE的执行失败 基本上,从我所看

测试平台是windows 32位

我使用IDA pro反汇编一个PE文件,做一些非常繁琐的转换工作,然后将其重新组装成一个新的PE文件

但是,如果我使用OllyDbg,则重新组装的PE文件与原始文件有一些不同 调试新的PE文件,尽管在我转换的程序集文件中该部分没有区别

以下是原始版本的一部分:

PUSH 8 
PUSH 0
这是正确的

以下是我的新PE文件的一部分:

现在看

PUSH 8
PUSH 0
改为

66:6A 08
66:6A 00
并导致新PE的执行失败

基本上,从我所看到的,它导致堆栈不对齐

那么有人知道这部分有什么问题吗?在我转换的汇编代码中,我看不到任何差异

谁能给我一些帮助吗?谢谢大家!

66h是操作数大小覆盖前缀。在32位代码中,它将操作数大小从默认的32位切换到16位。因此,这里发生的情况是,PUSH指令在堆栈上推送一个16位的值,而不是32位的值,并且ESP被递减2,而不是4。这就是为什么调用后会出现堆栈不平衡

您应该查看汇编程序的文档,了解如何为PUSH imm指令强制32位操作数大小。不同的汇编程序对此使用不同的约定。例如,在NASM中,您可能会使用类似push dword 8的内容。

66h是操作数大小覆盖前缀。在32位代码中,它将操作数大小从默认的32位切换到16位。因此,这里发生的情况是,PUSH指令在堆栈上推送一个16位的值,而不是32位的值,并且ESP被递减2,而不是4。这就是为什么调用后会出现堆栈不平衡


您应该查看汇编程序的文档,了解如何为PUSH imm指令强制32位操作数大小。不同的汇编程序对此使用不同的约定。例如,在NASM中,您可能会使用类似push dword 8的内容。

它是一个前缀操作码字节:请参阅


0x66表示操作数大小重写。您的代码显然是在32位模式下运行的;不带前缀的PUSH将推送32位值。我认为这会导致PUSH获取16位值,并将其作为32位值推送到堆栈上。我写了很多汇编代码,从来没有必要这么做。

这是一个前缀操作码字节:请参阅


0x66表示操作数大小重写。您的代码显然是在32位模式下运行的;不带前缀的PUSH将推送32位值。我认为这会导致PUSH获取16位值,并将其作为32位值推送到堆栈上。我写了很多汇编代码,从来没有必要这么做。

听起来像是32位版本的操作码。请看:。听起来像32位版本的操作码。看看:。它真的会减少2而不是4吗?我认为x86-32体系结构不允许这样做;如果机器在那一刻被打断会发生什么?@Igor,谢谢!我发现我的转换代码中有一个问题,并修复它!它真的会减少2而不是4吗?我认为x86-32体系结构不允许这样做;如果机器在那一刻被打断会发生什么?@Igor,谢谢!我发现我的转换代码中有一个问题,并修复它!非常感谢您的回答@Ira!非常感谢您的回答@Ira!