内联汇编

之前和大家介绍过了一种汇编方法,就是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语法简介相关推荐

  1. 内联汇编 - 从头开始

    FROM: http://www.ibm.com/developerworks/cn/aix/library/au-inline_assembly/ 对于 C/C++ 程序员来说,内联汇编并不是一个新 ...

  2. C语言内联汇编使用方法

    GCC内联汇编 一.基本语法 asm volatile ( assembler template: output operands /* optional */: input operands /* ...

  3. ARM 内联汇编-1

    转自:(72条消息) 10. ARM 内联汇编学习笔记_天昼AI实验室的博客-CSDN博客_armv8 内联汇编 基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~ AR ...

  4. 一步步编写操作系统80 扩展内联汇编1

    由于基本内联汇编功能太薄弱了,所以才对它进行了扩展以使其功能强大.不过,易用性往往与功能强弱是成正比的,如您所料,扩展内联汇编确实有点难,但在求知欲的驱使下,就让咱们痛并快乐着吧. gcc本身是个c编 ...

  5. 一步步编写操作系统 79 在c代码中内联汇编

    基本内联汇编是最简单的内联形式,其格式为: asm [volatile] ("assembly code") 各关键字之间可以用空格或制表符分隔也可以紧凑挨在一起不分隔,各部分意义 ...

  6. 一步步编写操作系统81 att内嵌汇编语法

    内联汇编的格式也变得让人生畏了,感觉既不像C语言,也不像汇编语言,似乎是一种中间产物,不信您看: asm [volatile] ("assembly code" : output ...

  7. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  8. VS 编写 x64 内联汇编

    From:https://www.cnblogs.com/talenth/p/9135626.html VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/arti ...

  9. 一步步编写操作系统 78 intel汇编与ATT汇编语法区别

    本节咱们介绍下intel汇编语法和at&t汇编语法的区别. 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说. 在Intel语法中,立即数就是普通的数字,如果 ...

最新文章

  1. 1、存在如下数列1、1、2、4、7、13、24、44、81、149......现要求该数列第n项的值(n从O开始算)。 程序运行结果: 1/2 输入:4 输出:7 输入:9 输出:149
  2. java mp3播放器 无界面
  3. python装饰器原理-python装饰器的原理和使用
  4. login控件“您的登录尝试不成功。请重试”的解决方法
  5. 八个JS中你见过的类型。
  6. Ubuntu之make:make命令行工具的简介、安装、使用方法之详细攻略
  7. java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
  8. 清华大学人工智能研究院开源“天授”强化学习平台
  9. WPF 基础控件之 DatePicker 样式
  10. C. Longest Simple Cycle
  11. 计算几何相关资料+题目推荐(不定期补充)
  12. 看完后,别再说自己不懂用户画像了
  13. Netty 源码解析系列-服务端启动流程解析
  14. 【干货】31篇关于深度学习必读论文汇总(附论文下载地址)
  15. 模拟Post登陆带验证码的网站
  16. 从年薪1万到年薪100万的日子
  17. IDE 和SCSI简介
  18. 视觉定位系统在机器人全场定位的应用
  19. 奥运14日看点:杨威金牌最稳 领衔7大夺金点
  20. 服务器在机柜中的安装位置,服务器上机柜的安装方法

热门文章

  1. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
  2. HTTP协议中返回代码302的情况
  3. C++编绎器编绎C语言的问题
  4. 悬浮窗_华为手机悬浮窗设置在哪里
  5. normalize函数_提取棋盘格角点函数解析
  6. 3结构介绍_豹驰(BOACH)声学材料吸隔声方法介绍—(下)材料隔声特性曲线
  7. android休眠后恢复线程,关于Android系统休眠后,线程的执行情况
  8. java符号引用 直接引用_Java -- JVM的符号引用和直接引用
  9. CSS3 线性渐变背景的过渡效果
  10. Java设计模式笔记(6)观察者模式