介绍:用于执行多媒体和图形处理任务。这些寄存器提供了对 SIMD(单指令多数据流)指令集的支持,允许同时处理多个数据元素。MMX 寄存器包括 8 个 64 位寄存器,每个寄存器可以存储多个整数或浮点数数据。MMX 技术被广泛用于音频、视频编解码、图像处理等多媒体应用中,以提高处理效率和性能。
注: mmx有 mm0-mm7 共8个64位寄存器,但是寄存器并非独立寄存器,而是复用fpu数据堆栈寄存器,也就是说使用mmx指令集会破坏fpu的计算,如果同时使用 着两种特性,一定要注意这点,避免出现莫名的错误。
MM表示64位MMX寄存器.
r32表示32位通用寄存器或esi,edi
m32表示32位内存变量
m64表示64位内存变量
m128表示128位内存变量
imm8表示8位立即数
数据传输 | |
MOVD | 移动双字 MOVD mm,r/m32 ;把 r/m32 值赋给 MM 的低32位,高32位清零. |
MOVQ | 移动四字 MOVQ mm, r/m64 把源r/m64的值送入目的MM. |
转换指令 | |
PACKSSWB | packsswb MM,MM/m64 把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低32位 把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高32位 压缩时小于-128负数变为80h,大于127的正数变为7fh. |
PACKSSDW | packssdw MM,MM/m64 把目的寄存器按双字有符号数压缩为单字有符号数放入目的寄存器低32位 把源寄存器按双字有符号数压缩为单字有符号数放入目的寄存器高32位 压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh. 高32位 | 低32位 目的寄存器:a0 | a1 源寄存器: b0 | b1 目的寄存器压缩结果: b0 | b1 | a0 | a1 |
PACKUSWB | packuswb MM,MM/m64 把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低32位 把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高32位 压缩时负数变为00h,大于255的正数变为0ffh. 目的寄存器: a0 | a1 | a2 | a3 源寄存器: b0 | b1 | b2 | b3 目的寄存器压缩结果: b0|b1| b2|b3| a0|a1|a2|a3 |
PUNPCKHBW | punpckhbw MM,MM/m64 把目的寄存器与源寄存器的高32位按字节交错排列放入目的寄存器 目的寄存器: a0|a1|a2|a3|a4|a5|a6|a7 源寄存器: b0|b1|b2|b3|b4|b5|b6|b7 目的寄存器结果:b0|a0|b1|a1|b2|a2|b3|a3 |
PUNPCKHWD | punpckhwd MM,MM/m64 把目的寄存器与源寄存器的高32位按字交错排列放入目的寄存器 高32位 | 低32位 目的寄存器: a0 | a1 | a2 | a3 源寄存器: b0 | b1 | b2 | b3 目的寄存器结果:b0 | a0 | b1 | a1 |
PUNPCKHDQ | punpckhdq MM,MM/m64 把目的寄存器与源寄存器的高32位按双字交错排列放入目的寄存器 高32位 | 低32位 目的寄存器:a0 | a1 源寄存器: b0 | b1 目的寄存器结果: b0 | a0 |
PUNPCKLBW | punpcklbw MM,MM/m64 把目的寄存器与源寄存器的低32位按字节交错排列放入目的寄存器 高32位 | 低32位 目的寄存器: a0|a1|a2|a3|a4|a5|a6|a7 源寄存器: b0|b1|b2|b3|b4|b5|b6|b7 目的寄存器结果:b4|a4|b5|a5|b6|a6|b7|a7 |
PUNPCKLWD | 把目的寄存器与源寄存器的低32位按字交错排列放入目的寄存器 高32位 | 低32位 目的寄存器: a0 | a1 | a2 | a3 源寄存器: b0 | b1 | b2 | b3 目的寄存器结果:b2 | a2 | b3 | a3 |
PUNPCKLDQ | punpckldq MM,MM/m64 把目的寄存器与源寄存器的低32位按双字交错排列放入目的寄存器 高32位 | 低32位 目的寄存器:a0 | a1 源寄存器: b0 | b1 目的寄存器结果: b1 | a1 |
压缩算术指令 | |
PADDB | PADDB mm, mm/m64 将mm/m64和mm中的按字节整数相加 byte |
PADDW | PADDW mm, mm/m64 将mm/m64和mm中的按字整数相加 word |
PADDD | PADDQ mm, mm/m64 将mm/m64和mm中的按四字整数相加 quadword |
PADDSB | paddsb MM,MM/m64 按字节对齐,饱和有符号数(补码)相加(结果= -128~+127,80h~7fh),值送入目的MM. 当结果小于-128时,结果强制转为80h,当结果大于+127时,结果强制转为7fh. |
PADDSW | paddsw MM,MM/m64 按字对齐,饱和有符号数(补码)相加(结果= -32768~+32767,8000h~7fffh),值送入目的MM. 运算与paddsb类似,当结果小于-32768时,结果强制转为8000h,当结果大于,+32767时,结果强制转为7fffh. |
PADDUSB | paddusb MM,MM/m64 按字节对齐,饱和无符号数相加(结果= 0~255,0h~0ffh),值送入目的MM. 当结果大于255时,结果强制转为0ffh. |
PADDUSW | paddusw MM,MM/m64 按字对齐,饱和无符号数相加(结果= 0~65535,0h~0ffffh),值送入目的MM. 运算与paddusb类似,当结果大于65535时,结果强制转为0ffffh. |
PSUBB | psubb MM,MM/m64 按字节对齐,普通相减,与sub指令类似. |
PSUBW | psubw MM,MM/m64 按字对齐,普通相减,与sub指令类似. |
PSUBD | psubd MM,MM/m64 按双字对齐,普通相减.与add指令类似. |
PSUBSB | psubsb MM,MM/m64 按字节对齐,饱和有符号数(补码)相减(结果= -128~+127,80h~7fh),值送入目的MM. 运算与paddsb类似,当结果小于-128时,结果强制转为80h,当结果大于,+127时,结果强制转为7fh. |
PSUBSW | psubsw MM,MM/m64 按字对齐,饱和有符号数(补码)相减(结果= -32768~+32767,8000h~7fffh),值送入目的MM. 运算与paddsw类似,当结果小于-32768时,结果强制转为8000h,当结果大于,+32767时,结果强制转为7fffh. |
PSUBUSB | PSUBUSB mm, mm/m64 |
PSUBUSW | |
PMULHW | pmulhw MM,MM/m64 按字对齐,有符号(补码)相乘,取结果高16位,放入目的寄存器的对应字. 当MM0 == 2 acfeh,MM1 == 9 cef3h,执行 pmulhw,则MM0 = 0000 0000 0000 0fe7h 2 * 9 = 18,18 = 0000 0012h,取高16位 0000 为结果. 0acfeh == -21250,0cef3h == -12557,-21250*-12557 = 266836250 = 0fe7 991a h,取高16位 0fe7 为结果. |
PMULLW | pmullw MM,MM/m64 按字对齐,有符号(补码)相乘,取结果低16位,放入目的寄存器的对应字. 当MM0 == 2 acfeh,MM1 == 9 cef3h,执行 pmulhw,则MM0 = 0000 0000 0012 991ah 2 * 9 = 18,18 = 0000 0012h,取低16位 0012 为结果. 0acfeh == -21250,0cef3h == -12557,-21250*-12557 = 266836250 = 0fe7 991a h,取低16位 991a 为结果. |
PMADDWD | pmaddwd MM,MM/m64 按字对齐有符号(补码)向量点乘. 高32位 | 低32位 目的寄存器: a0 | a1 | a2 | a3 源寄存器: b0 | b1 | b2 | b3 目的寄存器结果: a0*b0+a1*b1 | a2*b2+a3*b3 |
比较 | |
PCMPEQB | 源寄存器与目的寄存器按字节比较,相等就置目的寄存器对应字节为0ffh,否则为00h 当MM0 == 20 11h,MM1 == 21 11h,执行pcmpeqb MM0,MM1,则MM0 = ff ff ff ff ff ff 00 ff h 注:MM0与MM1的高48为0,因为0 == 0,所以置目的寄存器对应字节为0ffh. |
PCMPEQW | pcmpeqw MM,MM/64 源寄存器与目的寄存器按字比较,相等就置目的寄存器对应字为0ffffh,否则为0000h |
PCMPEQD | pcmpeqd MM,MM/m64 源寄存器与目的寄存器按双字比较,相等就置目的寄存器对应双字为0ffffffffh,否则为00000000h |
PCMPGTB | pcmpgtb MM,MM/m64 源寄存器与目的寄存器按字节(有符号补码)比较, 当目的寄存器对应字节大于源寄存器就置目的寄存器对应字节为0ffh,否则为00h |
PCMPGTW | pcmpgtw MM,MM/m64 源寄存器与目的寄存器按字(有符号补码)比较, 当目的寄存器对应字大于源寄存器就置目的寄存器对应字为0ffffh,否则为0000h |
PCMPGTD | pcmpgtd MM,MM/m64 源寄存器与目的寄存器按双字(有符号补码)比较, 当目的寄存器对应双字大于源寄存器就置目的寄存器对应双字为0ffffffffh,否则为00000000h |
逻辑指令 | |
PAND | pand MM,MM/m64 64个位'与'操作,结果放入目的寄存器. |
PANDN | pandn MM,MM/m64 目的寄存器按位先取'非',再'与'源寄存器,结果放入目的寄存器. |
POR | por MM,MM/m64 64个位'或'操作,结果放入目的寄存器. |
PXOR | pxor MM,MM/m64 64个位'异或'操作,结果放入目的寄存器. |
移位和旋转 | |
PSLLW | psllw MM,MM/m64 psllw MM,imm8 把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低字移出的位不会移入高字. 例: 当MM0 = 0ffff ffff ffff ffffh,执行psllw MM0,1 则MM0 = 0fffe fffe fffe fffeh |
PSLLD | pslld MM,MM/m64 pslld MM,MM imm8 把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低双字移出的位不会移入高双字. 例: 当MM0 = 0ffffffff ffffffffh,执行pslld MM0,1 则MM0 = 0fffffffe fffffffeh |
PSLLQ | psllq MM,imm8 64位数据逻辑左移imm8位 |
PSRLW | psrlw MM,MM/m64 psrlw MM,imm8 把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失. 高字移出的位不会移入低字. 例: 当MM0 = 0ffff ffff ffff ffffh,执行psrlw MM0,1 则MM0 = 07fff 7fff 7fff 7fffh |
PSRLD | psrld MM,MM/m64 psrld MM,imm8 把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失. 高双字移出的位不会移入低双字. 例: 当MM0 = 0ffffffff ffffffffh,执行psrld MM0,1 则MM0 = 07fffffff 7fffffffh |
PSRLQ | PSRLQ MM,imm8 64位数据逻辑右移imm8位 |
PSRAW | psraw MM,imm8 16位并行算术右移 |
PSRAD | 32位并行算术右移 psrad MM,imm8 |
状态管理指令 | |
EMMS | Set the x87 FPU tag word to empty. |