内联汇编的格式也变得让人生畏了,感觉既不像C语言,也不像汇编语言,似乎是一种中间产物,不信您看:

asm [volatile] (“assembly code” : output : input : clobber/modify)

和前面的基本内联汇编相比,扩展内联汇编在圆括号中变成了4部分,多了output,input,和clobber/modify三项。其中的每一部分都可以省略,甚至包括assembly code。省略的部分要保留冒号分隔符来占位,如果省略的是后面的一个或多个连续的部分,分隔符也不用保留,比如省略了clobber/modify,不需要保留input后面的冒号。

assembly code:还是用户写入的汇编指令,和基本内联汇编一样。

汇编代码的运行是需要输入参数的,其运行之后也可产出结果。

在C代码中内嵌汇编的目的是让汇编帮助C完成某些功能,所以C代码就要为其提供参数和用于存放其输出结果的空间。这样一来,内联汇编代码类似机器,C代码类似人。机器要运行,人就要为机器提供加工的源材料(input),机器运行后,将生产出来的成果放到人能够得着的地方(output),人才能获取机器的输出结果。input和output正是C为汇编提供输入参数和存储其输出的部分,这是汇编与c交互的关键,我们之前的讨论就通过这两项解决。

output:output用来指定汇编代码的数据如何输出给C代码使用。内嵌的汇编指令运行结束后,如果想将运行结果存储到c变量中,就用此项指定输出的位置。output中每个操作数的格式为:

操作数修饰符 约束名”(C变量名)

其中的引号和圆括号不能少,操作数修饰符通常为等号’=’。多个操作数之间用逗号’,’分隔。

input:input用来指定C中数据如何输入给汇编使用。要想让汇编使用c中的变量作为参数,就要在此指定。input中每个操作数的格式为:

”[操作数修饰符约束名”(C变量名)

其中的引号和圆括号不能少,操作数修饰符为可选项。多个操作数之间用逗号’,’分隔。

单独强调一下,以上的output()input()括号中的是C代码中的变量,output(c变量)input(c变量)就像c语言中的函数,将C变量(值或变量地址)转换成汇编代码的操作数。

clobber/modify:汇编代码执行后会破坏一些内存或寄存器资源,通过此项通知编译器,可能造成寄存器或内存数据的破坏,这样gcc就知道哪些寄存器或内存需要提前保护起来,后面会展开细说。

assembly code中引用的所有操作数其实是经过gcc转换后的复本,“原件”都在output和input括号中的c变量,后面通过各种例子您就明白了。

一步步编写操作系统81 att内嵌汇编语法相关推荐

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

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

  2. __asm__ __volatile__ GCC的内嵌汇编语法 ATT汇编语言语法(Z)

    此文在网上到处转载,已不知原出处,我也将之记录在此,并改正其中的一些小笔误. 开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由 ...

  3. GCC的内嵌汇编语法 ATT汇编语言语法

    __asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法(一) 2007年05月09日 12:36 开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可 ...

  4. 转载:asm volatile GCC的内嵌汇编语法 ATT汇编语言语法

    asm volatile  GCC的内嵌汇编语法 AT&T汇编语言语法 目录 asm volatile  GCC的内嵌汇编语法 AT&T汇编语言语法 1 Overview 2.  GC ...

  5. __asm__ __volatile__ 嵌入式内嵌汇编语法解构

    __asm__ __volatile__ 嵌入式内嵌汇编语法解构 带有C/C++表达式的内联汇编格式为: __asm__ __volatile__("Instruction List&quo ...

  6. Linux C: 内嵌汇编语法

    学内嵌汇编首先知道编译器的编译流程,内嵌汇编就是嵌套在高级程序语言中的汇编语言.在cpp 文件转成 .s 汇编文件时,内嵌汇编保持不动,只有高级程序语言会编译成汇编合成在.s文件中.下面的链接将了C的 ...

  7. ATT汇编语言与GCC内嵌汇编简介

    AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 G ...

  8. GCC如何编译内嵌汇编代码

    内核代码绝大部分使用C  语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码.GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计 ...

  9. c语言转汇编编译器,【转】C语言内嵌汇编(asm)

    TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的. 一.为什么会用到汇编? 1.为了提高速度和效率.不过这种情况很少了,现在C/C++编译器的优化很厉害了. 2.为了实现某些C语 ...

最新文章

  1. 用了这么久配置中心,还不知道长轮询是什么?
  2. python中数据分析的流程为-python数据分析011_数据分析流程
  3. log 框架 之间的关系
  4. 第十六讲 傅里叶级数拓展
  5. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 (zz)
  6. SolrJ添加删除文档
  7. Qt修炼手册8_常用的容器类QVector和QList
  8. 占内存小的qq_手机内存空间告急,这些办法就能轻松搞定!
  9. java.lang.IllegalStateException: Error starting child错误的产生与解决
  10. Python搭建web服务器
  11. 消息中间件—Kafka 的设计思想
  12. C 免费窗体控件Krypton Toolkit 4 2 0的使用
  13. Given a singly linked list where elements are sorted in ascending order, convert it to a height bala
  14. [动态规划|字符串] leetcode 5 最长回文子串
  15. JavaScript正则表达式19例(2)
  16. python字典实现原理-哈希函数-解决哈希冲突方法
  17. Python正则表达式大全
  18. 山东大学舆情分析系统项目结题总结
  19. excel自动合并两列
  20. java gc日志详解_JVM实战:GC日志解析

热门文章

  1. [bzoj3994] [SDOI2015]约数个数和
  2. mac os x10.9.2 查看进程对应端口
  3. [Leveldb源码剖析疑问]-block_builder.cc之Add函数
  4. C函数的实现(strcpy,atoi,atof,itoa,reverse)
  5. 315. Count of Smaller Numbers After Self
  6. vue devtools面板没有显示_vue 基础入门(四)
  7. linux tcp header更改,Linux Netfilter中修改TCP/UDP Payload的方法
  8. 视图添加字段_使用ExploreByTouchHelper辅助类为自定义视图添加虚拟视图
  9. 电脑二维码怎么扫描_扫描模组方案是如何满足多种应用场景需求?
  10. css 可编辑,如何设置DIV可编辑