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

编程参考 - GCC中的Basic ASM

asm关键字允许你在C代码中嵌入汇编程序指令。GCC提供两种形式的内联asm语句。一种是基本asm语句,是没有操作数的语句(见基本asm),而另一种扩展asm语句(见扩展asm)包括一个或多个操作数。在函数内部混合使用C语言和汇编语言时,扩展形式是首选,但要在顶层(函数外)使用或包含汇编语言,你必须使用基本asm。

你也可以使用asm关键字来覆盖C语言中某个符号的汇编语言名称,或者将C语言变量放在一个特定的寄存器中。

基本asm / Basic Asm

一个基本的asm语句的语法如下:

asm asm-qualifiers ( AssemblerInstructions )

对于C语言来说,asm关键字是一个GNU扩展。编写的代码要能够用-ansi或-std选项来编译的话,即选择不使用GNU扩展的C语言,要使用__asm__而不是asm 关键字。对于C++语言,asm是一个标准的关键字,但__asm__可以用于选项-fno-asm下编译的代码。

修饰符 / Qualifiers

volatile

这个可选的volatile修饰符没有作用。所有基本的asm块都是隐含的volatile。

inline

使用inline修饰符,是为了将这些语句内联,asm语句的占用空间会尽可能最小。

参数 / Parameters

Assembler Instructions / 汇编指令

在修饰符后面,括号内包含的是汇编指令或汇编代码,是以字面字符串的形式出现。字符串内容可以包含任何能被汇编器识别的指令以及伪指令。GCC并不解析字符串中的汇编器指令,也不知道其含义,也不知道它们是否是有效的汇编代码。

指令 / Instructions:机器码的助记符,有对应的机器码。

伪指令 / Directives:没有对应的机器码,由编译器执行,计算机并不执行。

在一个asm基本语句中的汇编指令部分,可以包含多条汇编指令,分隔方法使用当前系统的汇编代码的分隔符即可。还有经常使用的换行显示,一般使用换行符加制表符,写作‘\n\t’。

注意,一些类型的汇编语言允许用分号作为行的分隔符。但是,还有些汇编语言使用分号作为注释起始符。

备注 / Remarks

使用扩展汇编形式,一般会产生更小、更安全和更有效的代码,在大多数情况下比基础汇编形式是更好的选择。

但是有两种情况,是只能使用基础汇编的:

1,扩展汇编代码只能放在C函数内部,如果是函数外的话,就只能使用基础汇编。或者说是file scope, top-level下,要写inline的汇编代码,只能用基础汇编。

可以写的内容,包括汇编指令、汇编宏,汇编函数等。在函数外的基本汇编形式的语句,不能加修饰符。

2,声明了naked属性的函数,里面只能使用基本汇编。

在基本asm里,要想安全的访问C数据和调用C函数比想象中复杂。要访问C语言的数据,最好使用扩展的asm。

不要期望一系列asm语句在编译后保持完全连续。如果某些指令需要在输出中保持连续,请将它们放在一个多指令asm语句中。注意,GCC的优化器可以改变asm语句相对于其他代码的位置,包括一些跳转语句(across jumps)。

asm语句不能跳转到其他asm语句。GCC无法识别这些跳转,在优化编译时就无法处理它们。仅在扩展asm中支持从asm跳转到C标签。

在某些情况下,GCC在优化时可能会复制(或删除重复的)汇编代码。如果汇编代码定义了符号或标签,这可能会导致编译期间出现意外的重定义符号错误。

警告:

C标准没有指定asm的语法,所以在不同编译器中,会出现不兼容的情况。而这些不兼容性可能不会产生编译器警告或错误。

GCC不解析基本asm的AssemblerInstructions,这意味着里面的代码无法向编译器传达信息。GCC也看不到asm中的符号,可能会将其作为未引用的符号丢弃。它也不知道汇编程序代码的副作用,例如对内存或寄存器的修改。与某些编译器不同,GCC假设汇编代码不会对通用寄存器进行任何更改。这一假设可能会在未来的版本中发生变化。

为了避免将来编译出现问题,比如语法的更改和编译器的兼容性问题,请考虑用扩展asm替换基本asm。

编译器将基本asm中的汇编程序指令逐字复制到汇编语言输出文件中,而不处理汇编代码,也包括可以在扩展asm中使用的“%”运算符。这导致了基本asm字符串和扩展asm模板之间的细微差异。例如,要引用寄存器,可以在基本asm中使用“%eax”,在扩展asm中可以使用“%%eax”。

