gcc中的内嵌汇编语言

GCC 内嵌汇编语法详解+visual studio code实操 开发Arm程序的时候,大多数时候使用C/C++语言就可以了,但汇编语言在某些情况下能够实现一些C语言无法实现的功能,这时候就要调用一些汇编语言的程序.我们需要大概了解一下在C语言中如何嵌入汇编语言。 《1》内嵌汇编语法如下: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分) 共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开... 阅读详情
 
gcc采用的是AT&T的汇编格式,MS采用Intel的格式.

一 基本语法

语法上主要有以下几个不同.

★ 寄存器命名原则
AT&T: %eax Intel: eax

★源/目的操作数顺序
AT&T: movl %eax,%ebx Intel: mov ebx,eax

★常数/立即数的格式
AT&T: movl $_value,%ebx Intel: mov eax,_value
把_value的地址放入eax寄存器

AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d

★ 操作数长度标识
AT&T: movw %ax,%bx Intel: mov bx,ax

★寻址方式
AT&T: immed32(basepointer,indexpointer,indexscale)
Intel: [basepointer + indexpointer*indexscale + imm32)
Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时
不用考虑segment:offset的问题.上式中的地址应为:
imm32 + basepointer + indexpointer*indexscale

下面是一些例子:
★直接寻址
AT&T: _booga ; _booga是一个全局的C变量
注意加上$是表示地址引用,不加是表示值引用.
注:对于局部变量,可以通过堆栈指针引用.

Intel: [_booga]

★寄存器间接寻址
AT&T: (%eax)
Intel: [eax]

★变址寻址
AT&T: _variable(%eax)
Intel: [eax + _variable]

AT&T: _array(,%eax,4)
Intel: [eax*4 + _array]
AT&T: _array(%ebx,%eax,8)
Intel: [ebx + eax*8 + _array]


二 基本的行内汇编

基本的行内汇编很简单,一般是按照下面的格式
asm("statements");
例如:asm("nop"); asm("cli");
asm 和 __asm__是完全一样的.
如果有多行汇编,则每一行都要加上 "nt"
例如:
asm( "pushl %eaxnt"
"movl $0,%eaxnt"
"popl %eax");
实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编
文件中,所以格式控制字符是必要的.

再例如:
asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);

在上面的例子中,由于我们在行内汇编中改变了edx和ebx的值,但是
由于gcc的特殊的处理方法,即先形成汇编文件,再交给GAS去汇编,
所以GAS并不知道我们已经改变了edx和ebx的值,如果程序的上下文
需要edx或ebx作暂存,这样就会引起严重的后果.对于变量_booga也
存在一样的问题.为了解决这个问题,就要用到扩展的行内汇编语法.
三 扩展的行内汇编

扩展的行内汇编类似于Watcom.

基本的格式是:
asm ( "statements" : output_regs : input_regs : clobbered_regs);

clobbered_regs指的是被改变的寄存器.
下面是一个例子(为方便起见,我使用全局变量):
int count=1;
int value=1;
int buf[10];
void main()
{
asm(
"cld nt"
"rep nt"
"stosl"
:
: "c" (count), "a" (value) , "D" (buf[0])
: "%ecx","%edi" );
}
得到的主要汇编代码为:
movl count,%ecx
movl value,%eax
movl buf,%edi
#APP
cld
rep
stosl
#NO_APP
cld,rep,stos就不用多解释了.
这几条语句的功能是向buf中写上count个value值.
冒号后的语句指明输入,输出和被改变的寄存器.
通过冒号以后的语句,编译器就知道你的指令需要和改变哪些寄存器,
从而可以优化寄存器的分配.

其中符号"c"(count)指示要把count的值放入ecx寄存器
类似的还有:
a eax
b ebx
c ecx
d edx
S esi
D edi
I 常数值,(0 - 31)
q,r 动态分配的寄存器
g eax,ebx,ecx,edx或内存变量
A 把eax和edx合成一个64位的寄存器(use long longs)

我们也可以让gcc自己选择合适的寄存器.
如下面的例子:
asm("leal (%1,%1,4),%0"
: "=r" (x)
: "0" (x) );
这段代码实现5*x的快速乘法.
得到的主要汇编代码为:
movl x,%eax
#APP
leal (%eax,%eax,4),%eax
#NO_APP
movl %eax,x
几点说明:
1.使用q指示编译器从eax,ebx,ecx,edx分配寄存器.
使用r指示编译器从eax,ebx,ecx,edx,esi,edi分配寄存器.
2.我们不必把编译器分配的寄存器放入改变的寄存器列表,因为寄存器
已经记住了它们.
3."="是标示输出寄存器,必须这样用.
4.数字%n的用法:
数字表示的寄存器是按照出现和从左到右的顺序映射到用"r"或"q"请求
的寄存器.如果我们要重用"r"或"q"请求的寄存器的话,就可以使用它们.
5.如果强制使用固定的寄存器的话,如不用%1,而用ebx,则
asm("leal (%%ebx,%%ebx,4),%0"
: "=r" (x)
: "0" (x) );
注意要使用两个%,因为一个%的语法已经被%n用掉了

  原文地址 http://www.cndw.com/tech/server/2006040533263.asp
