当前位置: 首页 > article >正文

(学习笔记)3.11 浮点代码(3.11.1 浮点传送和转换操作)

文章目录线索栏笔记栏总结栏线索栏x86-64浮点体系结构经历了哪几个关键发展阶段当前的AVX2架构提供了哪些寄存器YMM/XMM它们的位宽和用途是什么图1,2用于在内存和XMM寄存器之间、以及XMM寄存器之间传送标量浮点数据的核心指令有哪些vmovss, vmovsd,vmovaps, vmovapd图3使用哪些指令执行何种舍入vcvttsd2si等向零舍入/截断图4使用哪些指令为何是三操作数格式vcvtsi2sd等图4GCC将float转double、double转float时生成了什么看似复杂的指令序列其实际效果是什么vunpcklpsvcvtps2pd等图5浮点参数和返回值通过哪个寄存器传递%xmm0图5如何分析类似fcvt、fcvt2这样的混合类型转换函数的汇编代码图5, 6给定源类型(src_t)和目的类型(dest_t)如何选择正确的转换指令练习题3.51图6笔记栏第一部分体系结构概述与寄存器 (对应图1, 2)历史演进从MMX(64位) - SSE(128位 XMM) - AVX(256位 YMM)。当前叙述基于2013年Haswell处理器引入的AVX2。AVX浮点寄存器16个YMM寄存器%ymm0~ %ymm15每个256位32字节。XMM寄存器每个YMM寄存器的低128位名为%xmm0~%xmm15用于标量浮点操作。标量数据存储float只使用XMM寄存器的低32位double使用低64位。寄存器用途约定 (图2)%xmm0第一个浮点参数/浮点返回值。%xmm1~%xmm7后续浮点参数。部分为“调用者保存”部分为“被调用者保存”。第二部分浮点传送指令 (对应图3)指令与功能 (图3-46)vmovss在内存(M32)和XMM寄存器间传送单精度(float)标量值。vmovsd在内存(M64)和XMM寄存器间传送双精度(double)标量值。vmovaps/ vmovapd在两个XMM寄存器间传送对齐的单/双精度数也可用于标量。代码示例 (float_mov函数)floatfloat_mov(floatv1,float*src,float*dst){floatv2*src;*dstv1;returnv2;}#v1in%xmm0,src in%rdi,dst in%rsifloat_mov:vmovaps%xmm0,%xmm1 # 复制 v1vmovss(%rdi),%xmm0 # 从 src 读取 v2 vmovss%xmm1,(%rsi)# 将 v1 写入 dst ret # 返回值 v2 在%xmm0第三部分浮点转换指令 (对应图4, 5)浮点数 - 整数 (双操作数图3-47)vcvttsd2siq将双精度数(M64/X)转换为四字整数(R64)向零舍入。类似指令处理float转int/long。整数 - 浮点数 (三操作数图3-48)vcvtsi2sdq将四字整数(M64/R64)转换为双精度数存入目的XMM寄存器。第二个源操作数另一个XMM的值不影响低位结果通常与目的相同。例vcvtsi2sdq %rax, %xmm1, %xmm1浮点精度转换 (GCC的特殊代码图5)float- doublevunpcklps%xmm0,%xmm0,%xmm0 # 将[x3,x2,x1,x0]变为[x1,x1,x0,x0]vcvtps2pd%xmm0,%xmm0 # 将两个低位单精度转双精度得[dx0,dx0]double- floatvmovddup%xmm0,%xmm0 # 将[x1,x0]变为[x0,x0]vcvtpd2ps%xmm0,%xmm0 # 将两个双精度转单精度存入低64位高位置零注意GCC生成此多指令序列而非单条vcvtss2sd/vcvtsd2ss的原因不明但效果相同。第四部分综合示例与练习 (对应图5, 6)函数 fcvt分析 (图5)参数整数和指针通过通用寄存器(%edi, %rsi等)传递。操作演示了加载、存储、整数与浮点、浮点精度间的多种转换。返回值double类型通过 %xmm0返回。练习题3.51 解答思路 (图6)src_tdest_t指令注释longdoublevcvtsi2sdq %rdi, %xmm0, %xmm0整数在%rdi结果到%xmm0doubleintvcvttsd2si %xmm0, %eax浮点在%xmm0结果到%eaxdoublefloatvcvtsd2ss %xmm0, %xmm0, %xmm0(或GCC的多指令序列)结果在%xmm0的低32位longfloat先用vcvtsi2sdq转double再用vcvtsd2ss转float需两步转换floatlongvcvttss2siq %xmm0, %rax浮点在%xmm0结果到%rax总结栏本节系统阐述了x86-64架构上浮点运算的机器级表示揭示了与整数体系既相似又不同的设计。独立的寄存器文件浮点操作使用专属的XMM/YMM寄存器组16个而非整数寄存器。这允许并行处理标量或向量数据并定义了专门的调用约定参数/返回值通过%xmm0等传递。指令集的分化浮点指令通常以v前缀开头并通过后缀ss-单精度标量, sd-双精度标量, ps-打包单精度,pd-打包双精度精确指明数据类型和操作模式。这与整数指令的b/w/l/q后缀体系类似但独立。转换规则明确1浮点转整数有专用的vcvttsd2si等指令且遵循C语言规范向零舍入。2整数/浮点互转使用不同的指令集整数到浮点为三操作数格式。3精度转换虽然GCC有时生成复杂的指令序列但其最终效果与单条转换指令等价了解其模式有助于阅读编译器输出。从高级到低级的映射通过fcvt等示例可以看到复杂的C语言类型转换被系统地分解为加载、转换、存储等原子机器指令。分析此类代码的关键是追踪每个数据的来源寄存器/内存、类型转换过程以及最终目的地。核心启示浮点代码的编译是类型系统到指令集的精确映射。理解浮点寄存器、指令后缀和转换规则是分析科学计算、图形处理等涉及浮点运算程序性能与行为的必备技能。尽管GCC的某些代码生成策略如精度转换看似冗余但了解其模式对调试和逆向工程至关重要。