在支持多种汇编语言的目标机器平台上(如x86),所有基本asm都使用-masm命令行选项来指定汇编语言(请参见x86选项)。基本asm不能为不同汇编语言提供不同汇编代码。

在包含非空的汇编语句的基本asm中,GCC假设这些其构成的汇编语句块,不会更改通用寄存器,但可以读写全局变量。

下面代码是在i386平台上的一个基本asm语句例子:

/* Note that this code will not compile with -masm=intel */

#define DebugBreak() asm("int $3")

简单的函数中使用例子:

int main()

{

asm("nop");   // 执行一条空语句

asm("movl $1, %eax"); // 将整数1赋值给eax寄存器

return 0;

}

参考:

Using Assembly Language with C (Using the GNU Compiler Collection (GCC))

GCC-Inline-Assembly-HOWTO

相关文章:

编程参考 - GCC中的Basic ASM

asm关键字允许你在C代码中嵌入汇编程序指令。GCC提供两种形式的内联asm语句。一种是基本asm语句,是没有操作数的语句(见基本asm),而另一种扩展asm语句(见扩展asm)包括一个或多个操作数。在函数内部混合使用…...

软考中级-操作系统

1 操作系统地位计算机系统由硬件和软件组成,未配置软件的称为裸机,但这会导致效率低下。操作系统是为弥补用户与硬件之间的鸿沟的一种系统软件,汇编、编译、解释、数据库管理系统等系统软件和其他应用软件都在此基础。2 进程管理又称处理机管…...

MYD-Y6ULL开发笔记

MYD-Y6ULL开发 文章目录MYD-Y6ULL开发一、系统移植1. 核板说明2. 文件系统操作二、应用开发1. 应用自启动2. 应用编译3.系统应用4.网络5.系统参数一、系统移植 1. 核板说明 型号 MYIR-Y6UL Y2 V2-256N 256D-50I烧了固件命令 uuu.exe myd-y6ulx-y2-256n256d-core-base.auto2. 文…...

三天吃透Java虚拟机面试八股文

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...

Spring Cloud Alibaba全家桶(二)——微服务组件Nacos注册中心

