正文

Intel体系MMX指令&指令说明2011-05-06 23:34:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/aurora/52526.html

分享到:

EMMS MMX状态置空: 将FP特征字置空(全1),使后续浮点指令可以使用浮点寄存器,其他MMX指令自动置FP为全0.本指令应在所有MMX例程结束和调用可含有FP指令的例程时使用,以清除MMX状态. MOVD mm,r/m32 MOVD r/m32,mm 转移32位数据: 将32位数据从整型寄存器/内存移到MMX寄存器,和反向移动.MOVD不能在MMX寄存器之间,内存之间及整型寄存器之间移动数据.目标操作数为MMX寄存器时,32位源操作数写入目标寄存器的低32位.目标寄存器"0扩展"为64位.源操作数为MMX寄存器时,该寄存器的低32位被写入目标操作数. MOVQ mm,r/m64 MOVQ r.m64,mm 转移64位数据: 将64位数据从整型寄存器/内存移到MMX寄存器,和反向移动.目标操作数和源操作数可为MMX寄存器,64位内存操作数.但MOVQ不能在内存和内存之间进行数据转移. PACKSSWB mm,mm/m64 PACKSSDW mm,mm/m64 有符号饱和方式数据成组: 将MMX寄存器和MMX寄存器/内存单元中的有符号字组变成MMX寄存器的有符号字节组.和将MMX寄存器和MMX寄存器/内存单元中的有符号双字组变成MMX寄存器的有符号字组.(注1) PACKUSWB mm,mm/m64 无符号饱和方式数据成组 将MMX寄存器和MMX寄存器/内存单元中的有符号字组变成MMX寄存器的无符号字节组.(注1) PADDB mm,mm/m64 PADDW mm,mm/m64 PADDD mm,mm/m64 环绕方式数据组相加: 按环绕方式将MMX寄存器/内存单元中的字节组(字组,双字组)相加到MMX寄存器中(注1) PADDSB mm,mm/m64 PADDSW mm,mm/m64 饱和方式有符号数据组相加: 按饱和方式将MMX寄存器/内存单元中的有符号字节组(字组)相加到MMX寄存器中的有符号字节组(字组)数据.(注1) PADDUSB mm,mm/m64 PADDUSW mm,mm/m64 饱和方式无符号数据组相加: 按饱和方式将MMX寄存器/内存单元中的无符号字节组(字组)相加到MMX寄存器中的无符号字节组(字组)数据.(注1) PAND mm,mm/m64 逐位逻辑与: 将MMX寄存器/内存单元中的64位数据进行与操作,结果存于MMX寄存器中. PANDN mm,mm/m64 逐位逻辑与非: 将MMX寄存器中的64位值取反,再将取反后的MMX寄存器与MMX寄存器/内存单元中的64位数据进行与操作,结果存于MMX寄存器中. PCMPEQB mm,mm/m64 PCMPEQW mm,mm/m64 PCMPEQD mm,mm/m64 成组数据的相等比较: 将MMX寄存器与MMX寄存器/内存单元中的字节组(字组,双字组)数据进行相等比较. 该指令将目标操作数和源操作数的相应数据元素进行比较,相等则目标寄存器的对应数据元素被置为全1,否则置为全0. eg:PCMPEQE mm,mm/m64 mm ? ? 00000000000000111 0111000111000111 mm/m64 ? ? 11111110000001100 0111000111000111 结果mm ? ? 00000000000000000 1111111111111111 PCMPGTB mm,mm/m64 PCMPGTW mm,mm/m64 PCMPGTD mm,mm/m64 成组数据的相等比较: 将MMX寄存器与MMX寄存器/内存单元中的字节组(字组,双字组)数据进行大于比较. 该指令将目标操作数和源操作数的相应数据元素进行比较,大于则目标寄存器的对应数据元素被置为全1,否则置为全0.(参考上一条) PMADDWD mm,mm/m64 数据组(字组)的乘加: 将MMX寄存器与MMX寄存器/内存单元中的字组数据相乘,然后将32位结果逐对相加并作为双字存于MMX寄存器中. eg:PMADDWD mm,mm/m64 mm ? ? 0111000111000111 0111000111000111 操作 * * * * mm,mm/m64 ? ? 1000000000000000 0000010000000000 操作 \_____+____/ \______+_____/ mm ? ? 1100100011100011 1001110000000000 PMULHW mm,mm/m64 成组数据(字组)的乘后取高位: 将MMX寄存器与MMX寄存器/内存单元中的有符号字组数据相乘,然后将结果的高16位存入MMX寄存器. eg:PMULHW mm,mm/m64 mm ? ? 0111000111000111 0111000111000111 操作 * * * * mm/m64 ? ? 1000000000000000 0000010000000000 操作 High Order High Order High Order High Order mm ? ? 1100011100011100 0000000111000111 PMULLW mm,mm/m64 成组数据(字组)的乘后取低位: 将MMX寄存器与MMX寄存器/内存单元中的有符号字组数据相乘,然后将结果的低16位存入MMX寄存器.(参考上一条) POR mm,mm/m64 逐位逻辑或: 将MMX寄存器/内存单元中的64位数据进行或操作,结果存于MMX寄存器中. PSLLW mm,mm/m64 PSLLD mm,mm/m64 PSLLQ mm,mm/m64 PSLLW mm,imm8 PSLLD mm,imm8 PSLLQ mm,imm8 成组数据的逻辑左移: 将MMX寄存器中的字(双字,四字)数据按MMX寄存器/内存单元指定的个数左移,低位移入0. 将MMX寄存器中的字(双字,四字)数据按8位立即数指定的个数左移,低位移入0. PSRAW mm,mm/m64 PSRAD mm,mm/m64 PSRAW mm,imm8 PSRAD mm,imm8 成组数据的算术右移: 将MMX寄存器中的字(双字)数据按MMX寄存器/内存单元指定的个数右移,移动中保持符号位. 将MMX寄存器中的字(双字)数据按8位立即数指定的个数右移,移动中保持符号位. PSRLW mm,mm/m64 PSRLD mm,mm/m64 PSRLQ mm,mm/m64 PSRLW mm,imm8 PSRLD mm,imm8 PSRLQ mm,imm8 成组数据的逻辑右移: 将MMX寄存器中的字(双字)数据按MMX寄存器/内存单元指定的个数右移,移出位用0填充. 将MMX寄存器中的字(双字)数据按8位立即数指定的个数右移,移出位用0填充. PSUBB mm,mm/m64 PSUBW mm,mm/m64 PSUBD mm,mm/m64 环绕方式成组数据相减: 从MMX寄存器中按字节(字,双字)减去MMX寄存器/内存单元中的字节(字,双字)组.(注1) PSUBSB mm,mm/m64 PSUBSW mm,mm/m64 饱和方式有符号成组数据相减: 从MMX寄存器中的有符号成组字节(字)组数据减去MMX寄存器/内存单元中的有符号字节(字)组数据.(注1) PSUBUSB mm,mm/m64 PSUBUSW mm,mm/m64 饱和方式有符号成组数据相减: 从MMX寄存器中的无符号成组字节(字)组数据减去MMX寄存器/内存单元中的无符号字节(字)组数据.(注1) PUNPCKHBW mm,mm/m64 PUNPCKHWD mm,mm/m64 PUNPCKHDQ mm,mm/m64 高位成组数据分解: 此指令交替取出源操作数和目标操作数的数据元素的高半部分,写入目标操作数中,数据元素的低半部分被忽略. eg:PUNPCKHBW mm,mm/m64 PUNPCKLBW mm,mm/m64 PUNPCKLWD mm,mm/m64 PUNPCKLDQ mm,mm/m64 低位成组数据分解: 此指令交替取出源操作数和目标操作数的数据元素的低半部分,写入目标操作数中,数据元素的高半部分被忽略.(参考上一条) PXOR mm,mm/m64 逐位逻辑异或: 将MMX寄存器/内存单元中的64位数据进行异或操作,结果存于MMX寄存器中. < 注1: > 环绕模式vs饱和模式 在环绕式处理中,运算结果上溢或下溢后,溢出的高位被切断,只保留低位(最低有效位),并作为运算结果返回.即:进位位被丢掉.在饱和式处理模式中,上溢或下溢的运算结果被按照该数据类型的边界进行裁剪,超过上限被置为最大值,低于下限被置为最小值.这种模式可以使颜色处理中颜色值保持纯白色或纯黑色. 饱和方式的数据取值范围 :-) 下限 上限 有符号 十六进制 十进制 十六进制 十进制 字节(Byte) 80H -128 7FH 127 字(Word) 8000H -32,768 7FFFH 32,767 无符号 十六进制 十进制 十六进制 十进制 字节(Byte) 00H 0 FFH 255 字(Word) 0000H 0 FFFFH 65,535

阅读(1788) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册