相关文章:

(学习笔记)3.11 浮点代码(3.11.1 浮点传送和转换操作)

文章目录线索栏笔记栏总结栏线索栏 x86-64浮点体系结构经历了哪几个关键发展阶段?当前的AVX2架构提供了哪些寄存器(YMM/XMM)?它们的位宽和用途是什么?(图1,2)用于在内存和XMM寄存器之间、以及X…...

FSearch:让Linux文件搜索快到极致的GTK3神器,告别find命令的漫长等待

FSearch:让Linux文件搜索快到极致的GTK3神器,告别find命令的漫长等待 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 还在为Linux系统中查找文…...

智能游戏体验革新:League-Toolkit如何重新定义英雄联盟辅助工具

智能游戏体验革新:League-Toolkit如何重新定义英雄联盟辅助工具 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟…...

随堂笔记0403

负载监控计算机核心资源:CPU: 计算(lscpu)内存: 缓存数据(掉电丢失)硬盘: 持久化存储数据网络: 传播数据[rootCentos01 wyj]# lscpuCPU(s): 2型号名称&am…...

绝地求生自动压枪解决方案:告别后坐力困扰,提升射击精准度

绝地求生自动压枪解决方案:告别后坐力困扰,提升射击精准度 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在激烈的绝地求…...

OpenClaw环境迁移指南:将Phi-3-mini-128k-instruct配置复制到新电脑

OpenClaw环境迁移指南:将Phi-3-mini-128k-instruct配置复制到新电脑 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,虽然数据最终恢复,但重装OpenClaw环境的过程让我意识到:自动化工具的配置迁移应该像备份…...

tmux和screen对比

tmux和screen都是优秀的终端复用器,核心功能相似:在单个终端窗口中创建多个持久化的虚拟终端会话,实现会话保持、窗口分割和多任务管理。 核心对比概括: tmux:设计更现代,功能更强大灵活,配置…...

A53安全启动基石——TrustZone在A53中的硬件实现

