第41部分-Linux x86 64位汇编MMX使用

使用MMX架构需要一下步骤

  1. 从整数值创建打包整数值
  2. 把打包整数值加载到MMX寄存器中
  3. 对打包整数值执行MMX数学操作。
  4. 从MMX寄存器获得结果放到内存位置中。

加载和获得打包的整数值,使用movq指令把整数值传送进/出MMX寄存器。

对比打包整数值操作,同时计算多个结果值,单一一组标志不能表示操作的结果。可以从执行数学操作的3种溢出方法中选择: 环绕/带符号饱和/无符号饱和。

带符号和无符号饱和运算方法把溢出情况的结果设置为预先设置的值。

正溢出就设置为最大值,负溢出就设置为最小值,数学角度没有意义。主要是应用于执行图像计算显示图片,正溢出就是最大值为白色,负溢出就是最小值为黑色。

操作的指令有如下:

MMX加法示例

两个long类型整数值存储到单一内存位置,创建打包双字整数值。移动到MMX寄存器,然后通过PADD指令相加,存放到MM0中,最后复制到result内存位置。

.section .data
value1:.int 10, 20
value2:.int 30, 40
.section .bss.lcomm result, 8
.section .text
.globl _start
_start:nopmovq value1, %mm0movq value2, %mm1paddd %mm1, %mm0movq %mm0, resultmovl $60, %eaxmovl $0, %ebxsyscall

编译:

as -g -o mmxadd.o mmxadd.s

ld -o mmxadd mmxadd.o

使用gdb调试,在退出前断点进行查看结果。

(gdb) x /2d &value1

0x6000d8:   10  20

(gdb) x /2d &value2

0x6000e0:   30  40

(gdb) x /2x &result

0x6000e8 <result>: 0x00000028  0x0000003c

gdb>info all

st0            <invalid float value>   (raw 0xffff0000003c00000028)

可以在st0寄存器中看到两个结果。MM0就是存在st0中的。

  1. MMX乘法示例

乘法比较困难,因为乘法生产的结果可能会比输入操作数大得多。乘法允许使用两条指令完成乘法操作。

PMULL把每对打包字整数值相乘,结果的低16位存放到目标寄存器。

PMULH把每对打包字整数值相乘,结果的高16位存放到目标寄存器。

带符号的是PMULLW和PMULHW,无符号的是PMULLUW和PMULHUW。

乘法系列中还有一个附加指令是PMADDWD指令。

MMX逻辑和移位

MMX中可用的布尔逻辑指令如下图:

SOURCE可以是MMX寄存器或者64位的内存位置,目标必须是MMX寄存器。

MMX比较

两个值比较指令如下图:

比较结果存放到目标打包整数值中。

  1. 示例

比较的示例如下,value1和value2被设置为保存4个short类型的整数值。加载到MMX寄存器中,然后使用PCMPEQW指令比较打包整数值的4个字值。结果存放到MM0寄存器,然后传送到result中。

.section .data
value1:.short 10, 20, -30, 40
value2:.short 10, 40, -30, 45
.section .bss.lcomm result, 8
.section .text
.globl _start
_start:nopmovq value1, %mm0movq value2, %mm1pcmpeqw %mm1, %mm0movq %mm0, resultmovl $60, %eaxmovl $0, %ebxsyscall

as -g -o mmxcomp.o mmxcomp.s

ld -g -o mmxcomp mmxcomp.o

使用gdb进行调试,开始时如下;

(gdb) x /x &value1

0x6000d8:   0x0014000a

(gdb) x /x &value2

0x6000e0:   0x0028000a

(gdb) x /x &result

0x6000e8 <result>: 0x00000000

执行移动到MM0/MM1后,ST0/ST1的寄存器如下:

st0 <invalid float value>  (raw 0xffff0028ffe20014000a)

st1 <invalid float value>  (raw 0xffff002dffe20028000a)

执行pcmpeqw后st0寄存器如下:

st0 <invalid float value>  (raw 0xffff0000ffff0000ffff)

(gdb) x /8x & result

0x6000e8 <result>: 0x0000ffff  0x0000ffff

我们发现结果如下:

相等的打包整数值,结果相等等于FFFF,不相等的等于0000。

