您现在的位置:新闻首页>快讯
GCC中的内嵌汇编语言
虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。写这篇文章的主要信息来源是GNU的两个info文件:o,如果你觉得这篇文章中的介绍还不够详细的话,你可以查阅这两个文件。当然,直接查阅这两个文件可以获得更加权威的信息。如果你不想被这两篇文档中的一大堆信息搞迷糊的话,我建议你先阅读一下这篇文章,然后在必要时再去查阅更权威的信息。
在Linux的核心代码中,还是存在相当一部分的汇编语言代码。如果你想顺利阅读Linux代码的话,你不可能绕过这一部分代码。在Linux使用的汇编语言代码中,主要有两种格式:一种是直接写成汇编语言源程序的形式,这一部分主要是一些Linux的启动代码;另一部分则是利用gcc的内嵌式汇编语言语句asm嵌在Linux的C语言代码中的。这篇文章主要是介绍第二种形式的汇编语言代码。首先,我介绍一下as支持的汇编语言的语法格式。大家知道,我们现在学习的汇编语言的格式主要是Intel风格的,而在Linux的核心代码中使用的则是AT&T格式的汇编语言代码,应该说大部分人对这种格式的汇编语言还不是很了解,所以我觉得有必要介绍一下。接着,我主要介绍一下gcc的内嵌式汇编语言的格式。gcc的内嵌式汇编语言提供了一种在C语言源程序中直接嵌入汇编指令的很好的办法,既能够直接控制所形成的指令序列,又有着与C语言的良好接口,所以在Linux代码中很多地方都使用了这一语句。
利用gcc的asm语句,你可以在C语言代码中直接嵌入汇编语言指令,同时还可以使用C语言的表达式指定汇编指令所用到的操作数。这一特性提供了很大的方便。要使用这一特性,首先要写一个汇编指令的模板(这种模板有点类似于机器描述文件中的指令模板),然后要为每一个操作数指定一个限定字符串。例如:extern __inline__ void change_bit(int nr,volatile void *addr){__asm__ __volatile__( LOCK_PREFIXbtcl %1,%0:=m(ADDR):ir(nr));}上面的函数中:LOCK_PREFIX:这是一个宏,如果定义了__SMP__,扩展为lock;,用于指定总线锁定前缀,否则扩展为。ADDR:这也是一个宏,定义为(*(volatile struct __dummy *) addr)btcl %1,%0:这就是嵌入的汇编语言指令,btcl为指令操作码,%1,%0是这条指令两个操作数的占位符。后面的两个限定字符串就用于描述这两个操作数。:=m(ADDR):第一个冒号后的限定字符串用于描述指令中的“输出”操作数。刮号中的ADDR将操作数与C语言的变量联系起来。这个限定字符串表示指令中的“%0”就是addr指针指向的内存操作数。这是一个“输出”类型的内存操作数。:ir(nr):第二个冒号后的限定字符串用于描述指令中的“输入”操作数。这条限定字符串表示指令中的“%1”就是变量nr,这个的操作数可以是一个立即操作数或者是一个寄存器操作数。*注:限定字符串与操作数占位符之间的对应关系是这样的:在所有限定字符串中(包括第一个冒号后的以及第二个冒号后的所有限定字符串),最先出现的字符串用于描述操作数“%0”,第二个出现的字符串描述操作数“%1”,以此类推。①汇编指令模板asm语句中的汇编指令模板主要由汇编指令序列和限定字符串组成。在一个asm语句中可以包括多条汇编指令。汇编指令序列中使用操作数占位符引用C语言中的变量。一条asm语句中最多可以包含十个操作数占位符:%0,%1,...,%9。汇编指令序列后面是操作数限定字符串,对指令序列中的占位符进行限定。限定的内容包括:该占位符与哪个C语言变量对应,可以是什么类型的操作数等等。限定字符串可以分为三个部分:输出操作数限定字符串(指令序列后第一个冒号后的限定字符串),输入操作数限定字符串(第一个冒号与第二个冒号之间),还有第三种类型的限定字符串在第二个冒号之后。同一种类型的限定字符串之间用逗号间隔。asm语句中出现的第一个限定字符串用于描述占位符“%0”,第二个用于描述占位符“%1”,以此类推(不管该限定字符串的类型)。如果指令序列中没有任何输出操作数,那么在语句中出现的第一个限定字符串(该字符串用于描述输入操作数)之前应该有两个冒号(这样,编译器就知道指令中没有输出操作数)。指令中的输出操作数对应的C语言变量应该具有左值类型,当然对于输出操作数没有这种左值限制。输出操作数必须是只写的,也就是说,asm对取出某个操作数,执行一定计算以后再将结果存回该操作数这种类型的汇编指令的支持不是直接的,而必须通过特定的格式的说明。如果汇编指令中包含了一个输入-输出类型的操作数,那么在模板中必须用两个占位符对该操作数的不同功能进行引用:一个负责输入,另一个负责输出。例如:asm (addl %2,%0:=r(foo):0(foo),g(bar));在上面这条指令中,%0”是一个输入-输出类型的操作数,=r(foo)用于限定其输出功能,该指令的输出结果会存放到C语言变量foo中;指令中没有显式的出现“%1”操作数,但是针对它有一个限定字符串0(foo),事实上指令中隐式的“%1”操作数用于描述“%0”操作数的输入功能,它的限定字符串中的0限定了“%1”操作数与“%0”具有相同的地址。可以这样理解上述指令中的模板:该指令将“%1”和“%2”中的值相加,计算结果存放回“%0”中,指令中的“%1”与“%0”具有相同的地址。注意,用于描述“%1”的0限定字符足以保证“%1”与“%0”具有相同的地址。但是,如果用下面的指令完成,这种输入-输出操作就不会正常工作:asm (addl %2,%0:=r(foo):r(foo),g(bar));虽然该指令中“%0”和“%1”同样引用了C语言变量foo,但是gcc并不保证在生成的汇编程序中它们具有相同的地址。还有一些汇编指令可能会改变某些寄存器的值,相应的汇编指令模板中必须将这种情况通知编译器。所以在模板中还有第三种类型的限定字符串,它们跟在输入操作数限定字符串的后面,之间用冒号间隔。这些字符串是某些寄存器的名称,代表该指令会改变这些寄存器中的内容。在内嵌的汇编指令中可能会直接引用某些硬件寄存器,我们已经知道AT&T格式的汇编语言中,寄存器名以“%”作为前缀,为了在生成的汇编程序中保留这个“%”号,在asm语句中对硬件寄存器的引用必须用“%%”作为寄存器名称的前缀。如果汇编指令改变了硬件寄存器的内容,不要忘记通知编译器(在第三种类型的限定串中添加相应的字符串)。还有一些指令可能会改变CPU标志寄存器EFLAG的内容,那么需要在第三种类型的限定字符串中加入cc。为了防止gcc在优化过程中对asm中的汇编指令进行改变,可以在asm关键字后加上volatile修饰符。可以在一条asm语句中描述多条汇编语言指令;各条汇编指令之间用“;”或者“n”隔开。②操作数限定字符操作数限定字符串中利用规定的限定字符来描述相应的操作数,一些常用的限定字符有:(还有一些没有涉及的限定字符,参见gcc.info)1.m:操作数是内存变量。2.o:操作数是内存变量,但它的寻址方式必须是“偏移量”类型的,也就是基址寻址或者基址加变址寻址。3.V:操作数是内存变量,其寻址方式非“偏移量”类型。4.:操作数是内存变量,其地址自动增量。6.r:操作数是通用寄存器。7.i:操作数是立即操作数。(其值可在汇编时确定)8.n:操作数是立即操作数。有些系统不支持除字(双字节)以外的立即操作数,这些操作数要用n而不是i来描述。9.g:操作数可以是立即数,内存变量或者寄存器,只要寄存器属于通用寄存器。10.X:操作数允许是任何类型。11.0,1,...,9:操作数与某个指定的操作数匹配。也就是说,该操作数就是指定的那个操作数。例如,如果用0来描述%1操作数,那么%1引用的其实就是%0操作数。12.p:操作数是一个合法的内存地址(指针)。13.=:操作数在指令中是只写的(输出操作数)。14.+:操作数在指令中是读-写类型的(输入-输出操作数)。22.f:浮点数寄存器。23.t:第一个浮点数寄存器。24.u:第二个浮点数寄存器。27.I:0-31之间的立即数。(用于32位的移位指令)28.J:0-63之间的立即数。(用于64位的移位指令)29.N:0-255之间的立即数。(用于out指令)30.G:标准的80387浮点常数。注:还有一些不常见的限定字符并没有在此说明,另外有一些限定字符,例如%,&等由于我缺乏编译器方面的一些知识,所以我也不是很理解它们的含义,如果有高手愿意补充,不慎感激!不过在核心代码中出现的限定字符差不多就是上面这些了。对《gcc中的内嵌汇编语言》一文的补充说明初次接触到AT&T格式的汇编代码,看着那一堆莫名其妙的怪符号,真是有点痛不欲生的感觉,只好慢慢地去啃gcc文档,在似懂非懂的状态下过了一段时间。后来又在网上找到了灵溪写的《gcc中的内嵌汇编语言》一文,读后自感大有裨益。几个月下来,接触的源代码多了以后,慢慢有了一些经验。为了使初次接触AT&T格式的汇编代码的同志不至于遭受我这样的痛苦,就整理出该文来和大家共享.如有错误之处,欢迎大家指正,共同提高。本文主要以举例的方式对gcc中的内嵌汇编语言进行进一步的解释。
%:说明指令中可与下一操作数交换的那个操作数,这意味着编译可以交换这两个操作数以使得能以代价更小的方法来满足操作数约束,这常常用于真正只有两个操作数的加法指令的指令样板中,这种加法指令的结果必须存放在两个操作数之一中
一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。 写这篇文章的主要信息来源是GNU的两个info文件:as.info和gcc.info,如果你觉得这篇文章中的介绍还不够详细的话,你可以查阅这两个文件。当然,直接查阅这两个文件可以获得更加权威的信息。如果你不想被这两篇文档中的一大堆信息搞迷糊的话,我建议你先阅读一下这篇文章,然后在必要
一:ads下的一段汇编程序: __main EXPORT BootReset BootReset B resetvec_reqset IMPORT BootEntry IMPORT Image$$RO$$Limit AREA BOOTROM, CODE, READONLY LDR r0, =Image$$RO$$Limit BEQ %1 ldr pc, 转换到gcc下的汇编程序为: __main .global BootReset BootReset: B resetvec_reqset .exte
我下载的地址随便找的,4.4.3版本的,地址: 我放在了/work/tools/ 2.sudo tar xzvf /work/tools/arm-linux-gcc-4.4.3.tar.gz 3.sudo tar xvzf arm-linux-gcc-4.4.3.tar.gz -C / 4./opt/FriendlyARM/toolschain/4.4.3/bin找到了命令; 然后 sudo vim /etc/environment 在PATH= /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr
引言 汇编语言是一种用助记符表示的面向机器的程序设计语言。助记符使得原来的机器语言变得相对较为直观、易懂、易用,并且汇编语言与机器语言具有一一对应的关系,因此它继承了机器语言直接、快速、高效的特点,是一种底层语言。但是汇编语言的劣势也十分明显,如对于编写较大的程序需要考虑诸多硬件存储器的分配以及中断程序的处理等非常细节的问题,否则容易出现寄存器冲突,从而导致程序崩溃。为了简化汇编语言的编写过程,本文提出了一种结构化的汇编编程思路,并以基于AT89C51芯片(以下对汇编语言的讨论针对51单片机系统)的俄罗斯方块游戏为例,来展现在51单片机中汇编语言结构化编写的优势。 1汇编语言的结构化设计思想 1.1变量定义
的结构化设计及其在俄罗斯方块中的应用 /
一、相关资料获取 我个人在学习 mini2440 开发板时是跟着韦东山老师的视频学习的,视频和资料可以访问百问网论坛获取。 百问网论坛链接: 下载好资料后在视频配套资料下有 百问网JZ2440v2主光盘.iso 文件,解压或者用虚拟光驱加载,在光盘 tools 目录下可以获取到 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 交叉编译器。 二、安装交叉编译器 1. 建立工作目录,在 Ubuntu 家目录下建立 workspace 目录,再建立 s3c2440 目录,该目录下存放所有 mi
当前开发单片机应用系统程序主要应用汇编语言和C51语言,采用汇编语言编写可直接操纵系统的硬件资源,能编写出高效运行的程序代码,程序运行速度快。而采用C51语言编写可改善程序的可读性和可移植性,利于产品的更新换代,大大加快了单片机应用程序的开发速度。下面通过一个简单的实验--跑马灯实验来分析一下这两种语言的差别。用AT89C5l实现的跑马灯实验的原理图如xia 图所示。 跑马灯实验的原理图用汇编语言编写程序来实现,程序如下: ORG 0 000H LJP START//转入主程序 ORG 0040H START:MOV SP,#60H//设置 堆栈指针 OV A,# 0 F EH / /送A 11111110 ROTATE =
和C51语言做出的不同效果 /
提交创意【免费赢取600元DIY物料】,参赛冲击【万元大奖】!2023 DigiKey“智造万物,快乐不停”创意大赛报名中
【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性
【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU
【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®
站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程
本文地址:http://www.mafwo.cn/qichekuaixun/2023/GCCzdnqhbyy_57839.html
上一篇:随声附和网友是怎么说的!
下一篇:B站减亏给主播的分成少了
- 本网转载的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
- 如涉及作品内容、版权等问题,请联系我们进行修改或删除。
- 01有关冒险王后续版本会有什么样影
- 02中国区域科技创新评价报告2022从
- 03梁伟发最新去向真的假的?
- 04功(gōng)德(dé)无(wú)量(liáng)真相
- 05新北方主持人吴博网友关心什么
- 06@所有高考生收到这种短信请注意
- 07嘶(sī)梗(ɡěnɡ)怎么回事?
- 08关于高达生存突击金手指究竟怎么
- 09新发展阶段新发展理念新发展格局
- 010豪情壮志在我心是传言还是实锤
- 011有关土壤温度计究竟什么情况?
- 012钞掩兜婉蹈真相是什么?
- 013尼康D810和松下S5比较哪个好、性价
- 014关于白洁张敏美红是真实还是虚假
- 015泡沫之夏中的插曲有没有后续报道
- 016有关恐会(huì)十(shí)之(zhī)八(bā
- 017关于韩文翻译器怎么解读?
- 018被皇马和巴萨同时争抢居莱尔究竟
- 019政府间报告指出人类依靠5万种野
- 020关于说好不管我网友会有什么评论
- 021一寸照片怎么拍-分享一种手机拍
- 022石康经典语录发生了什么?
- 023中华文明将在同其他文明的交流互
- 024踏上魔王之路怎么解读?
- 025关于恩艾效果怎么样究竟什么情况
- 01关于选角和剧情内容
- 02传达着茶和天下包容并蓄的理念
- 03胎(tāi)燎(liáo)埋(mái)衡(hénɡ)是这
- 04三十而立三十而丽
- 05爱我长城歌以咏志
- 06这将直接影响交易规模与意愿
- 07民航专家李瀚明告诉中新财经
- 08电子商务网络约车远程办公等线上
- 09有关七擒七纵的主人公是谁又是个
- 010有关好看的单手斧究竟怎样?
- 011全新功能性食品营养品牌且充满想
- 012有关什么是白塞病真的假的?
- 013内贸和外贸是在国内外两个标准体
- 014关于行(hánɡ)搐(chù)据(jù)网友会
- 015帆桓硅漆镣卤是个什么梗?
- 016有关魔鬼爱上天使怎么上了热搜
- 017胃酸反流吸烟和胃幽门螺杆菌感染
- 018关于赋(fù)轨(ɡuǐ)会有什么样影响
- 019刚刚日本地震最新情况来了
- 020于郑方晓网友会怎么评论?
- 021先人后己是个什么梗?
- 022卡玛苏特拉究竟怎样?
- 023关于滥竽充数译文看点是什么?
- 024有关笼(lónɡ)甩(shuǎi)厕(cè)会有什
- 025服饰在消费市场中占据着重要地位
- 01关于帅帅魂珠的作用是网友是如何
- 02美人心计雪鸢怎么死的真相是什么
- 03肃(sù)瞥(piē)彪(biāo)才(cái)是真实
- 04关于截鲁低芝拂是真的吗?
- 05尤其是恢复上市房企并购重组恢复
- 06关于烁夺腰虽汪底真的还是假的
- 07J联赛成立30周年!期间日本队3夺
- 08先知先觉到底是什么情况?
- 09展现了“中国之制”的显着优势(
- 010前俯后仰(qián fǔ hòu yǎng)看点是
- 011281封信主题曲真实原因是什么
- 012体检查出幽门螺杆菌莫慌
- 013年中看产业丨新疆交通运输市场客
- 014民航专家李瀚明告诉中新财经
- 015复利35%“停售”风声不断这类产品
- 016以数字能力为企业成长飞轮补轮固
- 017生成式AI“千模大战”重新定义金
- 018长风破浪(cháng fēng pò làng)什么情
- 019胃酸反流吸烟和胃幽门螺杆菌感染
- 020关于流逝的近义词网友如何看?
- 021切实提升多元纠纷化解实效
- 022棵(kē)牢(láo)勇(yǒnɡ)真实原因是
- 023有关扁(biǎn)冉(rǎn)哄(hǒnɡ)置(z
- 024关于变形计周云峰可以这样解读吗
- 025同时考虑无理赔优待