ACS运动控制器编程 怎么学习 本文介绍了ACS运动控制器编程的完整学习路线,从零基础到实战应用。ACS是以色列高端多轴运动控制平台,适用于自动化设备、精密平台等项目。学习路径包括:1)安装官方软件SPiiPlusControlSuite;2)掌握轴、运动模式和指令三个核心概念;3)学习10个基础指令;4)编写首个运动程序;5)结合C#进行联合编程。进阶内容包括多轴同步、电子凸轮等工业应用,并推荐官方手册作为主要学习资源。通过7天的系统学习,即可掌握单轴运动控制,结合C#实现工业级设备开发。 阅读详情

相关推荐

银河麒麟系统安装redis【亲测可行】

架构:Linux 5.10.0-9-generic x86_64 GNU/Linux。redis版本:redis-6.2.3.tar.gz。然后在执行make install,结束;OS:银河麒麟V10(SP1)未激活。cpu:I5-10代;

lx_nhs的博客 3338

gcc编译实践

各个编译命令的含义 gcc -E test.c -o test.i 编译预处理,生成.i文件 gcc -S test.i -o test.s 汇编生成.s文件,其中可以使用-O -O2 -O3编译优化选项(稍后讨论) gcc -c test.s -o test.o 汇编生成目标文件(.o) gcc test.o -o test.exe 链接生成可执行文件 不同编译选项的作用 编译预处理 在...

Zfming@ustc的博客 306

锐捷交换机堆叠配置举例

一、组网需求: 1)四台S2628G进行堆叠; 2)设备在堆叠前先设置好优先级; 3)使用光口堆叠的设备如RG-S2928G-E相关配置 二、组网拓扑 三、配置要点: 普通堆叠设备不需要配置,只要把堆叠模块和线缆连接好即可 堆叠模块不支持热插拔,即插在模块连上线缆后不能立即生效,需要重启设备才生效。 如果拔掉堆叠插槽后,想再插上模块堆叠,那么必须重启设备才生效 设备堆叠需要协商参数,时间会比较久,请耐心等待 堆叠时设备建议是...

dongsheng_9234的专栏 8288

AT&T(GAS)汇编指令小集

GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4 float s 4 double l 8 long double t 10/12 注意:GAS使用后缀“l”同时表示4字节整数和8字节双精度

ldong2007的专栏 1万+

从分立到集成:深入解析Buck电路的核心模块与设计权衡

本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。

weixin_29306317的博客 225

52页PPT智慧矿山数字化工业大数据平台建设方案

致力于为煤炭企业构建“全”、“统”、“通”、”智”的(大数据平台/数据中台)体系,基于“数字新基建”时代的数据价值思考,构建全域数字化矿区共享能力中心,助力煤炭企业实现数字化转型,打通底层系统之间数据壁垒,加强公司整体管理和安全生产系数,为运营提供数据统筹模型,实现重点数据实时监控和数据共享开放服务。综上所述,智慧矿山数据治理是一个系统性的工程,需要煤炭企业内各部门连同行业和政府监管部门通力协作,制定数据标准和管理规范,重塑煤炭企业数据架构和数据传输链路,打通智慧矿山数据壁垒,保障数据质量和数据安全。

zuoan1993的博客 1055

GNU内联汇编

汇编语言---GCC内联汇编   GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂,格式如下: __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__: 它是GCC定义的关键字asm的宏定义(#define __

fjaygrfjaygr的专栏 1170

MATLAB不能识别已安装的visual studio 2015解决方法

首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到

qq_36320710的博客 4900

gcc中的内嵌汇编语言(Intel i386平台)

gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇 编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc 的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内 嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们 能够更

最后的黑客 3535

带隙基准电路实战:温度补偿与流片调优全解析

带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架

weixin_42628280的博客 254

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

AT&T汇编语言与GCC内嵌汇编简介

http://lcuc.org.cn/node/7 AT&T汇编语言与GCC内嵌汇编简介周二, 2006-09-19 11:23 — lostleaf 版本 0.1时间04/3/30EMAIL: chforest_chang@hotmail.com1 AT&T 与INTEL的汇编语言语法的区别1.1大小写1.2操作数赋值方向1.3前缀1.4间

wallace lee的兴趣空间 766

【Unity Shader】Special Effects(十二)Glow 外发光(UI)

Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。

神码编程 942

GCC中的内嵌汇编语言

GCC中的内嵌汇编语言

1...2...3...4... 810

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

GCC内嵌汇编语言

GCC内嵌汇编语言作者:肖文鹏 临江仙  整理:杨小华绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同。汇编基本语法简介在 AT&T 汇编格式中,寄存器名要加上 % 作为前缀;而在 Intel 汇编格式中,寄存

极光 6702

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

linux smp lock 锁总线 内嵌汇编,gcc中的内嵌汇编语言(Inteli386平台)

gcc中的内嵌汇编语言(Intel i386平台)一.声明虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。写这...

weixin_39620252的博客 433

对 《gcc中的内嵌汇编语言》一文的补充说明

对 《gcc中的内嵌汇编语言》一文的补充说明- -                                        对 《gcc中的内嵌汇编语言》一文的补充说明欧阳光 ouyangguang@263.net 1999.10.13    初次接触到AT&T格式的汇编代码,看着那一堆莫名其妙的怪符号,真是有点痛不欲生的感觉,只好慢慢地去啃gcc文档,在似懂非懂的状态下

zhy05的专栏 1024
上一篇: Linux 中 x86 的内联汇编
下一篇: linux僵尸进程
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值