目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有:
Intel的MMX指令是Intel IA系列指令的扩展,使用了单指令多数据技术(SIMD),以并行方式处理多个数据元素。MMX扩展指令集新增了57条指令和一种64位的4字数据,作为成组的数据可供MMX指令操作。一个64位数据类型可以包含8个字节、4个字、两个双字或者一个4重字类型,这样一条MMX指令即可以同时处理2/4/8个数据单元。为了适应这样的数据,MMX增加了8个64位寄存器(MM0~MM7),仅有MMX指令可以按寄存器名称直接访问。
MMX针对8~32位数据元素的处理性能进行了改善,一个MMX指令可以处理8个字节,一个时钟周期内完成两条指令,即一个时钟周期可以处理16个字节。此外,MMX技术为其他功能释放了额外的处理器周期,更小的处理器占用率可以实现更高程度的并发。
MMX指令集从功能上可以分为8类:数据传送指令、算术运算指令、比较运算指令、类型转换指令、扩展压缩数据指令、逻辑运算指令、移位运算指令、状态清除指令。指令列表如下:
在以上指令中,除了EMMS指令外,都涉及两个操作数,即源操作数和目标操作数,指令中源操作数在右,目标操作数在左。目标操作数可作为第二个源操作数进行操作,指令结束后被运算结果所覆盖
1)、数据转移指令:
数据转移指令实现MMX寄存器同内存单元之间,以及MMX寄存器同通用寄存器之间的双向数据传递功能。
MOVD:转移32位(4字节)数据;MOVQ:转移64位(8字节)数据。
2)、算数运算指令:
算数运算指令对打包的数据类型实现加法、减法、乘法和乘加操作。
在介绍算术运算指令前,先简要介绍一下所谓的“环绕模式”和“饱和模式”。所谓环绕模式,就是当一个数据单元的数据达到最大值(比如一个字节的值为255)时,如果继续对其加1,那么该字节的数据将变为0,进位将被忽略。饱和模式则对数据的溢出进行了限制,根据有符号或者无符号类型,将运算后的结果限制在数据类型规定的范围以内。
PMADDWD的计算结果如图示显示:
3).比较指令:
PCMPEQB/PCMPEQW/PCMPEQD和PCMPGTB/PCMPGTW/PCMPGTD指令按照有符号类型数据比较源和目标操作数进行相等比较或大于比较。对于相等比较,如果一对数据元素相等,则目标操作数中的相应数据元素设置为全 1;否则设置为全 0。对于大于比较,如果目标操作数中的数据元素大于源操作数中相应的数据元素,则目标操作数中的相应数据元素设置为全 1;否则设置为全 0。
4).类型转换指令:
PACKSSWB指令将有符号字转换成为有符号的字节;PACKSSDW将有符号的双字转换成为有符号的字;转换过程都按照有符号饱和模式进行。
PACKUSWB指令将有符号的字转换为无符号的字节,转换过程按照无符号饱和模式进行。
5).扩展压缩数据指令:
PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ指令和PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ分别将源于目标操作数的高位数据和低位数据取出并交错排入目标操作数中。PUNPCKHBW和PUNPCKLBW的示意图如下:
PUNPCKHBW操作示意图
PUNPCKLBW操作示意图
6).逻辑运算指令:
PAND——逻辑按位与;PANDN——逻辑按位与非;POR——逻辑按位或;PXOR——逻辑按位或非;
7).位移指令:
位移指令有逻辑左移、逻辑右移和算数右移三种。
PSLLW/PSLLD/PSLLQ和PSRLW/PSRLD/PSRLQ实现逻辑左移和右移操作,并用0填充空出来的高位或低位。支持字型、双字型和四字型数据;PSRAW/PSRAD实现算数右移操作,并将符号位拷贝到右移所空出的比特位上。
8).状态清除指令:
EMMS指令用于将MMX状态清空。该指令在一个MMX程序结束时执行。
除了8个MMX寄存器之外,CPU还有自己的通用寄存器EAX/EBX/ECX/EDX。这四个通用寄存器都是32位寄存器,可以直接访问,还可以按照16位和8位进行访问。如EAX可以使用AX获得低16位,AX可以使用AH和AL分别获取高8位和低8位。其余的寄存器有ESI/EDI/ESP/EBP等。功能描述见下图:
1).LEA指令
LEA指令将源操作数的偏移地址传递给通用寄存器。如以下代码:
LEA BX, [2400H]
该指令将[2400H]的偏移地址2400传送给BX,执行后BX=2400H。
2).LDS指令
LDS指令将4字节源内存的数据按照段地址和偏移地址传送给链各个寄存器,其中低地址的2字节作为偏移地址送给作为目标操作数的寄存器,高地址的2字节作为段地址送到DS寄存器。如以下代码:
LDS DI, [2130H]
该指令将低地址2130H、2131H的数据作为偏移地址送到DI中,2132H、2133H的数据作为段地址送到DS中。
SSE和SSE2是基于MMX的新的汇编指令集,将寄存器的大小从64位扩展到128位,且增加了新的媒体处理汇编指令。
一、SSE/SSE2数据结构
SSE技术支持打包的单精度浮点数操作(Packed Single-Precision Floating-point),将4个独立的32位单精度浮点数打包为一个128位数据。SSE提供了8个128位SIMD寄存器XMM0~XMM7,可以直接存取,但只能存放数据而不能用于寻址。此外SSE还提供了新的控制/状态寄存器MXCSR。
SSE2指令包括原油的32位通用寄存器(EAX~EDX)、64位MMX寄存器(MM0~MM7)、128位XMM(XMM0~XMM7)和32位标识寄存器EFLAGS及浮点状态/控制寄存器MCSR。此外还有两种数据类型:128位的打包双精度浮点数和4种128位SIMD整数。
二、SSE/SSE/2指令
SSE指令集包含70条指令,主要可以分为三组:
SSE2指令集主要包括针对128位和64位的打包双精度浮点计算指令,记忆64位和128位的SIMD整数指令、MMX/SSE的128位扩展指令、高速缓存控制盒指令排序指令。