C语言的本质(28)——C语言与汇编之用汇编写一个Helloword
为了更加深入理解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的更多相关文章
- C语言的本质(3)——整数的本质与运算
C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...
- C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...
- C语言的本质(7)——C语言运算符大全
C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...
- C语言的本质(4)——浮点数的本质与运算
C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...
- C语言的本质(32)——C语言与汇编之C语言内联汇编
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...
- C语言的本质(10)——指针本质
指针,大概是C语言中最难理解的概念之一了.指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是: 1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的 ...
- 《C程序设计语言》 练习2-8
问题描述 练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值. Write a function rightr ...
- 12天学好C语言——记录我的C语言学习之路(Day 1)
12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program 1.1): /*//program 1.1 ...
- R语言学习笔记1——R语言中的基本对象
R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...
随机推荐
- 并行编译加快VS C++项目的编译速度
最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...
- 认识元数据和IL(下)<第五篇>
书接上回: 第二十四回:认识元数据和IL(上) , 第二十五回:认识元数据和IL(中) 我们继续. 终于到了,说说元数据和IL在JIT编译时的角色了,虽然两个回合的铺垫未免铺张,但是却丝毫不为过,因为 ...
- SignalR在Xamarin Android中的使用
原文:SignalR在Xamarin Android中的使用 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 ...
- SmartBusinessDevFramework架构设计-3:考虑开源?
掖着藏着,终归不是好的办法.说的跟花一样,究竟里子是什么东西.一个好的被子,里料是羽绒还是棉花还是丝绵还是黑心棉?有时候,真的是看过之后,才能体验其中的奥秘. 这个架构的设计初衷,总体是为了方便.ne ...
- Linux命令之xargs的分析及隐患
写一个main.c: #include <stdio.h> int main(){ printf("foo"); printf("bar"); re ...
- UESTC_秋实大哥下棋 2015 UESTC Training for Data Structures<Problem I>
I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- ZOJ3477&JAVA大数类
转:http://blog.csdn.net/sunkun2013/article/details/11822927 import java.util.*; import java.math.BigI ...
- linux 有名管道(FIFO)
http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...
- 也谈---基于 HTTP 长连接的“服务(转载)
这里指讨论基于HTTP的推技术, 诸如flash,applet之类的东西不作分析, 他们就不能说是"纯粹"的浏览器应用了. 首先是一点背景知识, 大家都知道长连接避免了tcp连接的 ...
- poj1426 Find The Multiple
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14622 Accepted: 593 ...