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

C 表达式中的汇编指令

asm 为 gcc 中的关键字asm 表达式为在 C代码中嵌套汇编指令该表达式只是单纯的替换出汇编代码并不对汇编代码的含义进行解析。asm 表达式有两种形式第二种asm-qualifiers包含了goto语句。第一种形式为常见的用法AssemblerTemplate 和 OutputOperands 必须存在, 其中 Clobbers 存在需要 InputOperands 也出现。12345678910asm asm-qualifiers ( AssemblerTemplate: OutputOperands[ : InputOperands[ : Clobbers ] ])asm asm-qualifiers ( AssemblerTemplate:: InputOperands: Clobbers: GotoLabels)Qualifiers 的类型volatile, 避免编译器的优化inline, 内敛限定符最小的体积goto, 包含跳转指令参数AssemblerTemplate- 汇编指令模板是包含汇编器指令的文字字符串编辑器替换引用输入编译器不会解析该指令的含义。OutputOperands- 由 AssemblerTemplate 中的指令修改的C变量的逗号分隔列表允许使用空列表。InputOperands- 由 AssemblerTemplate 中的指令读取的C变量的逗号分隔列表允许使用空列表。Clobbers- 用逗号分隔的寄存器列表或由 AssemblerTemplate 修改的值不能出现在 OutputOperands 和 InputOperands 中被提及允许使用空列表。GotoLabels- 当使用asm的goto形式时此部分包含 AssemblerTemplate 中的代码可能跳转到的所有C标签的列表。AssemblerTemplate汇编指令由一个字符串给出多条汇编指令结合在一起使用的时候中间以\r\t隔开如12345678asm(inc %0\n\tinc %0 : r(res) : 0(res));/APP# 11 asm.c 1inc %raxinc %rax# 0 2/NO_APPs需要转义的字符%,,{,},|故在ATT汇编中对寄存器进行操作的需要双 %%, 如inc %%rax.OutputOperands操作数之间用逗号分隔。 每个操作数具有以下格式1[ [asmSymbolicName] ] constraint (cvariablename)asmSymbolicName- 为操作数指定名称格式为%[name]c // res num asm(movq %[num], %[res] : [res] r(res) : [num] m(num));- 如果未指定名称使用数字, 从 output 域开始第一个参数为 %0, 一次类推, 这里的 res 为 %0, num 为 %1c // res num asm(movq %1, %0 : r(res) : m(num));constraint- 一个字符串常量用于指定对操作数的存储的 约束, 需要以 或 开头cvariablename- 指定一个C左值表达式来保存输出通常是一个变量名。 括号是语法的必需部分第一个参数为增加可读性使用的现在我们有代码如下12345678910111213141516171819202122232425262728293031int64_t res;int64_t num 1;asm(movq %[num], %[res] : [res] r(res) : [num] m(num));asm(movq %1, %0 : r(res) : m(num));asm(movq %1, %0 : m(res) : m(num));asm(movq %1, %0 : r(res) : r(num));// 对应的汇编代码, 只保留asm表达式中的代码# 13 asm.c 1movq -16(%rbp), %rax // asm-1# 0 2/NO_APP/APP# 15 asm.c 1movq -16(%rbp), %rax // asm-2# 0 2/NO_APP/APP# 17 asm.c 1movq -16(%rbp), -8(%rbp) // asm-3# 0 2/NO_APP/APP# 19 asm.c 1movq %rax, %rax // asm-4# 0 2/NO_APP使用名称替换和数字替换效果一样见 asm-1 和 asm-2约束的用法这里使用比较简单通用的的两种情况r为通过寄存器寻址操作m通过内存寻址操作所以看到当约束了r就对应寄存器的操作。结果保存在 res 也就是 cvariablename 中InputOperands输入操作数使C变量和表达式中的值可用于汇编代码。1[ [asmSymbolicName] ] constraint (cexpression)asmSymbolicName 和输出列表的用法完全一致constraint 约束不能使用和. 可以使用 0, 这表明在输出约束列表中从零开始的条目指定的输入必须与输出约束位于同一位置。12345678910111213int64_t res 3;int64_t num 1;asm(addq %1, %0 : g(res) : 0(num));// 输入输出位置相同movq $3, -8(%rbp)movq $1, -16(%rbp)movq -16(%rbp), %rax/APP# 32 asm.c 1addq %rax, %rax# 0 2/NO_APPcexpression 可以不为左值作为汇编表达式的输入值即可Clobbers破坏列表主要用于指示编译器生成的汇编指令。从asm表达式中看到输出操作数中列出条目的更改编译器是可以确定的但内联汇编代码可能不仅对输出进行了修改。 例如计算可能需要其他寄存器或者处理器可能会由于特定汇编程序指令而破坏寄存器的值。 为了将这些更改通知编译器在Clobber列表中列出这些会产生副作用的条目。 破坏列表条目可以是寄存器名称也可以是特殊的破坏列表项在下面列出。 每个内容列表条目都是一个字符串常量用双引号引起来并用逗号分隔。

