我目前正在学习 Intel x86 处理器上的汇编编程。
有人可以向我解释一下,MMX 和 XMM 寄存器有什么区别?我对它们所服务的功能以及它们之间的区别和相似之处感到非常困惑?
MM 寄存器是 MMX 指令集使用的寄存器,这是将(仅整数)SIMD添加到 x86 的第一次尝试之一。它们是 64 位宽的,它们实际上是 x87 寄存器尾数部分的别名(但它们不受 FPU 栈顶位置的影响);这样做是为了保持与现有操作系统的兼容性(已经在上下文切换时保存了 FPU 堆栈),但同时使用 MMX 和浮点是一项不平凡的工作。
如今它们只是历史上的怪事,我认为没有人真正使用 MMX 了,因为它已被各种 SSE 扩展完全取代。编辑:正如 Peter Cordes 在评论中指出的那样,仍然有相当多的 MMX 代码。
相反,XMM 寄存器是一个完全独立的寄存器集,由 SSE 引入,至今仍被广泛使用。它们是 128 位宽的,指令可以将它们视为 64、32(整数和浮点)、16 或 8 位(仅限整数)值的数组。您有 8 个处于 32 位模式,16 个处于 64 位。几乎所有浮点数学都是在 64 位模式下的 SSE(以及 XMM 寄存器)中完成的,因此,与 MMX 寄存器不同,它们仍然非常相关。
现在你可能还会遇到 YMM 和 ZMM 寄存器;它们分别与 AVX (2011) 和 AVX-512 (2015) 指令集一起引入,它们扩展了 XMM 寄存器,与通用寄存器的e
和扩展不同(扩展可以访问为: )。r
rax
eax
ax
ah
al
在支持 AVX 的处理器中,XMM 寄存器文件中的每个寄存器都扩展为 256 位。整个 256 位寄存器称为 YMMx(x 从 0 到 15),可以被新的 AVX 指令使用,下半部分是 XMMx,仍然可以被旧的 SSE 指令使用。
同样,AVX-512 将上面的寄存器扩展为 512 位;整个寄存器是 ZMMx(可用于 AVX-512 指令),低 256 位是 YMMx(也可用于 AVX 指令),低 128 位仍然是 XMMx(也可用于 SSE)。此外,寄存器数量增加到 32 个,因此这些寄存器都更大,数量也增加了一倍。