为了更加深入理解C语言的本质,我们需要学习一些汇编相关的知识。作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但是非常重要。因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。

大多数情况下我们不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化。但实现情况是我们有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。

汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有以下一些优点:

1、能够直接访问与硬件相关的存储器或 I/O端口;

2、能够不受编译器的限制,对生成的二进制代码进行完全的控制;

3、能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;

4、能够根据特定的应用对代码做最佳的优化,提高运行速度;

5、能够最大限度地发挥硬件的功能。

x86汇编的两种语法:intel语法和AT&T语法。在intel的官方文档中使用intel语法,Windows也使用intel语法,而Linux/UNIX平台的汇编器一直使用AT&T语法。如果AT&T语法的mov%edx,%eax这条指令如果用intel语法来写,就是mov eax,edx,寄存器名不加%号,并且源操作数和目标操作数的位置互换。由于我们在Linux平台下开发,所以使用AT&T语法。

Linux 平台下的汇编工具虽然种类很多,但是最基本的仍然是汇编器、连接器和调试器。

汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,它包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序。

另外一种经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式。NASM使用的是 Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序:

由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了。

Linux 下调试汇编代码既可以用GDB、DDD 这类通用的调试器,也可以使用专门用来调试汇编代码的 ALD。执行 as 命令时带上参数 --gstabs 可以告诉汇编器在生成的目标代码中加上符号表,同时需要注意的是,在用 ld 命令进行链接时不要加上 -s 参数,否则目标代码中的符号表在链接时将被删去。

在 GDB 和 DDD 中调试汇编代码和调试 C 语言代码是一样的,我们可以通过设置断点来中断程序的运行,查看变量和寄存器的当前值,并可以对代码进行单步跟踪。

下面我们来使用汇编语言编写一个Hello world程序。

#hello.asm
.section .data # 数据段声明
msg: .string "Hello, world!\\n" #要输出的字符串
len= . - msg # 字串长度
.section .text # 代码段声明
.global _start # 指定入口函数 _start: # 在屏幕上显示一个字符串
movl$len, %edx # 参数三:字符串长度
movl$msg, %ecx # 参数二:要显示的字符串
movl$1, %ebx #参数一:文件描述符(stdout)
movl$4, %eax # 系统调用号(sys_write)
int $0x80 # 调用内核功能
# 退出程序
movl$0,%ebx # 参数一:退出代码
movl$1,%eax # 系统调用号(sys_exit)
int $0x80 # 调用内核功能

把这个程序保存成文件hello.asm,然后用汇编器(Assembler)as把汇编程序中的助记符翻译成机器指令,生成目标文件hello.o,再用链接器(Linker,或Link Editor)ld把目标文件hello.o链接成可执行文件hello:

aaarticlea/png;base64,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" alt="" />

我们执行生产的hello程序:

aaarticlea/png;base64,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" alt="" />

程序中的#号表示单行注释,类似于C语言的//注释。

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

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

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

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

_start在这里就像C语言的语句标号一样。汇编器在处理汇编程序时会计算每个数据对象和每条指令的地址,当汇编器看到这样一个标号时,就把它下面一条指令的地址作为_start这个符号所代表的地址。而_start这个符号又比较特殊,它所代表的地址是整个程序的入口地址,所以下一条指令movl $len, %edx就成了程序中第一条被执行的指令。

int $0x80前四条指令都是为这条指令做准备的,执行这条指令时发生以下动作:

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

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

3、eax、ebx、ecx和edx寄存器的值是传递给系统调用的两个参数,eax的值是系统调用号,4表示sys_write系统调用,ebx、ecx和edx的值则是传给sys_write系统调用的参数,也就是向标准输出设备输出字符串。大多数系统调用完成之后是会返回用户程序继续执行的,

最后一部分的代码:

         movl$0,%ebx     # 参数一:退出代码
movl$1,%eax # 系统调用号(sys_exit)
int $0x80 # 调用内核功能

eax和ebx寄存器的值是传递给系统调用的两个参数,eax的值是系统调用号,1表示_exit系统调用,ebx的值则是传给_exit系统调用的参数,也就是退出状态。_exit这个系统调用会终止掉当前进程,而不会返回它继续执行。

C语言的本质(28)——C语言与汇编之用汇编写一个Helloword的更多相关文章

  1. C语言的本质(3)——整数的本质与运算

    C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...

  2. C语言的本质(15)——C语言的函数接口入门

    C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...

  3. C语言的本质(7)——C语言运算符大全

    C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...

  4. C语言的本质(4)——浮点数的本质与运算

    C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...

  5. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  6. C语言的本质(10)——指针本质

    指针,大概是C语言中最难理解的概念之一了.指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是: 1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的 ...

  7. 《C程序设计语言》 练习2-8

    问题描述 练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值. Write a function rightr ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 1)

    12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program  1.1): /*//program 1.1 ...

  9. R语言学习笔记1——R语言中的基本对象

    R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

随机推荐

  1. cxf2.7.10 与 spring3.0.5集成

    开发环境: NetBeans7.4 Tomcat 6.0.32 一 服务端: 1:新建JavaWeb工程 cxfspring-server,导入jar包如下图所示: 2:在web.xml文件中添加如下 ...

  2. EXW_FOB_CIF_CFR 外贸报价方式&条款之间的区别与联系

    一.工厂交货价(EXW=Ex Works): 交货地点:出口国工厂或仓库:  运 输:买方负责:  保 险:买方负责:  出口手续:买方负责:  进口手续:买方负责:  风险转移:交货地:  所有权转 ...

  3. QT字体的设置

    摘要: QT4.7.0在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致.作者通过实验进行了一一验证. 介 ...

  4. Eclipse插件Mylyn管理上下文任务管理

    原文地址:http://www.ibm.com/developerworks/cn/java/j-mylyn1/ Mylyn 2.0,第 1 部分: 集成的任务管理 使用集成的 Eclipse 问题跟 ...

  5. App 推荐:Spotify

    之前一直用网易云音乐听歌,后来因为沸沸扬扬的 XCode 注入病毒事件,就把它卸了(无奈脸=.=) 对比国内其它音乐App,私心觉得网易云音乐还是不错的.没有很多花里胡哨的装饰,里面的歌单做的也还算精 ...

  6. Bring Your Charts to Life with HTML5 Canvas and JavaScript

    Bring Your Charts to Life with HTML5 Canvas and JavaScript Bring Your Charts to Life with HTML5 Canv ...

  7. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8010977 前面我们从Android应用程序与 ...

  8. MVCC图示

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者:高健@博客园 luckyjackgao ...

  9. Android多项目依赖在Eclipse中无法关联源代码的问题解决 Ctril 点不进去的解决方法

    1. 使用快捷键:Ctrl+shift+R,在弹出框中输入.classpath  找到被作为library引入的那个.classpath文件. 2.将kind="src" path ...

  10. (转)Java字符串应用之密码加密与验证

    1.通过java.Security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入”MD5“则表示使用MD5算法    2.Message ...