该文章同步至公众号OneChan 开篇:回答上篇进阶思考 在上一篇探讨复位启动的种种陷阱后,我们留下的五个进阶思考问题,现在结合安全启动和TrustZone的特性进行分析: 1. 量子不确定性对复位电路的影响 量子隧穿效应:在…...

将软件需求“翻译”成硬件语言:一份让设计团队无法拒绝的黄金文档

该文章同步至公众号OneChan ——如何用硬件工程师的思维,赢得他们的尊重与代码 你提交的不是一份“需求清单”,而是一份“缺陷预防方案”和“效率提升指南”。 引言:一次代价高昂的“翻译失败” 数年前,我参与一个关键IP的开发。…...

Linux系统管理员必备命令大全

1. Linux命令概述作为一名Linux系统管理员,掌握常用命令是基本功。Linux命令是操作系统与用户交互的主要方式,通过命令行可以完成几乎所有系统管理任务。与图形界面相比,命令行操作更加高效、灵活,特别是在远程管理和自动化脚本方…...

PostgreSQL 选择数据库

PostgreSQL 选择数据库 引言 在当今数据驱动的世界中,选择合适的数据库系统对于企业来说至关重要。PostgreSQL,作为一款功能强大、开源的关系型数据库管理系统(RDBMS),因其卓越的性能、灵活性和可扩展性而备受青睐。本文将深入探讨PostgreSQL的特点,分析为何它是众多数…...

ESP32驱动ST7796S LCD的PlatformIO标准组件

1. 项目概述 htcw_esp_lcd_st7796 是一个专为 PlatformIO(PIO)生态定制的 ESP-IDF 兼容 LCD 驱动组件,封装了 Espressif 官方 esp_lcd 驱动框架中对 ST7796S 显示控制器的支持。该组件并非独立实现底层时序逻辑,而是基于 ESP-I…...

Eclipse 添加书签的详细指南

Eclipse 添加书签的详细指南 引言 Eclipse 作为一款功能强大的集成开发环境(IDE),被广泛应用于Java编程和软件开发领域。书签功能是Eclipse提供的一个便捷的工具,可以帮助开发者快速定位到代码中的特定位置。本文将详细介绍如何在Eclipse中添加书签,以及如何管理和使用这…...

ATtiny85轻量级图形库应用与优化

1. Tiny Graphics Library:ATtiny85上的轻量级图形解决方案在嵌入式开发中,为资源受限的MCU添加图形显示功能一直是个挑战。今天我要分享的是一个特别适合ATtiny85等低资源处理器的图形库——Tiny Graphics Library。这个库最大的特点就是完全不需要显示…...

HTML5从零到精通全攻略,一周内精通前端最基本框架

这是一篇为“什么都不懂的初学者”准备的HTML5超详细入门长文。请注意,文章较长,但结构清晰,配有大量简单例子和实战环节。我们遵循从概念到实践,从简单到复杂的路径。 ⚠️ 长文预警与学习指南 本文旨在用一周左右的时间&#x…...

终极鸣潮自动化工具指南:3步实现智能后台战斗与资源收集

终极鸣潮自动化工具指南:3步实现智能后台战斗与资源收集 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves ok-ww是一款基…...

UI UX PRO MAX怎么做

4月6日 ui ux 能够自动设计项目...

网络SEO优化与移动端优化的关系是什么

网络SEO优化与移动端优化的关系:为什么两者不可分割 在当前互联网时代,网络SEO优化与移动端优化的关系越来越受到企业和营销人员的关注。随着移动互联网的普及,越来越多的用户通过手机浏览器进行网络搜索和浏览。因此,如何在网络…...

AlienFX Tools终极控制方案:彻底释放Alienware设备潜力的完整攻略

AlienFX Tools终极控制方案:彻底释放Alienware设备潜力的完整攻略 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 如果你对Alienware官方臃…...

鸿蒙_ArkTS解决Duplicate function implementation错误

在鸿蒙应用开发中编写自定义构建函数时遇到了Error Message: Duplicate function implementation.错误,原因是在多个不同页面(.ets文件)中使用了相同名称的组件外自定义构建函数,导致预览器报错:导致报错的代码如下&am…...

