Is all x86 32-bit assembly code valid x86 64-bit assembly code?
我想知道 32 位汇编代码是否是 64 位汇编代码的子集,即每个 32 位汇编代码都可以在 64 位环境中运行?
我想答案是肯定的,因为 64 位 Windows 能够执行 32 位程序,但后来我看到 64 位处理器支持 32 位兼容模式?
如果不是,请提供一个不是有效 64 位汇编代码的 32 位汇编代码的小例子,并解释 64 位处理器如何执行 32 位汇编代码。
最佳答案
现代 x86 CPU 具有三种主要操作模式(此描述已简化):
维基百科有一个不错的表 x86-64 operating modes包括传统模式和实模式,以及长模式的所有 3 个子模式。在主流的 x86-64 操作系统下,启动后 CPU 内核将始终处于长模式,根据 32 位或 64 位用户空间在不同的子模式之间切换。 (不包括系统管理模式中断......)
现在 16 位、32 位和 64 位模式有什么区别?
16 位和 32 位模式基本上是一样的,除了以下区别:
现在,64 位模式有些不同。大多数指令的行为就像在 32 位模式下一样,但有以下区别:
inc reg
和 dec reg
指令不可用,它们的指令空间已重新用于 REX 前缀。两字节 inc r/m
和 dec r/m
仍然可用,所以 inc reg
和 dec reg
仍然可以编码。 [disp32]
绝对地址。 ah
, bh
, ch
, 和 dh
在需要 REX 前缀的指令中。 REX 前缀导致这些寄存器编号改为表示寄存器的低 8 位 si
, di
, sp
, 和 bp
. fs
外,分段覆盖是无意义的无操作和 gs
覆盖 (0x64, 0x65) 用于支持线程本地存储 (TLS)。 push/pop seg
(除了 push/pop fs/gs
),arpl
, call far
(只有 0xff 编码有效),les
, lds
, jmp far
(只有 0xff 编码有效),daa
, das
, aaa
, aas
, aam
, aad
, bound
(很少使用),pusha
/popa
(不适用于附加寄存器),salc
(未记录),lahf
和 sahf
不可用。 这基本上就是全部!
关于windows - x86 32 位汇编代码是否有效 x86 64 位汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089163/