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,iVBORw0KGgoAAAANSUhEUgAAAVwAAAAmCAYAAACI2CM/AAAMxUlEQVR4Ae1dPXbjOBKG/PYorQ3mCPYFtu3EyTjdaOXXybiDdeawsw4sb9KvPcluOlFPIM0Jpo8wgeizmPsVgAIKIEiRkinR7eJ7MgkC9fcBKAIlsTz78OFD/eXLF6OHIqAIKAKKwLgInIzLXrkrAoqAIqAIMALqcBkJPSsCioAiMDIC6nBHBljZKwKKgCLACEzC4S6r2tQ1fdZmwZrpWRFQBBSBHwyBozvc02VlbqprM5vNzNnD3Hxdq8s9+hhbrE19oH5YVsd9yC7Wuz/oHW2Zvqvu6P17JAUWq2fzjEXVNeb60MPROqxz+q66oX*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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这个系统调用会终止掉当前进程,而不会返回它继续执行。

上一篇:在python3中安装mysql扩展,No module named 'ConfigParser'


下一篇:easyui实现背景图片半透明状态,悬浮在大背景之上