文档章节

MMX指令集系列之一

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 877
阅读 8
收藏 0

MMX指令有8个64位寄存器(MM0~MM7),不过可惜都是借的FPU的, FPU原来有8个80位寄存器(st(0)~st(7)),现在用在了MMX上,所以用之后要加上一条EMMS指令,用以复位.

MMX寄存器有64位,可以同时进行8对字节或4对字或2对双字同时相同操作,还可以进行饱和运算,不会溢出,当然也可以进行普通运算.

特别要注意的一点是:在x86上,一个字,WORD的长度是16位,而在ARM上,一个WORD的长度是32位。

描述约定:

  MM表示64位MMX寄存器.
  r32表示32位通用寄存器或esi,edi
  m32表示32位内存变量
  m64表示64位内存变量
  m128表示128位内存变量
  imm8表示8位立即数
  左操作数为目的操作数,右操作数为源操作数

 

1. 数据搬移指令

  

   movd MM,r32/m32

   把 r32/m32 值赋给 MM 的低32位,高32位清零.

   movd r32/m32,MM

   把 MM 的低32位值赋给 r32/m32.
  例:
  当 MM0 == 0x12345678 87654321,eax == 0x0abc 时, 执行movd MM0,eax, 则 MM0 == 0x 0abc
  当 MM0 == 0x12345678 87654321,eax == 0x0abc 时, 执行movd eax,MM0, 则 eax  == 0x 87654321

 movq MM,MM/m64

  把源MM/m64的值送入目的MM.

  例:
     当  MM == 0x1234567887654321, MM1 == 0x3141592653时,执行movq MM0,MM1,则MM0 == 0x3141592653

 2. 饱和算数加减运算指令

    paddsb MM,MM/m64

  按字节对齐,饱和8位有符号数相加
  当结果小于-128时,结果强制转为80h,当结果大于+127时,结果强制转为7fh.
  例:
  当  MM0 == 0x 00 c0  fe 7e 11,
       MM1 == 0x 12 a6 9c 10 02, 执行 paddsb MM0,MM1,
   则     MM0 == 0x 12 80 9a 7f 13

  paddsw MM,MM/m64


  按字对齐,饱和16位有符号数相加

     结果强制到 -32768,+32767之间

 

  paddusb MM,MM/m64


  按字节对齐,饱和无符号数相加(结果= 0~255,0h~0ffh),值送入目的MM.
  当结果大于255时,结果强制转为0ffh,结果小于0时强制为0

 

  paddusw MM,MM/m64


  按字对齐,饱和无符号数相加(结果= 0~65535,0h~0ffffh),值送入目的MM.
  运算与paddusb类似,当结果大于65535时,结果强制转为0ffffh.

     注:减法指令与上述类似,总结为下表:

 

 

PADDS[B,W] 饱和有符号数加[byte, word]
PADDUS[B,W] 饱和无符号数加[byte, word]
PSUBS[B,W] 饱和有符号数减[byte, word]
PSUBUS[B,W] 饱和无符号数减[byte, word]

 

3. 普通算数加减运算指令

   paddb MM,MM/m64

  按字节对齐,普通相加,与add指令类似.
  例:
  当MM0 = 12 34 56 78  ab cd ef  fe,
     MM1 = 87 69 86 54 3d ea  cb 03,执行paddb MM0,MM1,
  则MM0 = 99 9d dc  cc  e8 b7 ba 01h


  paddw MM,MM/m64
  按字对齐,普通相加,与add指令类似.

  paddd MM,MM/m64
  按双字对齐,普通相加.与add指令类似.

  paddq MM,MM/m64
  按四字对齐,普通相加.
  例:
  当MM0 == 0fffffffffffffffeh,MM1 == 3h,执行paddq MM0,MM1,则MM0 = 1h

  psubb MM,MM/m64
  按字节对齐,普通相减,与sub指令类似.

  psubw MM,MM/m64
  按字对齐,普通相减,与sub指令类似.

  psubd MM,MM/m64
  按双字对齐,普通相减.与add指令类似.

  psubq MM,MM/m64
  按四字对齐,普通相减.
  例:
  当MM0 == 1h,MM1 == 3 h,执行psubq MM0,MM1,则MM0 = 0fffffffffffffffeh

 小结

     1. 饱和算数加减运算的指令中有S标记

     2. 饱和运算只有8位和16位两种,分为无符号和有符号。

本文转载自:http://www.cnblogs.com/celerychen/archive/2013/03/23/2977285.html

共有 人打赏支持
abcijkxyz
粉丝 64
博文 6196
码字总数 1876
作品 0
深圳
项目经理
C/C++ 编译器--AsmJit

AsmJit 是一个完整的 JIT(Just-In-Time,运行时刻)的针对 C++ 语言的汇编器,可以生成兼容 x86 和 x64 架构的原生代码,不仅支持整个 x86/x64 的指令集(包括传统的 MMX 和最新的 AVX2 指令集...

匿名
2009/06/27
2.5K
1
cpu指令集包括哪些?

如题!我知道有mmx,sse等等.可是mmx指令集是在96年才有的, 而之前386,486,586等那些呢,包含哪些指令,相关资料在哪下载? 是不是sse1包含mmx,,,,,,,sse2包含sse1,,,,,,,sse3包含sse2 我知道去英...

音乐&编程
2012/09/14
2.1K
3
i386和x86-64区别通俗易懂版本(转)

x86架构首度出现在1978年推出的Intel 8086中央处理器,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的。Intel之后又推出了包括80186、80286、80386以及80486。 在设计上...

easonjim
2017/07/25
0
0
(学习心得):进程,线程,超线程,并发,并行 等概念

前言: 此陋文来自最近对阅读《深入理解计算机系统》与《微型计算机体系结构:Intel Core Duo / i 系列微处理器技术应用》两本书的学习体会, 前者从 程序员的视角来探讨计算机系统中各部件的...

shayi
2012/11/26
5.5K
28
Flat Assembler 1.70 发布,汇编工具

Flat Assembler 是一个快速高效的80x86的汇编工具,支持DOS、Windows、Linux操作系统,支持包括 8086-80486/Pentium instructions with MMX, SSE, SSE2, SSE3, and 3DNow! extensions and x......

红薯
2012/04/19
1K
10

没有更多内容

加载失败,请刷新页面

加载更多

String ,  StringBuffer ,  StringBuilder的区别

String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可...

tsmyk0715
49分钟前
2
0
区块链100讲:UTXO 和 Account 模型对比

在当前区块链世界中,主要有两种记录保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型,同样 CITA 也采用了 ...

HiBlock
51分钟前
1
0
Vue中路由管理器Vue Router使用介绍(三)

一、路由定义添加动态参数定义 1.路由定义项,使用:xx 方式 定义动态参数 { path:'/user/:id/:name', name:'user', component:()=>import('./views/User.vue') ...

tianma3798
52分钟前
1
0
从ibdata文件恢复mysql数据

DROP TABLE 恢复【一】 Recover InnoDB dictionary Percona Data Recovery Tool 单表恢复

IT--小哥
55分钟前
1
0
常见设计模式UML图

常见设计模式UML图 本文主要总结常见的设计模式的UML图,方便查阅和思考。 创建型模式 简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和单例模式,这五种设计模式主要处理对象的创建...

陶小陶
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部