从assemblyer Instructure deepth understander C principle

要彻底搞清楚C语言的原理,就必须深入到指令一层去理解。你写一行C代码,编译器会生成什么样的指令,要做到心中有数;

涉及到的as assembly

链接器 ld;

用汇编器翻译成机器指令了还不行,还要有一个链接的步骤呢?链接主要有两个作用,一是修改目标文件中的信息,对地址做重定位

二是把多个目标文件合并成一个可执行文件;

#号表示单行注释,类似于C语言的//注释,和shell注释一样;

汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive)或伪操作(Pseudo-operation),由于它不是真正的指令所以加个“伪”字。.section指示把代码划分成若干个段(Section),程序被操作系统加载执行时,每个段被加载到不同的地址,操作系统对不同的页面设置不同的读、写、执行权限。.data段保存程序的数据,是可读可写的,相当于C程序的全局变量。本程序中没有定义数据,所以.data段是空的。

.text段保存代码,是只读和可执行的,后面那些指令都属于.text段;

_start是一个符号(Symbol), 符号在汇编程序中代表一个地址,可以用在指令中,汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值。在C语言中我们通过变量名访问一 个变量,其实就是读写某个地址的内存单元,我们通过函数名调用一个函数,其实就是跳转到该函数第一条指令所在的地址,所以变量名和函数名都是符号,本质上 是代表内存地址的。

.globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号

_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。

汇编程序中,立即数前面要加$,寄存器名前面要加%,以便跟符号名区分开。以后我们会看到mov指令还有另外几种形式,但数据传送方向都是一样的,第一个操作数总是源操作数,第二个操作数总是目标操作数。(注意这里是AT&T汇编语法,intel语法源和目标是相反的哦);

前两条指令都是为这条指令做准备的,执行这条指令时发生以下动作:

  1. int指令称为软中断指令,可以用这条指令故意产生一个异常,上一章讲过,异常的处理和中断类似,CPU从用户模式切换到特权模式,然后跳转到内核代码中执行异常处理程序。

  2. int指令中的立即数0x80是一个参数,在异常处理程序中要根据这个参数决定如何处理,在Linux内核中int $0x80这种异常称为系统调用(System Call)。内核提供了很多系统服务供用户程序使用,但这些系统服务不能像库函数(比如printf) 那样调用,因为在执行用户程序时CPU处于用户模式,不能直接调用内核函数,所以需要通过系统调用切换CPU模式,经由异常处理程序进入内核,用户程序只 能通过寄存器传几个参数,之后就要按内核设计好的代码路线走,而不能由用户程序随心所欲,想调哪个内核函数就调哪个内核函数,这样可以保证系统服务被安全 地调用。在调用结束之后,CPU再切换回用户模式,继续执行int $0x80的下一条指令,在用户程序看来就像函数调用和返回一样。

  3. eaxebx的值是传递给系统调用的两个参数。eax的值是系统调用号,Linux的各种系统调用都是由int $0x80指令引发的,内核需要通过eax判断用户要调哪个系统调用,_exit的系统调用号是1。ebx的值是传给_exit的参数,表示退出状态。大多数系统调用完成之后会返回用户空间继续执行后面的指令,而_exit系统调用比较特殊,它会终止掉当前进程,而不是返回用户空间继续执行

  4. “jump if equal”;jmp是一个无条件跳转指令,什么条件也不判断,直接跳转;jle表示“jump if less than or equal”

    汇编寻址;

  5. 访问内存时在指令中可以用多种方式表示内存地址,比如可以用数组基地址、元素长度和下标三个量来表示,增加了寻址的灵活性
  6. parcel存储库url
  7. http://www.cloudera.com/content/cloudera-content/cloudera-docs/CM4Ent/latest/Cloudera-Manager-Administration-Guide/cmag_db_for_cm_upgrades.html

posted on 2014-03-31 14:26 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/ruiy/p/as.html

