我真的怀疑这是否会正常工作。请记住,AMD64 架构丢弃了所有的INC
和DEC
操作码,以便用 REX 前缀替换它们,而指令本身则被替换为两字节等效项。这意味着如果您的 x86 代码包含 aINC
或DEC
编码为一个字节,则 CPU 在 x64 中工作时会将其视为 REX 前缀,并将尝试将指令流中的下一个字节解码为普通指令,这将最由于指令被解码为不合理的东西,肯定会导致一般保护错误或类似的东西。
这是一个例子。假设我想使用以下代码(NASM)在循环中访问一个数组。
bits 32
mov ecx, 200
myloop:
dec ecx
mov eax, [myarray+ecx*4+0x100]
jnz myloop
myarray resb 10
将其编译为平面二进制文件并将其反汇编为 64 位代码后,ndisasm
将返回以下内容:
00000000 B9C8000000 mov ecx,0xc8
00000005 498B048D0F010000 mov rax,[rcx*4+0x10f]
0000000D 75F6 jnz 0x5
如您所见,“循环”不再是真正的循环,因为它的计数器永远不会递减,并且根据最后修改零标志的指令进行跳转。这清楚地表明指令解码器在 32 位和 64 位模式下的工作方式非常不同,在 64 位模式下运行时,您实际上无法运行汇编为 32 位的代码。