Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MMX和XMM寄存器之间的差异?_Assembly_X86_X86 64_Sse_Mmx - Fatal编程技术网

Assembly MMX和XMM寄存器之间的差异?

Assembly MMX和XMM寄存器之间的差异?,assembly,x86,x86-64,sse,mmx,Assembly,X86,X86 64,Sse,Mmx,我目前正在学习英特尔x86处理器上的汇编编程 有人能给我解释一下MMX和XMM寄存器的区别吗?我对它们所提供的功能以及它们之间的区别和相似性感到非常困惑。MM寄存器是MMX指令集使用的寄存器,它是首次尝试将(仅限整数)添加到x86的寄存器之一。它们是64位宽,实际上是x87寄存器尾数部分的别名(但它们不受FPU堆栈顶部位置的影响);这样做是为了保持与现有操作系统的兼容性(已经在上下文开关上保存了FPU堆栈),但将MMX与浮点一起使用是一项非常重要的工作 如今,它们只是一个历史上的怪胎,我认为没有

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


有人能给我解释一下MMX和XMM寄存器的区别吗?我对它们所提供的功能以及它们之间的区别和相似性感到非常困惑。

MM寄存器是MMX指令集使用的寄存器,它是首次尝试将(仅限整数)添加到x86的寄存器之一。它们是64位宽,实际上是x87寄存器尾数部分的别名(但它们不受FPU堆栈顶部位置的影响);这样做是为了保持与现有操作系统的兼容性(已经在上下文开关上保存了FPU堆栈),但将MMX与浮点一起使用是一项非常重要的工作

如今,它们只是一个历史上的怪胎,我认为没有人真正使用MMX了,因为它已经被各种SSE扩展完全取代了。编辑:正如PeterCordes在评论中指出的,仍然有一些MMX代码


相反,XMM寄存器是一个完全独立的寄存器集,与SSE一起引入,至今仍被广泛使用。它们的宽度为128位,指令可以将它们视为64位、32位(整数和浮点)、16位或8位(仅整数)值的数组。32位模式下有8个,64位模式下有16个。实际上,所有浮点运算都是在64位模式的SSE(以及XMM寄存器)中完成的,因此,与MMX寄存器不同,它们仍然非常相关

现在,您可能还会遇到YMM和ZMM寄存器;它们分别与AVX(2011)和AVX-512(2015)指令集一起引入,它们扩展了XMM寄存器,与扩展到通用寄存器的
e
r
不同(
rax
extended
eax
which extended
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个,因此这些寄存器都更大,数量增加了两倍。

你好,Matteo,非常感谢你的详细回答!似乎你对汇编语言非常了解,而我只是一个初学者,你介意我问一下你是如何学习的吗现在?再次感谢您的帮助!我对汇编的学习大多是偶然的……我对x86汇编的了解主要来自于对C/C++应用程序的评测、事后调试和逆向工程,以及一些有趣的东西,我通常用16位x86汇编来解决。很长一段时间我都没有真正明确地研究它,只是我曾多次遇到这种情况,最终我对它有所了解。然后我“变得坚强”通过阅读大量的英特尔IA32/EMT64手册,我对MMX有了一点了解。没有人再使用MMX的另一个原因是x86-64根本不支持MMX。x264和ffmpeg仍然有很多MMX代码,其中一些代码甚至在使用SSE2和AVX2的CPU上使用。重写某些函数以使用8B的东西只有XMM的一半。@CodyGray:那完全是胡说八道。x86-64(ISA)肯定包括x87/MMX寄存器。所有现代x86-64操作系统都保存/恢复x87状态(以及MMX状态).Microsoft说了一些关于MMX被弃用/不鼓励用于x86-64的东西,但即使是他们也很清楚,它至少在asm级别上确实有效,不管它们的编译器内部函数是否仍然有效。@CodyGray:AFAICT,这都是FUD。.MS的工具链可能拒绝组装MMX或x87指令,但操作系统级别的上下文切换支持端口仍然存在。GNU工具链(和NASM/YASM)对Win64上的MMX正常工作,AFAIK。但是,内核代码不能使用MMX,只有SSE/AVX:。有一些东西。有一个历史部分解释XMM寄存器是新的体系结构状态,与MMX寄存器不同。它提到SSE1到SSE4.x,因为
[SSE]
tag对于不同版本的SSE来说是一个包罗万象的工具。这里还有一些关于学习SIMD的编程指南/幻灯片/手册的链接。