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

现代X86汇编-C和ASM混合编程举例

端午假期安装好了vs c++2022,并写了个简单的汇编代码,证明MASM真的可以运行。今天需要搞一个实实在在的C++和ASM混合编程的例子,因为用纯汇编的求伯君写WPS的时代一去不复返了。个别关键函数用汇编,充分发挥CPU的特色功能,偶尔还是需要的。

昨天找的随书代码的位置在github上:GitHub - Apress/modern-x86-assembly-language-programming-3e: Source Code for 'Modern X86 Assembly Language Programming' by Daniel Kusswurm

这是第三版,最新的书。又从z-liabrary上下载了这本英文书,导入微信读书,自动翻译为中文,z-libary加微信读书,使我实现了读书ziyou(啥时候财务ziyou,还远)。

这本书的附录A就举了怎样在vs2022环境建立一个C++加ASM的例子,今天咱们就逐步跟着书上学这个例子。

首先创建project

• Create a C++ project• Enable MASM support• Add an assembly language file• Set project properties•Edit the source code• Build and run the project

  1. 启动VS
  2. New Project
  3. Select Console App
  4. Project name:Example1
  5. Solution name:TestSolution
  6. Create
  7. Build>Configuration Manager,choose <Edit...>
  8. select X86, Remove--我的环境是Win32

其次,配置ASM环境的步骤

  1. View>Solution Explorer
  2. rigtht-click Example1 and select Build Denpendencies>Build Customizations
  3. check masm
  4. Add New Item
  5. select .cpp for the file style
  6. Example1_fasm.asm Add

第三步是设置project属性

  1. Example1  and select Properties
  2. All Configurations   All Platforms
  3. C/C++>Code Generation Set to Advanced Vector Extentions(/arch:AVX) or AVX2 or AVX512
  4. C/C++>Output change to Files Assembly Machine and Source Code(/FAcs)
  5. Microsoft Macro Assembler>Listing File  Enable Assembly Generated Code Listing to Yes(/Sg)
  6. Change the Assembled Code Listing File text filed to $(IntDir)\%(filename).lst
  7. Click OK

$(IntDir)\%(filename).lst  --这是1还是L?

最后一步就是写源码了

  1. AppendixA\TestSolution\Example1\Example1.cpp
  2. AppendixA\TestSolution\Example1\Example1_fasm.asm

Example1.cpp