相关文章:

C 表达式中的汇编指令

asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析。 asm 表达式有两种形式,第二种 asm-qualifiers 包含了 goto 语句。 第一种形式为常见的用法&#…...

如何永久免费使用IDM:开源激活脚本完整指南

如何永久免费使用IDM:开源激活脚本完整指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager(IDM&#x…...

关于C++11的统一初始化语法示例详解

前言本文主要给大家介绍了C11统一初始化语法的相关内容,关于在当前新标准C11的语法看来,变量合法的初始化器有如下形式:1234X a1 {v};X a2 {v};X a3 v;X a4(v);其实,上面第一种和第二种初始化方式在本质上没有任何差别&#xff…...

Win11Debloat:免费Windows系统优化工具终极指南,轻松提升44%性能

Win11Debloat:免费Windows系统优化工具终极指南,轻松提升44%性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other change…...

云端还是本地?哪种RFID固定资产系统更合适你的企业?

在数字化转型的浪潮中,越来越多的企业认识到RFID固定资产管理系统的重要性。但当真正准备引进系统时,一个关键却绕不开的问题便摆在面前:到底该选云端还是本地部署?这不仅仅是技术路线的选择题,更关乎企业的成本结构、…...

Ostrakon-VL-8B数据预处理详解:餐饮图像清洗与标注规范

Ostrakon-VL-8B数据预处理详解:餐饮图像清洗与标注规范 如果你正在尝试训练或微调像Ostrakon-VL-8B这样的视觉语言模型,来让它更好地理解餐饮场景,那你肯定知道,数据质量是决定成败的关键。模型再强大,如果喂给它的是…...

推荐2款无需安装实用软件,桌面图标整理设置,简真是Windows神器!

聊一聊今天给大家推荐2款桌面美化小工具。为什么觉得要推荐这个小工具呢?因为最近帮一些人远程处理一些问题。感觉那电脑桌面,密密麻麻,全是小图标。我想找个东西都难,是太难了。我真恨不得上手整理。但又怕整理了,人家…...

mini-job极简分布式延迟任务队列 — 基于 Redis,支持 Cron 周期任务、异步协程和多执行器

mini-job 极简分布式延迟任务队列 — 基于 Redis,支持 Cron 周期任务、异步协程和多执行器。 特性特性说明延迟任务设定延迟秒数,到期自动执行Cron 周期调度支持标准 cron 表达式(分 时 日 月 星期)三种执行器async 协程&#xff…...

内网IP如何申请SSL证书?

一、为什么需要内网IP证书? 很多企业有一个误区:认为“只有域名才能做HTTPS”,或者“内网用HTTP没关系”。现实恰恰相反: 合规硬指标:《数据安全法》等法规明确要求数据传输必须加密,内网明文传输在等保测…...

FastAPI + PostgreSL 实战:给应用装上“缓存”和“日志”翅膀

1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...

PMC Organometallix宣布所有产品提价

鉴于市场环境发生重大变化,PMC Organometallix, Inc. 宣布,自2026年5月1日起(或根据合同条款允许的时间),全球所有产品线的价格将上调10%至25%。此次调整源于关键投入成本的持续压力,包括原材料成本上涨以及…...

网络安全渗透测试入门|无线安全渗透与防御完整教程

前言 这是给粉丝盆友们整理的网络安全渗透测试入门阶段无线安全渗透与防御教程 喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。 1.Aircrack-ng简介 Aircrack- NG是一个完整的工具来评估Wi-Fi网络安全套件。 捕获&#x…...

告别Swagger默认丑界面!.NET Core 6项目集成Knife4jUI保姆级教程

.NET Core 6项目集成Knife4jUI:打造专业级API文档体验 在当今快节奏的开发环境中,API文档的质量直接影响着团队协作效率。许多.NET Core开发者虽然已经使用Swagger生成基础文档,却常常面临界面简陋、功能单一的问题。Knife4jUI作为Swagger UI…...

Qt项目拆分之术:如何用SUBDIRS把大工程拆成小模块(从app到lib的实战)

Qt项目模块化实战:用SUBDIRS构建可扩展工程架构 当你的Qt项目从几百行代码膨胀到数万行时,编译时间开始以分钟计算,团队协作频繁出现文件冲突,新成员面对庞杂的目录结构不知所措——这就是我们需要模块化拆分的临界点。上周我接手…...

5分钟搭建家庭电视直播系统:Kodi IPTV Simple完全指南

5分钟搭建家庭电视直播系统:Kodi IPTV Simple完全指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 还在为电视直播体验烦恼吗?想用最简单的方式把网络直播源整…...

Python程序打包为EXE

PowerShell 用anaconda创建虚拟环境 conda -n create XXXconda initconda activate xxx进入要打包的文件夹中安装依赖pip install -r requirements.txt 打包pyinstaller -F -w main.py --clean --noconfirm...

软件产品负责人管理中的需求决策者

在软件开发领域,产品负责人(Product Owner)是决定产品成败的关键角色之一,而需求决策者则是这一角色的核心职能。他们不仅需要理解市场和用户需求,还要在资源有限的情况下,权衡优先级,确保团队交…...

【基于 macOS 虚拟机的 iMessage 批量消息处理技术实践】

一、研究背景与技术意义iMessage 作为苹果生态内置的原生通讯服务,依托系统底层优势,具备端到端加密、无运营商拦截、原生展示等特性,常用于企业内部事务提醒、授权用户服务告知等合规场景。在技术研究过程中,手动单条发送消息效率…...

从ArrayList到VectorSpecies:Java向量化开发全流程拆解,含GraalVM AOT+Linux perf火焰图调优实战

更多请点击: https://intelliparadigm.com 第一章:Java 25 向量 API 硬件加速概览 Java 25 正式将 jdk.incubator.vector 模块升级为标准 API(java.util.vector),标志着 JVM 首次原生支持跨平台向量化计算&#xff0c…...

Live Avatar数字人模型保姆级部署教程:4步搞定AI视频生成

Live Avatar数字人模型保姆级部署教程:4步搞定AI视频生成 1. 准备工作:硬件与软件环境检查 1.1 硬件要求详解 Live Avatar对硬件有明确要求,这是确保模型正常运行的基础: 显卡要求: 最低配置:单卡NVIDIA…...

如何提升域名价值——评估标准

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

深度对比:瑞芯微RK3588边缘盒子 vs 其他方案,在智慧油站车牌识别场景下的真实表现

智慧油站车牌识别实战:RK3588边缘计算盒子的性能突围战 当加油站开始拥抱智能化转型,车牌识别系统便成了连接物理世界与数字服务的"第一道闸机"。在华北某连锁油站的改造案例中,技术团队曾面临这样的困境:传统工控机处理…...

告别zipfile!用PyZipper给你的Python压缩文件加上AES-256密码锁(附中文乱码解决方案)

用PyZipper实现AES-256加密压缩:Python开发者的安全实践指南 在数据交换和备份场景中,ZIP文件是最常见的归档格式之一。但标准库zipfile提供的加密功能实际上非常脆弱——它使用的传统加密算法早在1999年就被证明可以在极短时间内被暴力破解。当我们需要…...

DownKyi:你的B站视频下载管家,从新手到高手的完整指南 [特殊字符]

DownKyi:你的B站视频下载管家,从新手到高手的完整指南 🎬 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音…...

Hypnos-i1-8B开发环境配置:VSCode远程连接与调试教程

Hypnos-i1-8B开发环境配置:VSCode远程连接与调试教程 1. 引言 如果你正在使用Hypnos-i1-8B这样的开源大模型,可能会遇到一个常见问题:本地电脑配置不够,而远程服务器上的开发体验又不够友好。今天我们就来解决这个痛点&#xff…...

DC‑1 靶机完整渗透思路 + 详细步骤(可直接复现)

核心思路:信息收集 → Drupal 远程代码执行 → 拿 Webshell → 数据库信息利用 → SUID 提权 → 拿 Root 与全部 Flag一、环境准备攻击机:Kali Linux(NAT 模式)靶机:DC‑1(VulnHub 下载,NAT 模式…...

从自动驾驶到机器人:双目视差生成点云在实际项目里怎么用?

从自动驾驶到机器人:双目视差生成点云在实际项目中的工程化实践 当机器人需要在未知环境中自主导航,或是自动驾驶汽车试图理解周围的三维空间时,双目视觉系统往往扮演着关键角色。不同于激光雷达的高成本,双目相机以相对经济的硬件…...

告别鬼影!用PyTorch复现动态场景HDR融合论文(附数据集构建与训练代码)

告别鬼影!用PyTorch复现动态场景HDR融合论文(附数据集构建与训练代码) 在计算机视觉领域,高动态范围(HDR)成像技术一直是研究热点。当面对动态场景时,传统HDR融合方法往往会产生令人头疼的"…...

2026年热门会议纪要神器实测对比转写整理全维度比拼,差距竟然这么大

做自媒体这几年,每天要转访谈录音、剪视频做字幕、整理线上分享内容,踩过不下10款转写工具的坑。这次特意把市面上主流的工具全部实测了一遍,负责任说:对比了多款工具,听脑AI是综合体验最好的,没有之一。 直…...

AWPortrait-Z问题解决:常见生成问题排查与优化技巧

AWPortrait-Z问题解决:常见生成问题排查与优化技巧 1. 常见生成问题诊断与修复 1.1 图像质量不理想的五大原因 当生成的人像效果不符合预期时,通常由以下原因导致: 提示词过于简单:仅使用"a beautiful woman"这类泛…...