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

C语言ASM汇编内嵌语法详解

GCC 支持在C/C代码中嵌入汇编代码这些汇编代码被称作GCC Inline ASM——GCC内联汇编。这是一个非常有用的功能有利于我们将一些C/C语法无法表达的指令直接潜入C/C代码中另外也允许我们直接写 C/C代码中使用汇编编写简洁高效的代码。1.基本内联汇编GCC中基本的内联汇编非常易懂我们先来看两个简单的例子__asm__(movl %esp,%eax); // 看起来很熟悉吧或者是12345__asm__(movl $1,%eax // SYS_exitxor %ebx,%ebxint $0x80);或12345__asm__(movl $1,%eax\r\t \xor %ebx,%ebx\r\t \int $0x80 \);基本内联汇编的格式是__asm__ __volatile__(Instruction List);1、__asm____asm__是GCC关键字asm的宏定义#define __asm__ asm__asm__或asm用来声明一个内联汇编表达式所以任何一个内联汇编表达式都是以它开头的是必不可少的。2、Instruction ListInstruction List是汇编指令序列。它可以是空的比如__asm__ __volatile__(); 或__asm__ ();都是完全合法的内联汇编表达式只不过这两条语句没有什么意义。但并非所有Instruction List为空的内联汇编表达式都是没有意义的比如__asm__ (:::memory); 就非常有意义它向GCC声明“我对内存作了改动”GCC在编译的时候会将此因素考虑进去。我们看一看下面这个例子123456789101112131415$ cat example1.cint main(int __argc, char* __argv[]){int* __p (int*)__argc;(*__p) 9999;//__asm__(:::memory);if((*__p) 9999)return 5;return (*__p);}在 这段代码中那条内联汇编是被注释掉的。在这条内联汇编之前内存指针__p所指向的内存被赋值为9999随即在内联汇编之后一条if语句判断__p 所指向的内存与9999是否相等。很明显它们是相等的。GCC在优化编译的时候能够很聪明的发现这一点。我们使用下面的命令行对其进行编译$ gcc -O -S example1.c选项-O表示优化编译我们还可以指定优化等级比如-O2表示优化等级为2选项-S表示将C/C源文件编译为汇编文件文件名和C/C文件一样只不过扩展名由.c变为.s。我们来查看一下被放在example1.s中的编译结果我们这里仅仅列出了使用gcc 2.96在redhat 7.3上编译后的相关函数部分汇编代码。为了保持清晰性无关的其它代码未被列出。12345678910$cat example1.smain:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %eax # int* __p (int*)__argcmovl $9999, (%eax) # (*__p) 9999movl $5, %eax # return 5popl %ebpret参 照一下C源码和编译出的汇编代码我们会发现汇编代码中没有if语句相关的代码而是在赋值语句(*__p)9999后直接return 5这是因为GCC认为在(*__p)被赋值之后在if语句之前没有任何改变(*__p)内容的操作所以那条if语句的判断条件(*__p) 9999肯定是为true的所以GCC就不再生成相关代码而是直接根据为true的条件生成return 5的汇编代码GCC使用eax作为保存返回值的寄存器。我们现在将example1.c中内联汇编的注释去掉重新编译然后看一下相关的编译结果。1234567891011121314151617181920212223$ gcc -O -S example1.c$ cat example1.smain:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %eax # int* __p (int*)__argcmovl $9999, (%eax) # (*__p) 9999#APP# __asm__(:::memory)#NO_APPcmpl $9999, (%eax) # (*__p) 9999 ?jne .L3 # falsemovl $5, %eax # true, return 5jmp .L2.p2align 2.L3:movl (%eax), %eax.L2:popl %ebpret由于内联汇编语句__asm__(:::memory)向GCC声明在此内联汇编语句出现的位置内存内容可能了改变所以GCC在编译时就不能像刚才那样处理。这次GCC老老实实的将if语句生成了汇编代码。可能有人会质疑为什么要使用__asm__(:::memory)向GCC声明内存发生了变化明明“Instruction List”是空的没有任何对内存的操作这样做只会增加GCC生成汇编代码的数量。确 实那条内联汇编语句没有对内存作任何操作事实上它确实什么都没有做。但影响内存内容的不仅仅是你当前正在运行的程序。比如如果你现在正在操作的内存 是一块内存映射映射的内容是外围I/O设备寄存器。那么操作这块内存的就不仅仅是当前的程序I/O设备也会去操作这块内存。既然两者都会去操作同一块 内存那么任何一方在任何时候都不能对这块内存的内容想当然。所以当你使用高级语言C/C写这类程序的时候你必须让编译器也能够明白这一点毕竟高 级语言最终要被编译为汇编代码。你可能已经注意到了这次输出的汇编结果中有两个符号#APP和#NO_APPGCC将内联汇编语 句中Instruction List所列出的指令放在#APP和#NO_APP之间由于__asm__(:::memory)中“Instruction List”为空所以#APP和#NO_APP中间也没有任何内容。但我们以后的例子会更加清楚的表现这一点。关于为什么内联汇编__asm__(:::memory)是一条声明内存改变的语句我们后面会详细讨论。刚才我们花了大量的内容来讨论Instruction List为空是的情况但在实际的编程中Instruction List绝大多数情况下都不是空的。它可以有1条或任意多条汇编指令。

