1.1.3 Linux汇编工具
Linux平台下的汇编工具虽然种类很多,但同DOS/Windows一样,最基本的仍然是汇编器、连接器和调试器。
1.1汇编器
汇编器的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux平台的标准汇编器是GAS,它是GCC所依赖的后台汇编工具,通常包含在 binutils软件包中。GAS使用标准的AT&T汇编语法,可以用来汇编用AT&T格式编写的程序:
[xiaowp@gary code]$ as -o hello.o hello.s |
Linux平台上另一个经常用到的汇编器是NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比GAS快很多,更重要的是它使用的是Intel汇编语法,可以用来编译用Intel语法格式编写的汇编程序:
[xiaowp@gary code]$ nasm -f elf hello.asm |
1.2链接器
由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用ld作为标准的链接程序,它同样也包含在 binutils软件包中。汇编程序在成功通过GAS或NASM的编译并生成目标代码后,就可以使用ld将其链接成可执行程序了:
[xiaowp@gary code]$ ld -s -o hello hello.o |
1..3调试器
从调试的角度来看,使用GAS的好处是可以在生成的目标代码中包含符号表,这样就可以使用GDB和DDD来进行源码级的调试了。要在生成的可执行程序中包含符号表,可以采用下面的方式进行编译和链接:
[xiaowp@gary code]$ as --gstabs -o hello.o hello.s [xiaowp@gary code]$ ld -o hello hello.o |
执行as命令时带上参数--gstabs可以告诉汇编器在生成的目标代码中加上符号表,同时需要注意的是,在用ld命令进行链接时不要加上-s参数,否则目标代码中的符号表在链接时将被删去。
在GDB和DDD中调试汇编代码和调试C语言代码是一样的,你可以通过设置断点来中断程序的运行,查看变量和寄存器的当前值,并可以对代码进行单步跟踪。图1 是在 DDD 中调试汇编代码时的情景:
图1 用 DDD 中调试汇编程序
汇编程序员通常面对的都是一些比较苛刻的软硬件环境,短小精悍的ALD可能更能符合实际的需要,因此下面主要介绍一下如何用ALD来调试汇编程序。首先在命令行方式下执行ald命令来启动调试器,该命令的参数是将要被调试的可执行程序:
[xiaowp@gary doc]$ ald hello ald> |
当ALD 的提示符出现之后,用 disassemble 命令对代码段进行反汇编:
ald> disassemble -s .text Disassembling section .text (0x08048074 - 0x08048096) 08048074 BA0F000000 mov edx, 0xf 08048079 B998900408 mov ecx, 0x8049098 0804807E BB01000000 mov ebx, 0x1 08048083 B804000000 mov eax, 0x4 08048088 CD80 int 0x80 0804808A BB00000000 mov ebx, 0x0 0804808F B801000000 mov eax, 0x1 08048094 CD80 int 0x80 |
上述输出信息的第一列是指令对应的地址码,利用它可以设置在程序执行时的断点:
ald> break 0x08048088 Breakpoint 1 set for 0x08048088 |
断点设置好后,使用run命令开始执行程序。ALD在遇到断点时将自动暂停程序的运行,同时会显示所有寄存器的当前值:
ald> run |
如果需要对汇编代码进行单步调试,可以使用next命令:
ald> next
若想获得 ALD 支持的所有调试命令的详细列表,可以使用help 命令:
ald> help