前言 本文为微服务组件Nacos注册中心相关知识,下边将对什么是 Nacos,Nacos注册中心(包括:注册中心演变及其设计思想、核心功能),Nacos Server部署(包括:单机模式、集群模式&#xff…...

命令执行漏洞 | iwebsec

文章目录1 靶场环境2 命令执行漏洞介绍3 靶场练习01-命令执行漏洞02-命令执行漏洞空格绕过03-命令执行漏洞关键命令绕过04-命令执行漏洞通配符绕过05-命令执行漏洞base64编码绕过4 命令执行漏洞危害01-读写系统文件02-执行系统命令03-种植恶意木马04-反弹shellpython反弹shellp…...

2023.02.26 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.模型4.1 SESSION-PARALLEL MINI-BATCHES4.2 SAMPLING ON THE OUTPUT4.3 RANKING LOSS5.实验5.1 数据集5.2 验证方式5.3 baselines5.4 实验结果6.结论深度学习元胞自动机1.定义2.构成3.特性4.思想5.统计特征流形学习1.降维2.空间3.距离…...

局域网实现PC、Pad、Android互联

文章目录局域网实现PC、Pad、Android互联一、网络邻居1、 Windows 配置1.1 开启共享功能1.2 设置用户1.3 共享文件夹2、 Pad 连接二、 FTP & HTTP1、 电脑配置1.1 HTTP 服务1.2 FTP 服务2、 连接3、 电脑连接 FTP三、 其他方式局域网实现PC、Pad、Android互联 在我们使用多…...

AC自动机

AC自动机 该模型应用场景是什么样的?假如有一篇很长的文章,然后有一个敏感词表单,请从这篇文章里找出包含了哪些敏感词。即便是用KMP进行快速匹配,那也只能每次遍历整篇文章才能找到一种敏感词,KMP只适用于单一子串匹配…...

git入门

目录 1. git简介 1.1 git是什么 1.2 git与svn的区别 2. github 2.1 创建仓库 2.2 删除仓库 2.3 新建文件及文件夹 3. git的基本操作 3.1 配置账户及邮箱 3.2 git文件状态与工作区域 3.3 常用命令 3.4 克隆(clone) 3.5 查看git仓库的状态 3.…...

RK3568编译Android11和目录讲解

文章目录 前言一、下载android11源码二、环境搭建1.增加交换内存三、编译瑞芯微原厂源码四、目录讲解总结前言 本文记录在Ubuntu18.04中编译Android11,只有编译了源码,后面才能进行驱动的开发,有兴趣的小伙伴可以和我一起学习吧! 提示:以下是本篇文章正文内容,下面案例可…...

java泛型学习篇(二)

java泛型学习篇(二) 1 自定义泛型类 1.1 基本语法 Class 类型 <T,R,M...>{ //成员,其中...代表<>括号里面的参数可以有多个ja }1.2 注意点 1.2.1 属性和方法都是可以使用泛型的 T t;//属性使用泛型,合法public T getT() {return t;} //方法使用泛型,合法 publi…...

Java基础

Java基础Java基础一、课前问答二、概述三、Java的历史四、Java的特点五、计算机执行机制以及Java执行机制5.1 计算机的执行机制5.2 Java的执行机制六、常用DOS命令七、第一个Java程序八、包的使用九、编码规范十、注释Java基础 一、课前问答 1、什么是程序 2、什么是语言 3、什…...

骨骼控制(一)——动画动态节点(AnimDynamics)

文章目录一、引言二、骨骼控制三、UE蓝图中提供的骨骼控制节点——AnimDynamics动画蓝图节点1、什么是AnimDynamics动画蓝图节点①使用盒体计算惯性②使用约束来限制移动2、AnimDynamics节点的几种常用例子①单骨骼模拟②骨骼链模拟 <h2 id1>③群魔乱舞&#xff08;这是错…...

Linux系统下搭建maven环境

文章目录前述从官网下载安装包安装 maven修改maven配置修改环境变量测试前述 安装 maven 环境前&#xff0c;需要先安装 java 环境&#xff0c;如果没有安装 java 环境&#xff0c;可以参考&#xff1a;https://blog.csdn.net/weixin_45583303/article/details/118631855 从官…...

English Learning - L2 语音作业打卡 Day3 2023.2.23 周四

English Learning - L2 语音作业打卡 Day3 2023.2.23 周四&#x1f48c; 发音小贴士&#xff1a;&#x1f48c; 当日目标音发音规则/技巧&#xff1a;&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x1f36d;【练习感受】&#x1f353;元音[ ɔ: ]&…...

RK3568平台开发系列讲解(驱动基础篇)GIC v3中断控制器

🚀返回专栏总目录 文章目录 一、什么是GIC二、GIC v3中断类型三、GIC v3基本结构3.1、Distributor3.2、CPU interface简介3.3、Redistributor简介3.4、ITS(Interrupt translation service)4、中断状态和处理流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ARM多核…...

决策树、随机森林、极端随机树(ERT)

声明&#xff1a;本文仅为个人学习记录所用&#xff0c;参考较多&#xff0c;如有侵权&#xff0c;联系删除 决策树 通俗来说&#xff0c;决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友&#xff0c;于是有了下面的对话&#xff1a; 女儿&#x…...

软件测试之因果图法

因果图法 1. 概述 因果图法是一种**利用图解法分析输入条件、输出结果的各种组合情况,**从而设计测试用例的方法. 因果图法适用于有多个输入和多个输出&#xff0c;而且输入和输入之间有相互的组合关系&#xff0c;输入和输出之间有相互的制约和依赖关系. 使用场景和判定表…...

vue中子组件间接修改父组件传递过来的值

一、前言 Vue官方文档Props单向数据流讲解 Vue中遵循单向数据流&#xff0c;所有的 props 都遵循着单向绑定原则&#xff0c;props 因父组件的更新而变化&#xff0c;自然地将新的状态向下流往子组件&#xff0c;而不会逆向传递。这避免了子组件意外修改父组件的状态的情况&a…...

Java I/O

前言 关于IO, 想必你听过很多中I/O方式, 有的是OS视角的, 有的是JDK本身支持的, 有的是纯实现视角。但是作为一个developer, 我希望你能先搞清楚上下文之后, 再去理解内容, 否则容易抬杠。这个上下文有横向和纵向两个维度。纵向维度包括JDK底层, JDK上层包装库, 开发框架(如Ne…...

pytorch学习日记之图片的简单卷积、池化

导入图片并转化为张量 import torch import torch.nn as nn import matplotlib.pyplot as plt import numpy as np from PIL import Image mymi Image.open("pic/123.png") # 读取图像转化为灰度图片转化为numpy数组 myimgray np.array(mymi.convert("L"…...

【java基础】抽象类和抽象方法

文章目录基本介绍抽象类抽象方法使用总结基本介绍 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就…...

RDD的内核调度【博学谷学习记录】

RDD的依赖关系RDD的依赖: 指的一个RDD的形成可能是有一个或者多个RDD得出, 此时这个RDD和之前的RDD之间产生依赖关系在Spark中, RDD之间的依赖关系,主要有二种依赖关系:1- 窄依赖:目的: 为了实现并行计算操作, 并且提高容错的能力指的: 一个RDD上的一个分区的数据, 只能完整的交…...

二叉树——二叉搜索树的最小绝对差

二叉搜索树的最小绝对差 链接 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1 示例 2&…...

git的使用(终端输入指令)下

文章目录前言1、git 分支创建分支查看分支切换分支合并分支删除分支2.提交到远程仓库远程提交链接一下自己仓库总结前言 上章链接 &#xff1a;git的使用&#xff08;终端输入指令&#xff09;上 我们接着上着来说 上章把 git 的 功能实现了一部分&#xff0c;本章我们接着上文…...

python使用influxdb-client管理InfluxDB的bucket

bucket的概念类似数据库的“库”&#xff0c;同时每个库中的数据都因为存在“时间戳”&#xff0c;每个数据都会有一个对应的时间点 influxdb-client-python官方github页面&#xff1a;https://github.com/influxdata/influxdb-client-python 管理bucket的官方示例&#xff1…...

【c++】模板2—类模板

文章目录类模板语法类模板与函数模板区别类模板中成员函数常见时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件编写类模板与友元类模板语法 类模板作用&#xff1a; 建立一个通用类&#xff0c;类中的成员数据类型可以不具体制定&#xff0c;用一个虚…...

基于SpringCloud的可靠消息最终一致性03:项目骨架代码(下)

上一节把整个项目的演示内容、项目结构、POM文件和配置文件都讲完了,接下来继续。 先安装并启动Nacos,然后在其中建立一个名为xiangwang-payment-dev.yaml的配置文件,内容为: # 指定运行环境 spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.D…...

linux如何彻底的删除文件

一、使用rm命令删除 直接用rm 先用ls -alt看下文件信息及拥有者等 可以看到拥有者是eve用户&#xff0c;所以在eve用户的终端中rm命令即可&#xff0c; 如果是root或者其他&#xff0c;则优先用root或其他账号进行删除 (base) eveEve:~$ ls -alt a.txt -rw-rw-r-- 1 eve eve …...

网站建设运行问题及建议/苹果看国外新闻的app

AutoResetEvent 类 AutoResetEvent类的工作方式与ManualResetEvent类似。它会等超时事件发生或者信号事件发生然后通知正在等待的线程。ManualResetEvent和AutoResetEvent之间最重要差别之一是AutoResetEvent在WaitOne()方法执行完会改变自身状态。下面列表显示了如何使用AutoR…...

做啥英文网站赚钱/阿里云域名注册万网

你好&#xff01;有什么我可以帮助你的&#xff1f;...

网站关键字太多/线上销售如何找到精准客户

大家应该都有这样经历&#xff0c;我们的手机在充电的同时也能边使用&#xff0c;有的同学就会说了&#xff0c;这是因为手机电池在充电的同时也在放电。如果这样想我们可能就把锂电池类比了一个蓄水池&#xff0c;以为它在进水的同时也能出水&#xff0c;其实这个比喻是错误的…...

网络营销工作/sem优化软件选哪家

条款7 预先准备好内存不够的情况 operator new在无法完成内存分配请求时会抛出异常(老的编译器返回0); C常用的做法, 定义一个类型无关的宏来分配内存并检查是否成功; 123#define NEW(PTR, TYPE) \try { (PTR) new TYPE; } \catch (std::bad_alloc&) { assert(0); }>…...

成都网站app开发/网络广告投放渠道有哪些

1、父组件传值给子组件------->子组件使用 props 属性接收 2、子组件传值给父组件-------->子组件通过$emit 传递&#xff08;自定义事件传递&#xff09;&#xff0c;父组件通过属性名称接收 3、父组件&#xff0c;子组件&#xff0c;兄弟组件相互传值------>需要 …...

购物网站首页分成几个模块/关键词制作软件

实现需求&#xff1a;每天凌晨2点对Linux服务器上的mysql数据库进行自动备份。 实现步骤&#xff1a;1&#xff0c;编写数据库备份脚本 2&#xff0c;编写crontab定时任务 1&#xff0c;编写数据库备份脚本 mysql数据库导出脚本&#xff0c;脚本名称可以定义为 “db-bac…...