从assemblyer Instructure deepth understander C principle相关推荐

  1. R语言PCA主成分分析(Principle Component Analysis)实战2

    R语言PCA主成分分析(Principle Component Analysis)实战2 目录 R语言PCA主成分分析(Principle Component Analysis)实战2 #案例分析

  2. R语言PCA主成分分析(Principle Component Analysis)与线性回归结合实战

    R语言PCA主成分分析(Principle Component Analysis)与线性回归结合实战 目录 R语言PCA主成分分析(Principle Component Analysis)与线性回归 ...

  3. R语言PCA主成分分析(Principle Component Analysis)实战1

    R语言PCA主成分分析(Principle Component Analysis)实战1 目录 R语言PCA主成分分析(Principle Component Analysis)实战1 #案例分析

  4. R语言主成分分析(Principle Component Analysis、PCA)

    R语言主成分分析(Principle Component Analysis.PCA) 利用正交变换把可能线性相关变量表示的观测数据,转换为由少数几个线性无关变量(主成分)表示的数据.(重构原始特征空间 ...

  5. 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?

    主成分分析(Principle Component Analysis)PCA的核心思想是什么?增量PCA模型, 随机PCA, 模型. 核化PCA分别是什么?使用时如何选择? 主成分分析(Princip ...

  6. 白化(whitening)是什么?白化(whitening)与PCA(principle component analysis)的区别是什么?

    白化(whitening)是什么?白化(whitening)与PCA(principle component analysis)的区别是什么? 白化是一种重要的预处理过程,其目的就是降低输入数据的冗余 ...

  7. 概念的理解 —— 奇点(singularity point)、第一性原理(first principle)

    奇点(singularity point)一词出现在不同的环境里,对应着不同的含义: wikipedia:Singularity 文艺作品: 未来学(Futurology):比如雷·库兹韦尔的< ...

  8. design principle:java 回调与委派/委托机制

    博客 design principle:模拟 android Button 控件点击事件   主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现. 委派, ...

  9. 设计模式-设计原则(Design Principle)

    本文由@呆代待殆原创,转载请注明出处. 写在前面:所谓设计原则并不是一定要遵守的法则,只是一种建议,因为保持这些原则本身会有一定代价,若是这些代价超过了带来的好处就得不偿失了,所以一切还是以简单为准. ...

最新文章

  1. 机器学习算法总结--K近邻
  2. LeetCode 1670. 设计前中后队列(deque)
  3. SpringBoot------集成PageHelper分页功能
  4. 基类显式继承接口,类继承基类时又继承同一接口,引发接口方法混乱(显式继承接口的弊端)...
  5. 【2018徐州ICPC Gym-102012 M】Rikka with Illuminations【计算几何】
  6. 安卓app逆向破解脱壳教程
  7. (附源码)springboot宠物管理系统 毕业设计 121654
  8. MMORPG开发入门[转]
  9. npm install安装报错:gyp info it worked if it ends with ok的解决方法
  10. 基于JAVA实现的农夫过河问题
  11. c8051f310烧录_C8051F烧录器-C8051F系列烧录工具下载v1.0.0.1 官方最新版-西西软件下载...
  12. 网评100首最好听的歌
  13. 能用四川电信卡开通的虚拟服务器,双网通手机也能用电信卡了?VoLTE开放:发短信就能开通...
  14. (转自zee的原创)OATS 正交表测试策略
  15. WayOs 帐号到期自动清理工具,致浪费在清理到期用户的青春
  16. amd显卡测试大风车软件md,AMD显卡也能实现光线追踪?靠谱答案在这里!
  17. 面对问题,最高明的处理方式(经典)
  18. 第五届安全焦点信息安全技术峰会已经结束,感叹一下,全部是大牛啊
  19. 合肥市工业固定资产投资项目库2022年第二批入库项目申报时间流程
  20. Python编程快速上手,让繁琐工作自动化

热门文章

  1. h5新增的属性php,HTML5中form的新增属性或元素
  2. java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)
  3. 【每日一题】航班预订统计
  4. 多路复用 I/O 模型详解, 为什么他能支持更高的并发
  5. Springboot实战:3种 Springboot 全局时间格式化方式
  6. java mysql 变量_MySQL基础_变量
  7. 4行代码,让app自动化框架支持 webview 混合应用操作
  8. 超详细find命令解析,一遍就会!!!
  9. suse linux 备份,suse linux利用scp实现自动远程备份
  10. php mssql_result 255 string,PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法