相关文章:

C语言ASM汇编内嵌语法详解

GCC 支持在C/C代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC内联汇编。这是一个非常有用的功能,有利于我们将一些C/C语法无法表达的指令直接潜入C/C代码中,另外也允许我们直接写 C/C代码中使用汇编编写简洁高效的代码。1.基本…...

CircuitJS1 Desktop Mod:零基础入门电路仿真的终极免费指南

CircuitJS1 Desktop Mod:零基础入门电路仿真的终极免费指南 【免费下载链接】circuitjs1 Standalone (offline) version of the Circuit Simulator with small modifications based on modified NW.js. 项目地址: https://gitcode.com/gh_mirrors/circ/circuitjs1…...

告别手动重启!用NSSM把任意EXE程序变成Windows服务(附蚂蚁笔记实战)

Windows服务化神器NSSM:让普通程序享受系统级守护 每次服务器断电重启后,那些需要手动启动的后台程序是否让你头疼?当关键业务进程意外崩溃时,你是否不得不半夜爬起来手动恢复?在Windows服务器环境下,许多开…...

R3nzSkin国服换肤实战指南:安全自定义英雄联盟视觉体验完整方案

R3nzSkin国服换肤实战指南:安全自定义英雄联盟视觉体验完整方案 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 英雄联盟国服皮肤自定义一直…...

避开这三个坑!企业无线网络规划中VLAN与DHCP的实战配置心得(以华为AC+AP为例)

企业无线网络规划中的三大隐形陷阱:VLAN与DHCP实战避坑指南 去年负责某跨国制造企业的无线网络升级项目时,凌晨三点被紧急电话叫醒——新部署的华为ACAP系统突然大面积断网。会议室里高管们正等着视频会议,而我们的无线网络却像被施了魔法般集…...

Flowchart-Vue:将可视化复杂性转化为开发者的技术杠杆

Flowchart-Vue:将可视化复杂性转化为开发者的技术杠杆 【免费下载链接】flowchart-vue Vue.js Flowchart Component with Drag-and-Drop Designer 项目地址: https://gitcode.com/gh_mirrors/fl/flowchart-vue 在当今的前端开发领域,业务流程可视…...

一站式游戏模组管理:XXMI启动器终极指南,轻松管理你的二次元游戏体验

一站式游戏模组管理:XXMI启动器终极指南,轻松管理你的二次元游戏体验 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否厌倦了为不同的二次元游戏反复…...

告别‘频率越高,波束越窄’:聊聊麦克风阵列在智能音箱里如何保持‘听力稳定’

