LINUX汇编工具

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值