intel汇编 MMX 指令简介

介绍:用于执行多媒体和图形处理任务。这些寄存器提供了对 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位清零.
MOVD r/m32,mm; 把 MM 的低32位值赋给 r32/m32.

MOVQ

移动四字

MOVQ mm, r/m64 把源r/m64的值送入目的MM.
MOVQ r/m64, mm ,MOVQ指令用于将一个64位MMX寄存器的值传送到内存或通用寄存器中

转换指令
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.

PSUBUSBPSUBUSB 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.

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值