一步步编写操作系统 77 内联汇编与ATT语法简介
内联汇编
之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。
另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它称为内联汇编。
其实还有另外一种,就是那些技术大牛才能玩得转的方式,将c代码编译为汇编代码后,再修改汇编代码。
什么是内联汇编
内联汇编称为inline assembly,GCC支持在C代码中直接嵌入汇编代码,所以称为GCC inline assembly。大家知道,C语言不支持寄存器操作,汇编语言可以,所以自然就想到了在C语言中嵌入内联汇编提升“战斗力”的方式,通过内联汇编,C程序员可以实现C语言无法表达的功能,这样使开发能力大为提升。
内联汇编按格式分为两大类,一类是最简单的基本内联汇编,另一类是复杂一些的扩展内联汇编,在介绍它们之前,其实还有一点点头疼的事,内联汇编中所用的汇编语言,其语法是AT&T,并不是咱们熟悉的Intel汇编语法,GCC只支持它,所以咱们还得了解下AT&T。
AT&T语法简介
我们在大学所学习的汇编语言大多数都是intel语法,也许这和教学系统都是微软的操作系统dos和windows有关,翻翻过去的教材,一律全是dos下汇编或windows下汇编。linux内核中的汇编代码一般都是AT&T语法,我想,随着linux普及,以后在教学中会越来越多采取AT&T语法啦。
AT&T是汇编语言的一种语法风格、格式。在某一处理器平台上,无论汇编代码是什么语法,其编译出来的机器码是一样的,所以不要误以为AT&T是一种新的机器语言。它仅仅是表达方式不同,意思是一样的,这就像咱们汉语中,比如,“我今天与贺亚涛在食堂吃饭”,“今天在食堂,贺亚涛和我一起吃饭”,都表达的是同一个意思。
AT&T首先在Unix中使用,可当初Unix并不是在x86处理器上开发的,最初是在PDP-11机器上开发,后来又移植到VAX和68000的处理器上,所以AT&T的语法自然更接近于这些处理器的特性。虽然unix后来又移植到x86上了,但还是要尊重unix圈内的习惯,其汇编语法还是接近于那些前辈处理器上的语法,这就是AT&T语法。
无论语法再怎么变,汇编语言中指令关键字肯定不能有太大出入,名字非常接近,只是在指令名字的最后加上了操作数大小后缀,b表示1字节,w表示2字节,l表示4字节。比如压栈指令,intel中是push,AT&T中是pushl,最后这个’l’表示压入4字节(long型大小)。在了解intel汇编指令的情况下,基本上能够看懂AT&T的汇编指令。它们的主要差别是语法风格,咱们对照着看下这两种风格的区别吧。
图1
图1续
好了,下节再说,哥下班回家了。
一步步编写操作系统 77 内联汇编与ATT语法简介相关推荐
- 内联汇编 - 从头开始
FROM: http://www.ibm.com/developerworks/cn/aix/library/au-inline_assembly/ 对于 C/C++ 程序员来说,内联汇编并不是一个新 ...
- C语言内联汇编使用方法
GCC内联汇编 一.基本语法 asm volatile ( assembler template: output operands /* optional */: input operands /* ...
- ARM 内联汇编-1
转自:(72条消息) 10. ARM 内联汇编学习笔记_天昼AI实验室的博客-CSDN博客_armv8 内联汇编 基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~ AR ...
- 一步步编写操作系统80 扩展内联汇编1
由于基本内联汇编功能太薄弱了,所以才对它进行了扩展以使其功能强大.不过,易用性往往与功能强弱是成正比的,如您所料,扩展内联汇编确实有点难,但在求知欲的驱使下,就让咱们痛并快乐着吧. gcc本身是个c编 ...
- 一步步编写操作系统 79 在c代码中内联汇编
基本内联汇编是最简单的内联形式,其格式为: asm [volatile] ("assembly code") 各关键字之间可以用空格或制表符分隔也可以紧凑挨在一起不分隔,各部分意义 ...
- 一步步编写操作系统81 att内嵌汇编语法
内联汇编的格式也变得让人生畏了,感觉既不像C语言,也不像汇编语言,似乎是一种中间产物,不信您看: asm [volatile] ("assembly code" : output ...
- 一步步编写操作系统 69 汇编语言和c语言共同协作 70
由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...
- VS 编写 x64 内联汇编
From:https://www.cnblogs.com/talenth/p/9135626.html VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/arti ...
- 一步步编写操作系统 78 intel汇编与ATT汇编语法区别
本节咱们介绍下intel汇编语法和at&t汇编语法的区别. 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说. 在Intel语法中,立即数就是普通的数字,如果 ...
最新文章
- 1、存在如下数列1、1、2、4、7、13、24、44、81、149......现要求该数列第n项的值(n从O开始算)。 	程序运行结果: 	1/2 	输入:4 	输出:7 	输入:9 	输出:149
- java mp3播放器 无界面
- python装饰器原理-python装饰器的原理和使用
- login控件“您的登录尝试不成功。请重试”的解决方法
- 八个JS中你见过的类型。
- Ubuntu之make:make命令行工具的简介、安装、使用方法之详细攻略
- java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
- 清华大学人工智能研究院开源“天授”强化学习平台
- WPF 基础控件之 DatePicker 样式
- C. Longest Simple Cycle
- 计算几何相关资料+题目推荐(不定期补充)
- 看完后,别再说自己不懂用户画像了
- Netty 源码解析系列-服务端启动流程解析
- 【干货】31篇关于深度学习必读论文汇总(附论文下载地址)
- 模拟Post登陆带验证码的网站
- 从年薪1万到年薪100万的日子
- IDE 和SCSI简介
- 视觉定位系统在机器人全场定位的应用
- 奥运14日看点:杨威金牌最稳 领衔7大夺金点
- 服务器在机柜中的安装位置,服务器上机柜的安装方法
热门文章
- asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
- HTTP协议中返回代码302的情况
- C++编绎器编绎C语言的问题
- 悬浮窗_华为手机悬浮窗设置在哪里
- normalize函数_提取棋盘格角点函数解析
- 3结构介绍_豹驰(BOACH)声学材料吸隔声方法介绍—(下)材料隔声特性曲线
- android休眠后恢复线程,关于Android系统休眠后,线程的执行情况
- java符号引用 直接引用_Java -- JVM的符号引用和直接引用
- CSS3 线性渐变背景的过渡效果
- Java设计模式笔记(6)观察者模式