汇编——SSE对齐(一. 未对齐情况)

2024-04-02 10:36
文章标签 情况 汇编 对齐 sse

本文主要是介绍汇编——SSE对齐(一. 未对齐情况),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SIMD是(Single Instrument Multi Data),MMX实现了SIMD;SSE是(Streaming SIMD Extension),它取代了MMX;后来AVX(Advanced Vector Extension,高级向量扩展)对SSE进行了扩展。如下代码展示了SSE处理未对齐内存的情况:

; sse_unaligned.asm
extern printf
section .dataspvector1   dd  1.1dd  2.2dd  3.3dd  4.4spvector2   dd  1.1dd  2.2dd  2.2dd  3.3dpvector1   dq  1.1dq  2.2dpvector2   dq  3.3dq  4.4fmt1        db  "Single Precision Vector 1: %f, %f, %f, %f", 10, 0fmt2        db  "Single Precision Vector 2: %f, %f, %f, %f", 10, 0fmt3        db  "Sum of Single Precision Vector 1 and Vector 2: %f, %f, %f %f", 10, 0fmt4        db  "Doule Precision Vector 1: %f, %f", 10, 0fmt5        db  "Doule Precision Vector 2: %f, %f", 10, 0fmt6        db  "Sum of Double Precision Vector 1 and Vector 2: %f, %f", 10, 0section .bssspvector_res resd 4dpvector_res resq 4
section .textglobal main
main:
push rbp
mov rbp, rspmov     rsi, spvector1mov     rdi, fmt1call    printspfpmov     rsi, spvector2mov     rdi, fmt2call    printspfpmovups  xmm0, [spvector1]movups  xmm1, [spvector2]addps   xmm0, xmm1movups  [spvector_res], xmm0mov     rsi, spvector_resmov     rdi, fmt3call    printspfpmov     rsi, dpvector1mov     rdi, fmt4call    printdpfpmov     rsi, dpvector2mov     rdi, fmt5call    printdpfpmovupd  xmm0, [dpvector1]movupd  xmm1, [dpvector2]addpd   xmm0, xmm1movupd  [dpvector_res], xmm0mov     rsi, dpvector_resmov     rdi, fmt6call    printdpfp
leave
retprintspfp:
push rbp
mov rbp, rspmovss       xmm0, [rsi]cvtss2sd    xmm0, xmm0movss       xmm1, [rsi+4]cvtss2sd    xmm1, xmm1movss       xmm2, [rsi+8]cvtss2sd    xmm2, xmm2movss       xmm3, [rsi+12]cvtss2sd    xmm3, xmm3mov         rax, 4call        printf
leave
retprintdpfp:
push rbp
mov rbp, rspmovsd   xmm0, [rsi]movsd   xmm1, [rsi+8]mov     rax, 2call    printf
leave
ret

需要注意的几个指令如下:
movups: 移动未对齐的打包单精度;(u:未对齐unalignedp:打包的packeds:单精度single;)
addps: 打包单精度相加;
movss: 移动标量单精度;(s:标量scalars:单精度single
cvtss2sd: 将标量单精度转换为标量双精度;(d:双精度double

这篇关于汇编——SSE对齐(一. 未对齐情况)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869747

相关文章

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

如何保证android程序进程不到万不得已的情况下,不会被结束

最近,做一个调用系统自带相机的那么一个功能,遇到的坑,在此记录一下。 设备:红米note4 问题起因 因为自定义的相机,很难满足客户的所有需要,比如:自拍杆的支持,优化方面等等。这些方面自定义的相机都不比系统自带的好,因为有些系统都是商家定制的,难免会出现一个奇葩的问题。比如:你在这款手机上运行,无任何问题,然而你换一款手机后,问题就出现了。 比如:小米的红米系列,你启用系统自带拍照功能后

Windows11电脑上自带的画图软件修改照片大小(不裁剪尺寸的情况下)

针对一张图片,有时候上传的图片有大小限制,那么在这种情况下如何修改其大小呢,在不裁剪尺寸的情况下 步骤如下: 1.选定一张图片,右击->打开方式->画图,如下: 第二步:打开图片后,我们可以看到图片的大小为82.1kb,点击上面工具栏的“重设大小和倾斜”进行调整,如下: 第三步:修改水平和垂直的数字,此处我修改为分别都修改为50,然后保存,可以看到大小变成63.5kb,如下:

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

自定义结构体的对齐问题

一、跨平台通用数据类型 之前的一篇博客Linux数据类型(通用移植),已经自定义尝试解决了数据通用类型问题。 这里通过源码进行分析,利用源码进行解决问题。在<stdint.h>中我们发现: typedef signed char int8_t;typedef unsigned char uint8_t;typedef short int16_t;typedef unsigned s

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

linux 查看内存使用情况

Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内存是其中最重要的一方面。自然的,Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况。下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法。 1. /pr

ubuntu内存资源使用情况监视

此处分享一个可以查看ubuntu系统中资源使用情况的指令,只需要在终端中输入一下这条指令即可: gnome-system-monitor

GDB 查看汇编

查看汇编 x disassemble

SylixOS ARM平台下内存对齐访问

1.内存对齐 1.1     内存对齐概要 现代计算机中内存空间都是按照byte划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 1.2     内存对齐作用和原因 各个硬件平台对存储空间的处理上有很大的不同。一些平