Windows下OpenClaw安装指南:一键部署gemma-3-12b-it镜像

Windows下OpenClaw安装指南:一键部署gemma-3-12b-it镜像 1. 为什么选择OpenClawGemma组合 去年第一次听说OpenClaw时,我正被各种重复性工作折磨——每天要手动整理几十份会议纪要、处理上百封邮件。作为一个技术出身的效率控,我本能地抗拒这…...

Flutter 自定义 Widget:打造独特的用户界面

Flutter 自定义 Widget:打造独特的用户界面突破内置组件的局限,创造属于你自己的 UI 组件。一、自定义 Widget 的意义 作为一名追求像素级还原的 UI 匠人,我深知内置组件的局限。有时候,设计稿上的那个特殊按钮,那个独…...

Stepper595:基于74HC595的轻量步进电机驱动库

1. Stepper595库概述:基于74HC595的轻量级步进电机驱动方案Stepper595是一个面向资源受限嵌入式平台的精简型步进电机控制库,其核心设计哲学是“用最少的硬件引脚、最简的时序逻辑、最低的代码开销实现可靠双电机协同控制”。该库不依赖传统GPIO逐位模拟…...

嵌入式开发必备硬件知识解析与应用

1. 嵌入式开发与硬件的关系解析作为一名在嵌入式领域摸爬滚打多年的工程师,我经常被新人问到一个经典问题:"做嵌入式软件开发是不是可以完全不懂硬件?"我的回答永远是:你可以选择不精通,但绝对不能完全不懂。…...

OpenClaw技能市场挖掘:千问3.5-9B增强插件TOP5

OpenClaw技能市场挖掘:千问3.5-9B增强插件TOP5 1. 为什么需要关注OpenClaw技能市场? 第一次接触OpenClaw时,我以为它只是个简单的自动化脚本工具。直到在项目里连续熬了三个深夜处理邮件分类和会议纪要,才意识到自己错过了什么—…...

AI模型平台进入深水区:技术落地能力成胜负手

AI模型平台进入深水区:技术落地能力成胜负手 随着AI技术在各行业加速渗透,模型平台已成为企业智能化转型的关键基础设施。当前市场格局下,百度千帆、阿里ModelScope、华为ModelArts与新兴的模力方舟(MoArk)正在上演一场关于技术落地能力的终极…...

锁相双极性PWM电机驱动原理与STM32实现

1. 项目概述Motor_LockedAntiphase是一个面向嵌入式电机控制的轻量级驱动库,专为实现锁相双极性PWM(Locked Antiphase PWM)控制模式而设计。该模式广泛应用于直流有刷电机(DC Brushed Motor)的双向调速与精确力矩控制场…...

告别环境冲突|Anaconda实战:AI开发全流程(数据→训练→部署)环境标准化指南,建议收藏

摘要:告别环境冲突、依赖地狱、复现失败!本文以 Anaconda 为核心,打造一套可复制、可迁移、可团队协作的 AI 全流程标准化方案,覆盖环境初始化→数据预处理→模型训练→打包部署,一套流程通吃个人实验与工程落地。前言…...

AI Agent 时代的分布式闭源众创 AI Coding 云编程平台 (CSCD) 实现原理与生产应用

AI Agent 时代的分布式闭源众创 AI Coding 云编程平台 (CSCD) 实现原理与生产应用 文章目录 AI Agent 时代的分布式闭源众创 AI Coding 云编程平台 (CSCD) 实现原理与生产应用 第 1 章 AI Agent 时代与 CSCD 平台概述 1.1 AI Agent 时代的到来 1.1.1 从传统编程到 AI 辅助编程的…...

AD09 PCB设计技巧与实战经验分享

1. PCB设计基础与AD09软件概述作为一名从业十年的硬件工程师,我使用Altium Designer(简称AD)完成了近百个PCB设计项目,从简单的双面板到复杂的八层板都有涉及。AD09虽然是比较早期的版本,但其核心功能已经非常完善&…...