汇编——SSE打包整数

SSE也可以进行整数向量的加法,示例如下:

;sse_integer.asm
extern printfsection .datadummy db 13
align 16pdivector1  dd  1dd  2dd  3dd  4pdivector2  dd  5dd  6dd  7dd  8fmt1    db      "Packed Integer Vector 1: %d, %d, %d, %d", 10, 0
fmt2    db      "Packed Integer Vector 2: %d, %d, %d, %d", 10, 0
fmt3    db      "Sum Vector: %d, %d, %d, %d", 10, 0
fmt4    db      "Reverse of Sum Vector: %d, %d, %d, %d", 10, 0section .bss
alignb 16pdivector_res   resd    4pdivector_other resd    4section .textglobal mainmain:
push rbp
mov rbp, rsp; 打印向量1mov rsi, pdivector1mov rdi, fmt1call printpdi
; 打印向量2mov rsi, pdivector2mov rdi, fmt2call printpdi; 添加两个对齐的双整数向量movdqa  xmm0, [pdivector1]paddd   xmm0, [pdivector2]
; 将结果保存在内存中movdqa  [pdivector_res], xmm0
; 打印内存中的向量mov     rsi, pdivector_resmov     rdi, fmt3call    printpdi; 将内存向量复制到xmm3movdqa  xmm3, [pdivector_res]
; 从xmm3中提取打包值pextrd  eax, xmm3, 0pextrd  ebx, xmm3, 1pextrd  ecx, xmm3, 2pextrd  edx, xmm3, 3
; 以相反顺序插入xmm0pinsrd  xmm0, eax, 3pinsrd  xmm0, ebx, 2pinsrd  xmm0, ecx, 1pinsrd  xmm0, edx, 0
; 打印反转后的向量movdqa  [pdivector_other], xmm0mov     rsi, pdivector_othermov     rdi, fmt4call    printpdi; 退出
mov rsp, rbp
pop rbp
ret;打印函数------------------------------------
printpdi:
push rbp
mov rbp, rspmovdqa xmm0, [rsi]; 从xmm0中提取打包值pextrd esi, xmm0, 0pextrd edx, xmm0, 1pextrd ecx, xmm0, 2pextrd r8d, xmm0, 3mov rax,0call printf
leave
ret

以上代码展现了两个整数向量的相加操作,并且将结果向量反向写进一个向量,然后输出。结果如下:
运行结果示例
需要注意的几个指令整理如下:

  • movdqa 把值复制到寄存器中,这个指令可以一下复制4个4字节的整型,字节/字/双字/四字有各自版本相同功能;
  • paddd 这个指令求寄存器和内存之和,这里应该不是pad-dd而是p-add-d,最后的那个d表示相加的是4字节的整型,字节/字/双字/四字有各自版本相同功能;
  • pextrd 这个指令把xmm寄存器中的指定双字提取出来,放到寄存器里,字节/字/双字/四字有各自版本相同功能;
  • pinsrd 这个指令和pextrd功能相反,字节/字/双字/四字有各自版本相同功能;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯练习系统(算法训练)ALGO-957 P0703反置数

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 一个整数的反置数指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的…

探索7个MAMP本地开发环境的高效替代软件

什么是本地开发环境 本地开发环境是Web开发环境中的一种类型,它是指开发者自己的计算机上配置的一套用于开发和测试网站或应用程序的软件集合。这套环境使得开发者可以在本地计算机上构建和测试网站,而无需实时部署到服务器。 创建本地开发环境有两种方…

论文阅读AI工具链

文献检索 可以利用智谱清言来生成合适的文献检索式,并根据需要不断调整。 谷歌学术 在Google Scholar中进行检索时,您可以使用类似的逻辑来构建您的搜索式,但是语法会有所不同。Google Scholar的搜索框接受普通的文本搜索,但是…

读所罗门的密码笔记13_群雄逐鹿(下)

1. 中国 1.1. 数字巨龙开始腾飞 1.1.1. 基于技术发展所创造的繁荣,虽然受到各方的干扰,但是使得大众更加支持数字政策 1.1.1.1. 数字服务广泛易得,并不意味着人们信任技术 1.1.2. 争取人工智能领导权的竞赛彰显了中国的雄心壮志 1.1.2.1…

[挖坟]如何安装Shizuku和LSPatch并安装模块(不需要Root,非Magisk)

2023年12月13日,LSPatch 停止维护 2024年1月8日,LSPosed 停止维护 2024年1月8日,ZygiskNext 停止维护 2024年1月9日,KernelSU 停止维护 这里使用 ColorOS 14 演示,其他品牌手机类似 安装 Shizuku 官网: https://shiz…

页面转word的那些事

背景 有些时候需要将页面内容或者是页面的数据通过word进行下载,以方便客户进行二次编辑,而不是直接导出图片或者是pdf。 想在页面端点击下载成word,那必然需要服务端来进行读写文件,无论是你后端编辑好的内容流,还是…

BMP280芯片I2C驱动开发指南

这颗芯片不太容易焊接,不能长时间风枪吹,否则容易掉壳。 第一部分 硬件连接 电路很简单,没什么需要注意的。 第二部分 软件驱动 本来打算使用SPL06的,结果焊接掉壳了,更换成bmp280了。函数名没有变过来。。。 void …

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

MySQL中数据库、表的操作

文章目录 一、管理数据库1.1、连接数据库1.2、创建库1.3、选择数据库1.4、修改数据库名称1.5、查看数据库信息1.6、删除库 二、定义数据表字段2.1、数据表字段的数据类型2.2、数据表字段属性2.3、约束讲解2.3.1、约束的定义1)为什么需要约束2)什么是约束…

Linux——线程互斥与互斥锁的使用

目录 前言 一、进程线程间的互斥相关背景概念 二、互斥量(互斥锁) 三、互斥锁的使用 1.互斥锁的初始化 2.加锁与解锁 3.锁的使用 4.锁的封装 四、线程饥饿 五、互斥锁的原理 六、死锁 前言 我们学习过线程概念与线程控制,知道了线…

Golang | Leetcode Golang题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; func threeSum(nums []int) [][]int {n : len(nums)sort.Ints(nums)ans : make([][]int, 0)// 枚举 afor first : 0; first < n; first {// 需要和上一次枚举的数不相同if first > 0 && nums[first] nums[first - 1] {conti…

埋点测试 之 前端和后端

埋点其实就是在程序中的某个位置加一个标记&#xff0c;当用户触发到某个行为的时候&#xff0c;就采集一下数据&#xff0c;然后将数据上报到某个位置进行存储&#xff0c;埋点的最终目的是收集到相关的数据&#xff0c;用于给运营人员提供数据支撑等。 1. 小程序&#xff1a;…