一、Linux汇编编程
1、简介
作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却毋庸置疑,因为它能够完成许多其他语言无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免的在某些地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系十分密切,即使是使用 C 语言也会显得力不从心,因而只有汇编语言才能胜任这部分工作,最大限度的发挥出硬件的性能。
2、汇编语法格式
DOS/Windows 下的汇编语言代码都是 Intel 风格的,而 Linux 和 Unix 系统中更多采用的是 AT&T 格式,两者在语法格式上主要差异如下:
1)在 AT&T 汇编格式中,寄存器名要加上"%"号作为前缀;而在 Intel 汇编格式中则不需要
AT&T 格式 pushl %eax
Intel格式 push eax
2)在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即数;Intel 格式不用带任何前缀
AT&T 格式 pushl $1
Intel格式 push 1
3)AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反
AT&T 格式 addl $1,%eax // 在AT&T汇编格式中源操作数在目标操作数的左边
Intel格式 add eax,1
3、汇编工具
Linux 平台下的汇编工具种类虽然很多,但同 DOS/Windows 一样,最基本的人仍然是汇编器、链接器和调试器。
3.1、汇编器
汇编器(assembler)的作用是将汇编语言源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS ,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编 AT&T 格式的源代码
as -o hello.o hello.s
3.2、连接器
汇编器所产生的目标代码是不能够直接在计算机上运行的,它必须经过链接器的处理才能生成可执行文件。链接器通常用来将多个目标代码连接成一个可执行文件,这样可以先将程序分为几个单独的模块来开发,然后将它们组合成一个完整的程序。Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编源代码在成功通过 GAS 或 NASM 生成目标代码后,就可以使用 ld 将其链接成可执行文件了
ld -s -o hello hello.o