智能音箱的听觉革命:如何让高频唤醒不再"耳背" 清晨的阳光透过窗帘洒进卧室,你对着床头的智能音箱喊了三声"播放晨间新闻",它却毫无反应——直到你压低嗓音用低沉的语调重复指令,那个圆滚滚的小家伙才突然&qu…...

三步解锁百度文库:127行代码让你免费保存任何文档的终极指南

三步解锁百度文库:127行代码让你免费保存任何文档的终极指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的付费文档而烦恼吗?每次找到心仪的资料&#x…...

如何快速优化FlexSlider轮播组件的可访问性:让残障用户也能轻松使用

如何快速优化FlexSlider轮播组件的可访问性:让残障用户也能轻松使用 【免费下载链接】FlexSlider An awesome, fully responsive jQuery slider plugin 项目地址: https://gitcode.com/gh_mirrors/fl/FlexSlider FlexSlider作为一款优秀的响应式jQuery轮播插…...

3步掌握OpenPLC Editor:工业自动化编程的免费开源完整解决方案

3步掌握OpenPLC Editor:工业自动化编程的免费开源完整解决方案 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 你是否曾为高昂的PLC编程软件费用而烦恼?或者面对复杂的工业控制系统感到无从下手…...

3天打造专属桌面宠物:DyberPet框架让数字伙伴触手可及

3天打造专属桌面宠物:DyberPet框架让数字伙伴触手可及 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否曾幻想过拥有一个会陪你工作、提醒你休息、甚至能跟你聊天…...

10个rom-rb最佳实践技巧:从入门到专家级

10个rom-rb最佳实践技巧:从入门到专家级 【免费下载链接】rom Data mapping and persistence toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/ro/rom rom-rb是Ruby的强大数据映射和持久化工具包,它提供了灵活的方式来处理数据访问层…...

终极指南:深度解密Kotlin编译器后端IR从指令选择到平台优化的全流程

终极指南:深度解密Kotlin编译器后端IR从指令选择到平台优化的全流程 【免费下载链接】kotlin The Kotlin Programming Language. 项目地址: https://gitcode.com/GitHub_Trending/ko/kotlin Kotlin作为一门现代跨平台编程语言,其编译器后端的中间…...

手把手教你:用Wireshark抓包搞定‘哑巴’设备的IP地址(附三种情况实战)

工业设备IP定位实战:Wireshark抓包全流程解析 车间里那台新到的PLC控制器静静躺在工作台上,除了一个闪烁的绿色网口指示灯,没有任何显示界面。老张盯着它叹了口气——这已经是本周第三次遇到"哑巴"设备了。在工业物联网和智能硬件普…...

FontCenter:彻底解决AutoCAD字体缺失的终极方案,效率提升300%[特殊字符]

FontCenter:彻底解决AutoCAD字体缺失的终极方案,效率提升300%🚀 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 你是否曾在打开AutoCAD图纸时遭遇字体缺失的困扰&…...

Phi-3-mini-4k-instruct-gguf实战:基于C++的高性能推理服务开发

Phi-3-mini-4k-instruct-gguf实战:基于C的高性能推理服务开发 1. 为什么选择C开发推理服务 在实时对话和智能客服这类对延迟敏感的在线服务场景中,C凭借其接近硬件的性能优势成为首选。与Python等解释型语言相比,C能直接管理内存、避免垃圾…...

别再只盯着激光了!聊聊生活中那些意想不到的偏振光应用(从手机屏幕到太阳镜)

别再只盯着激光了!聊聊生活中那些意想不到的偏振光应用(从手机屏幕到太阳镜) 清晨的阳光透过窗帘缝隙洒进房间,你拿起床头的手机查看消息——这个再普通不过的动作,其实已经和偏振光打了三次照面:液晶屏幕的…...

PCB布局翻车实录:一个开尔文连接没做好,我的电流检测误差直接飙升2.5%

PCB布局中的开尔文连接陷阱:如何避免电流检测误差飙升2.5% 在硬件电路设计中,电流检测是一个看似简单却暗藏玄机的环节。许多工程师在调试电路时都曾遇到过这样的困惑:明明选用了高精度的电流感应放大器和低阻值分流电阻,实测数据…...

