MMX和XMM注册之间的区别?

Tho*_*hor 12 x86 assembly sse x86-64 mmx

我目前正在学习英特尔x86处理器上的汇编编程.

有人可以向我解释一下,MMX和XMM注册有什么区别?我对他们所服务的功能以及它们之间的差异和相似性感到非常困惑?

Mat*_*lia 23

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寄存器,没有什么不同的er扩展的通用寄存器(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,因此这些寄存器更大,数量也是两倍.

  • x264和ffmpeg仍然有很多MMX代码,其中一些甚至用在具有SSE2和AVX2的CPU上.重写一些函数可能是一个小的加速,以便使用XMM的低半部分用于8B的东西.@CodyGray:这完全是胡说八道.x86-64(ISA)肯定包含x87/MMX寄存器.所有现代x86-64操作系统都保存/恢复x87状态(从而保存MMX状态).微软已经说过一些关于MMX的东西被弃用/不鼓励x86-64,但即使他们很清楚它确实至少在asm级别上工作,无论他们的编译器内在函数是否仍然有效. (4认同)
  • 好吧,我对汇编的学习大多是偶然的......我对x86汇编的了解最多来自C/C++应用程序的分析,事后调试和逆向工程,以及[代码高尔夫挑战]的一些乐趣(https:// codegolf.stackexchange.com/users/9298/matteo-italia),我通常在16位x86汇编中解决.很长一段时间我都没有明确地*学习它,它只是越过了我的道路,我最终知道了一些事情.然后我通过阅读大量英特尔IA32/EMT64手册"硬化"了一点我的知识. (2认同)
  • 不再使用MMX的另一个原因是因为x86-64根本不支持MMX. (2认同)
  • @CodyGray:AFAICT,这都是FUD.https://chessprogramming.wikispaces.com/MMX?responseToken=e9501a67e04a4f7c3efc2f4cde3d715e#MMX%20and%2064-bit%20Windows.MS的工具链可能拒绝组装MMX或x87指令,但仍然存在操作系统级上下文切换支持.GNU工具链(和NASM/YASM)在Win64,AFAIK上正常用于MMX.但是,内核代码不能使用MMX,只能使用SSE/AVX:https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/floating-point-support-for-64-bit-drivers . (2认同)