第41部分-Linux x86 64位汇编MMX使用相关推荐

  1. 第19部分- Linux x86 64位汇编GDB单步调试

    第19部分- Linux x86 64位汇编GDB单步调试 本篇我们使用gdb来调试上篇中的汇编代码. gdb调试 使用gdb进行调试. #gdb ./addsum_arg 设置参数: (gdb) s ...

  2. 第77部分- Linux x86 64位汇编 优化编译器代码

    第77部分- Linux x86 64位汇编 优化编译器代码-O1/-O2/-O3 仅仅使用汇编语言代码替换C或者C++不会必然使得程序执行的更好,因为编译器已经把所有高级语言代码都转化成了汇编语言. ...

  3. 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(二)shellcode

    shellcode 是一组指令opcode, 是可以被程序运行,因为shellcode是要直接操作寄存器和函数,所以opcode 必须是十六进制的形式. 既然是攻击,那shellcode 主要的目的是 ...

  4. Mac OS X下64位汇编与Linux下64位汇编的一些不同

    1 首先系统调用号大大的不同:mac64和linux32的系统调用号也不同(虽然局部可能有相同) 2 mac64的系统调用号在: /usr/include/sys/syscall.h 可以查到,但是调 ...

  5. 64位汇编之linux系统调用

    linux系统中64位汇编和32位汇编的系统调用主要有以下不同: (1)系统调用号不同.比如x86中sys_write是4,sys_exit是1:而x86_64中sys_write是1, sys_ex ...

  6. 虚拟机上安装 Red Hat Enterprise Linux 7 64位

    一 .准备 1)可以支持64位 电脑一台: 2)安装VMware Workstaition 10及以上版本: 3)下载Red Hat Enterprise Linux 7 64位镜像: 二.安装 1) ...

  7. arm linux 64位,微软准备让Linux作为64位ARM Hyper-V客户机运行

    原标题:微软准备让Linux作为64位ARM Hyper-V客户机运行 虽然微软的Hyper-V虚拟化管理程序和他们的Azure云在很大程度上是以x86_64为中心的,但随着Linux 5.13内核的 ...

  8. visual studio 64位汇编 listing列表文件

    编写64位汇编与32位汇编步骤一样,但要增加一步 右键项目找到属性弹出窗口,如下图所示 在visual studio中生成列表文件 右键项目找到属性弹出窗口,如下图所示

  9. 查看linux是不是64位的命令

    方法1: 查看linux是不是64位的命令: #file /sbin/init 结果会出来 xx bit 方法二: # getconf LONG_BIT 32 getconf命令还可以获取系统的基本配 ...

最新文章

  1. 深度学习——训练时碰到的超参数
  2. postgresql 编码_开源力量与职业发展 --写给对PostgreSQL有志趣的朋友们
  3. OpenJDK 正式宣布AWT、2D、Swing等项目解散
  4. 基于以太坊网络的智能合约开发、部署和测试(入门)
  5. windows2008 sp2 x64安装 ocs 2007 r2 笔记
  6. 阿里开发者们的第13个感悟:工程师需要在循环迭代中成长
  7. 8除以2表示什么意思_八字中劫财,比肩分别表示什么意思
  8. hexo博客添加暗色模式_我如何将暗模式添加到我的网站
  9. 研磨设计模式之简单工厂模式
  10. 只要学会这个PDF压缩方法,压缩PDF不再是难题
  11. 7Zip下载-适用 Windows 解压软件
  12. php 图片合成,PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】...
  13. 事件代理(事件委托)
  14. 论文编辑与投稿——论文页眉、页码编辑,以及换章时偶数页设置成空白页的操作
  15. 1:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1
  16. DEMO-lidar原理介绍及数据集运行测试
  17. IIC总线随机读VHDL实现FIFO实现乒乓操作HM62256测试定制IP核
  18. 【C++实现】编译原理 免考小队 消除一切左递归
  19. bioperl 自动化下载genbank 中的序列
  20. linux系统编程:系统函数system

热门文章

  1. 网站设计:600个经典网站... (转)
  2. 仿网易云音乐html代码,仿网易云音乐外链播放器UI的HTML5音乐播放器插件
  3. FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning 论文解读
  4. 蚂蚁通讯框架SOFABolt之私有通讯协议设计
  5. Azure - AD B2C自定义策略和身份体验框架
  6. 如何解决Chrome禁止发送不安全的内网网络请求[origin ‘http://xxx.xxx.com:xxxx‘ has been blocked by CORS policy:...}
  7. 雨中的尾巴(线段树合并+树上差分)
  8. DSP软件测试用例,DSP汇编语言软件测试方法研究.doc
  9. LADRC线性自抗扰,三阶ESO状态扩张观测器,boost升压电路,双闭环控制,双LADRC控制,电压外环采用LADRC线性自抗扰控制
  10. WPS office出现“xxx.docx中发现无法读取内容,是否恢复此文档中的内容......word在试图打开文件时遇到错误” 紧急解决方案 -- 小黑日常超细解决教程