#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>extern "C" void CalcZ_avx(float* z, const float* x, const float* y, size_t n);static void CalcZ_cpp(float* z, const float* x, const float* y, size_t n)
{for (size_t i = 0; i < n; i++)z[i] = x[i] + y[i];
}int main(void)
{constexpr size_t n = 20;float x[n], y[n], z1[n], z2[n];// Initialize the data arraysfor (size_t i = 0; i < n; i++){x[i] = i * 10.0f + 10.0f;y[i] = i * 1000.0f + 1000.0f;z1[i] = z2[i] = 0.0f;}// Exercise the calculating functionsCalcZ_cpp(z1, x, y, n);CalcZ_avx(z2, x, y, n);// Display the resultsconstexpr char nl = '\n';constexpr size_t w = 10;constexpr float eps = 1.0e-6f;std::cout << std::fixed << std::setprecision(1);std::cout << std::setw(w) << "i";std::cout << std::setw(w) << "x";std::cout << std::setw(w) << "y";std::cout << std::setw(w) << "z1";std::cout << std::setw(w) << "z2" << nl;std::cout << std::string(50, '-') << nl;for (size_t i = 0; i < n; i++){std::cout << std::setw(w) << i;std::cout << std::setw(w) << x[i];std::cout << std::setw(w) << y[i];std::cout << std::setw(w) << z1[i];std::cout << std::setw(w) << z2[i] << nl;if (fabs(z1[i] - z2[i]) > eps){std::cout << "Compare error!\n";break;}}}

Example1_fasm.asm

;------------------------------------------------------------------------------
; Example1_fasm.asm
;------------------------------------------------------------------------------;------------------------------------------------------------------------------
; void CalcZ_avx(float* z, const float* x, const float* x, size_t n);
;------------------------------------------------------------------------------NSE     equ 8                                   ;num_simd_elements
SF      equ 4                                   ;scale factor for F32.code
CalcZ_avx proc; Validate argumentstest r9,r9                              ;n == 0?jz Done                                 ;jump if yes; Initializemov rax,-SF                             ;rax = array offset (Loop2)cmp r9,NSE                              ;n < NSE?jb Loop2                                ;jump if yesmov rax,-NSE*SF                         ;rax = array offset (Loop1); Calculate z[i:i+7] = x[i:i+7] + y[i:i+7]
Loop1:  add rax,NSE*SF                          ;update array offsetvmovups ymm0,ymmword ptr [rdx+rax]      ;ymm0 = x[i:i+7]vmovups ymm1,ymmword ptr [r8+rax]       ;ymm1 = y[i:i+7]vaddps ymm2,ymm0,ymm1                   ;z[i:i+7] = x[i:i+7] + y[i:i+7]vmovups ymmword ptr [rcx+rax],ymm2      ;save z[i:i+7]sub r9,NSE                              ;n -= NSEcmp r9,NSE                              ;n >= NSE?jae Loop1                               ;jump if yestest r9,r9                              ;n == 0?jz Done                                 ;jump if yesadd rax,NSE*SF-SF                       ;adjust array offset for Loop2; Calculate z[i] = x[i] + y[i] for remaining elements
Loop2:  add rax,SF                              ;update array offsetvmovss xmm0,real4 ptr [rdx+rax]         ;xmm0 = x[i]vmovss xmm1,real4 ptr [r8+rax]          ;xmm1 = y[i]vaddss xmm2,xmm0,xmm1                   ;z[i] = x[i] + y[i]vmovss real4 ptr [rcx+rax],xmm2         ;save z[i]sub r9,1                                ;n -= 1jnz Loop2                               ;repeat until doneDone:   vzeroupperret                                     ;return to caller
CalcZ_avx endpend

最终构建运行即可

代码有点高大上,估计是用了AVX,两个loop同时运行。慢慢看书了解含义吧,还挺复杂的。

这个例子太高深了,再举个简单的例子,把数组倒序输出。

相关文章:

现代X86汇编-C和ASM混合编程举例

端午假期安装好了vs c2022,并写了个简单的汇编代码&#xff0c;证明MASM真的可以运行。今天需要搞一个实实在在的C和ASM混合编程的例子&#xff0c;因为用纯汇编的求伯君写WPS的时代一去不复返了。个别关键函数用汇编&#xff0c;充分发挥CPU的特色功能&#xff0c;偶尔还是需要…...

485. 最大连续 1 的个数

给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3.示例 2: 输入&#xff1a;nums […...

席卷的B站《植物大战僵尸杂交版》V2.0.88整合包,PC和手机可用,含通关存档和视频教程!

今天给大家安利一款席卷B站&#xff0c;火爆全网的游戏——《植物大战僵尸杂交版》2.0.88整合包。 这个是网络上现存植物大战僵尸杂交版的最全整合&#xff0c;包含了修改工具&#xff0c;超强通关存档和高清工具。工具包有安装视频教程&#xff0c;支持手机版和pc多端使用&am…...

液晶拼接屏企业应该采取哪些措施来提升整体竞争力和市场地位呢?

步入智能科技时代以来&#xff0c;商显行业面对着各式各样的挑战&#xff0c;人工智能、AI大模型等整合中&#xff0c;液晶拼接屏企业应该采取哪些措施以提升整体竞争力和市场地位。下面小编个人观点简单说一下&#xff1b;下是一些关键的措施&#xff1a; 首先&#xff0c;加…...

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码&#xff0c;源码自带90套授权证书模板&#xff0c;带PSD公章模板&#xff0c;证书PSD源文件。 环境要求&#xff1a;PHPMYSQL&#xff0c;PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…...

遥控玩具车电机驱动应用中的双H桥驱动芯片

遥控玩具车的基本工作原理是通过无线电遥控器发送信号&#xff0c;这些信号被玩具车内的接收器接收并解码&#xff0c;从而控制玩具车的运行。根据车身外型的不同&#xff0c;可以分为&#xff1a;普通的私家房车、越野车、货柜车、翻斗车等等。遥控器的操作&#xff0c;如前进…...

Linux 基本指令1

ls指令 ls【-选项】【目录或文件】当不指定目录或文件时指令能列出当前目录下所有文件除隐藏文件 选项&#xff1a; -a 列出所有包括隐藏的文件-隐藏文件以.开头。 -d 将目录如文件般显示-一般用ls显示目录是显示其目录中所有文件&#xff0c;加-d则显示目录的信息 -r 以反…...

基于Seatunnel最新2.3.5版本分布式集群安装部署指南(小白版)

基于Seatunnel2.3.5版本分布式集群安装部署 1.环境准备2.JDK安装3.Maven安装4.Seatunnel在master节点安装部署配置4.1.下载Seatunnel安装包4.2.解压下载好的tar.gz包4.3.下载连接器4.4.配置Seatunnel的系统环境变量4.5.配置 SeaTunnel Engine服务 JVM参数4.6.配置文件中集群相关…...

SSM小区疫情防控系统-计算机毕业设计源码03748

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 小区疫情防控系统&#xff0c;主要的模块包括查看首页、轮播图&#xff08;轮播图管理&#xff09;、社区公告管理&#xff08;社区公告&#…...

英伟达算法岗面试,问的贼专业。。。

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…...

GIS之arcgis系列09:arcpy实现克里金差值

矢量点数据经过克里金差值后可以转换成栅格数据&#xff0c;那么就需要了解一下什么是克里金差值。 什么是克里金法? IDW(反距离加权法)和样条函数法插值工具被称为确定性插值方法&#xff0c;因为这些方法直接基于周围的测量值或确定生成表面的平滑度的指定数学公式。第二类…...

MySQL的group by与count(), *字段使用问题

文章目录 问题group by到底做了什么举个例子简单来说为什么select字段&#xff0c;count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用&#xff0c;MySQL允许选择没有出现在group by中的字段。换句话说&#xff0c;标准SQ…...

Java——面向对象进阶(二)

前言&#xff1a; 多态&#xff0c;包&#xff0c;final关键字&#xff0c;权限修饰符和代码块 文章目录 一、多态1.1 概念1.2 多态存在条件1.3 多态中调用成员的特点1.4 instanceof关键字 二、包三、权限修饰符四、final 关键字4.1 修饰类4.2 修饰方法4.3 修饰变量 五、代码块…...

49.Python-web框架-Django解决多语言redirect时把post改为get的问题

目录 1.背景 2.思路 3.寻找 Find and Replace 4.再次运行程序&#xff0c;POST来了 5.小结 1.背景 昨天在练习一个Django功能时&#xff0c;把form的method设置为POST&#xff0c;但是实际提交时&#xff0c;一直是GET方法。最后发现这是与多语言相关&#xff0c;django前面…...

【数据结构】【版本1.1】【线性时代】——单链表

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、顺序表的问题二、链表的概念三、单链表的模拟实现3.1 定义3.2 打印3.3 创建新节点3.4 头插3.5 尾插3…...

【计算机毕业设计】258基于微信小程序的课堂点名系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

common.js和es6中模块引入的区别

common.js CommonJS 是一种模块系统&#xff0c;主要用于 Node.js 环境。它使用 require 函数来引入模块&#xff0c;并使用 module.exports 来导出模块。 语法&#xff1a; 导出模块&#xff1a; // moduleA.js const name Jo; module.exports name;// 或者导出一个对象…...

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…...

《思考总结》

思考总结 ==标题==:卷积操作的作用1. **特征提取**2. **参数共享**3. **降维和数据压缩**4. **提升计算效率**5. **平滑和去噪**卷积操作示例输入图像卷积核卷积过程总结==标题==:上卷积什么是上卷积(反卷积/转置卷积)上卷积的作用上卷积的实现1. **最近邻插值(Nearest Ne…...

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…...

别再只用BCE了!用PyTorch实现ASL损失函数,搞定多标签分类中的样本不均衡

多标签分类新范式&#xff1a;PyTorch实战ASL损失函数解决样本不均衡难题 在图像标注、医学诊断或文本情感分析等多标签分类任务中&#xff0c;我们常常遇到一个棘手问题——某些标签的出现频率可能比其他标签高出几个数量级。想象一下&#xff0c;当你构建一个商品标签系统时&…...

全球AI薪资热力图:旧金山VS深圳的残酷对比

一场不平等的技术竞赛当我们谈论人工智能&#xff08;AI&#xff09;的未来时&#xff0c;旧金山湾区与深圳无疑是最为闪耀的两个坐标。前者是硅谷的心脏&#xff0c;全球科技创新的策源地&#xff1b;后者是中国乃至世界硬件制造与新兴科技应用的前沿阵地。然而&#xff0c;对…...

ArcGIS Pro用户必看:解决CAD转SHP后坐标系丢失的完整配置流程(附Python脚本)

ArcGIS Pro用户必看&#xff1a;解决CAD转SHP后坐标系丢失的完整配置流程&#xff08;附Python脚本&#xff09; 当你从CAD图纸转换到SHP格式时&#xff0c;最令人头疼的问题莫过于坐标系信息的丢失。想象一下&#xff0c;你精心准备的规划图纸在GIS软件中变成了一堆无法定位的…...

如何一次删除iPad上的多个应用程序? - 5 种有效方法

随着时间的推移&#xff0c;您的 iPad 可能会积累许多不必要的应用程序&#xff0c;导致存储空间不足并影响设备性能。因此&#xff0c;最好的方法是删除这些应用程序。然而&#xff0c;逐个删除它们可能很耗时&#xff1b;一次性删除多个应用程序可以更有效地释放空间并提高设…...

如何用Dism++打造高效Windows系统维护工作流

如何用Dism打造高效Windows系统维护工作流 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款功能全面的Windows系统优化与维护工具&#xff0c;通过直观…...

OpenClaw技能共享:将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub

OpenClaw技能共享&#xff1a;将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub 1. 为什么需要共享技能 去年我在处理一批市场分析报告时&#xff0c;发现手动从PDF中提取图表数据再制作可视化报表的效率极低。当时用OpenClawPhi-3-vision模型搭建了一个自动化分…...

Steam API集成:构建智能游戏生态的完整PHP解决方案

Steam API集成&#xff1a;构建智能游戏生态的完整PHP解决方案 【免费下载链接】Steam A composer package to make use of the steam web api. 项目地址: https://gitcode.com/gh_mirrors/stea/Steam 在当今游戏开发和社区管理领域&#xff0c;与Steam平台的深度集成已…...

Qt5.15.2在RK3588上的多媒体支持问题:如何正确配置GStreamer插件避免‘no service found‘错误

Qt5.15.2在RK3588上的多媒体支持问题&#xff1a;如何正确配置GStreamer插件避免no service found错误 在嵌入式Linux系统上部署Qt多媒体应用时&#xff0c;开发者经常会遇到各种依赖库和插件配置问题。特别是在RK3588这样的高性能ARM平台上&#xff0c;QtMultimedia模块与GStr…...

替代CM108|替代CM108B|替代HS100|SSS1629代理商|中文说明书|台湾鑫创

SSS1623,SSS1629全面兼容与替代台湾骅讯c-mediaCM108/CM108B/CM108AH/CM118B/CM119/CM119A/HS100/CM6120/CM6317A/CM6400/CM6200等型号, 全面兼容与替代台湾创舰Isoft IS817/IS821/IS828/IS820/IS807等型号,完美替代市面上所有主流USB耳机IC,USB喇叭IC, USB音箱IC, USB游戏耳机…...

OpenClaw网页前端开发与优化全流程指南

OpenClaw网页前端开发与优化全流程指南 &#x1f310; 核心价值&#xff1a;OpenClaw实现"需求→设计→代码→优化→部署"全流程自动化&#xff0c;开发效率提升600%&#xff0c;页面加载速度提升300%&#xff0c;SEO评分提升85%&#xff0c;完全兼容React/Vue/Angul…...