告别重复操作:用Raspberry Pi Pico和CircuitPython搭建你的第一个游戏自动化项目

用Raspberry Pi Pico和CircuitPython打造智能自动化工具:从游戏辅助到生产力提升 1. 硬件自动化:一个全新的创客世界 当你第一次把Raspberry Pi Pico握在手中时,可能很难想象这个比U盘大不了多少的开发板能做什么。实际上,这款售价…...

终极量化交易学习指南:从零掌握Python金融编程的完整路径

终极量化交易学习指南:从零掌握Python金融编程的完整路径 【免费下载链接】Tutorials Jupyter notebook tutorials from QuantConnect website for Python, Finance and LEAN. 项目地址: https://gitcode.com/gh_mirrors/tutorials2/Tutorials QuantConnect量…...

Pixel Aurora Engine 赋能低代码平台:在Dify中集成AI图像生成能力

Pixel Aurora Engine 赋能低代码平台:在Dify中集成AI图像生成能力 1. 低代码平台与AI图像生成的完美结合 想象一下,你正在开发一个电商网站,需要为成千上万的商品自动生成展示图片。传统方式需要雇佣设计师团队,成本高昂且效率低…...

Catala快速入门教程:如何在5分钟内将法律条文转化为算法

Catala快速入门教程:如何在5分钟内将法律条文转化为算法 【免费下载链接】catala Programming language for literate programming law specification 项目地址: https://gitcode.com/gh_mirrors/ca/catala Catala是一种专为法律条文编程设计的语言&#xff…...

Codeforces评级预测工具Carrot架构重构:从API依赖危机到弹性系统设计深度解析

Codeforces评级预测工具Carrot架构重构:从API依赖危机到弹性系统设计深度解析 【免费下载链接】carrot A browser extension for Codeforces rating prediction 项目地址: https://gitcode.com/gh_mirrors/carrot1/carrot Codeforces评级预测工具Carrot作为算…...

7步打造智能农田监测系统:用ntfy实现灾害实时预警(零代码方案)

7步打造智能农田监测系统:用ntfy实现灾害实时预警(零代码方案) 【免费下载链接】ntfy Send push notifications to your phone or desktop using PUT/POST 项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy ntfy是一款轻量级的…...

第四章:TTM分析: 4.5.1 ttm_device对三大设计目标的实现

2. 统一管理异构内存域 这是 ttm_device 最基础的职责:将 VRAM、GTT、SYSTEM 等物理上完全不同的内存,纳入统一的管理框架。 2.1 资源管理器数组 man_drv[] struct ttm_resource_manager *man_drv[TTM_NUM_MEM_TYPES];这是一个按内存域类型索引的指针…...

Intv_ai_mk11 数据处理实战:模拟VLOOKUP功能实现智能表格匹配与问答

Intv_ai_mk11 数据处理实战:模拟VLOOKUP功能实现智能表格匹配与问答 1. 办公数据处理的痛点与机遇 在日常办公场景中,数据匹配是最常见也最令人头疼的任务之一。想象这样一个场景:你手上有两个表格,一个包含员工基本信息&#x…...

终极指南:如何用NX代码所有权彻底解决团队协作中的责任难题

终极指南:如何用NX代码所有权彻底解决团队协作中的责任难题 【免费下载链接】nx The Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time. …...

内存计算与XBTorch框架:深度学习硬件加速新范式

1. 内存计算与深度学习加速器:突破冯诺依曼瓶颈的新范式在深度学习模型规模呈指数级增长的今天,传统计算架构的局限性日益凸显。作为一名长期关注AI硬件加速的研究者,我深刻体会到内存计算技术带来的变革潜力。这种技术最吸引我的地方在于它从…...

Zotero PDF Translate:打破语言壁垒的智能文献翻译革命

Zotero PDF Translate:打破语言壁垒的智能文献翻译革命 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mirrors…...