AT&T 汇编语言 (一) : 软件包概述

GNU Binutils 软件包

GNU Binutils 软件包包含以下程序(软件包版本为 2.15)

addr2line把地址转换为文件名和行号
ar创建、修改和展开文件存档
as把汇编语言代码汇编为目标代码
c++filt还原 C++ 符号的过滤器
gprof显示程序简档信息的程序
ld把目标代码文件转换为可执行文件的连接器
nlmconv把目标代码转换为 Netware Loadable Module 格式
nm列出目标文件中的符号
objcopy复制和翻译目标文件
objdump显示来自目标文件的信息
ranlib生成存档文件内容的索引
readelf按照 ELF 格式显示来自目标文件的信息
size列出目标文件或者存档文件的段长度
strings显示目标文件中可打印字符串
strip丢弃符号
windres编译 Microsoft Windows 资源文件

GNU 汇编器(as)

GNU 汇编器(gas)是 UNIX 环境下最流行的汇编器

简单用法

使用以下命令,可以将汇编语言源程序 test.s 转换为目标文件 test.o

as -o test.o test.s

GNU 链接器(ld)

GNU 链接器 ld 用于把目标代码文件链接为可执行程序文件或者库文件

简单用法

使用以下命令,可以从目标文件 test.o 创建可执行文件 test

ld -o test test.o

GNU 调试器(gdb)

GNU 调试器程序名称为 gdb。要想使用对可执行文件使用调试器,就必须先前使用 -gstabs 选项编译(汇编)可执行文件,以便调试器知道指令码与源代码文件中什么位置是相关联的

关于 -gstabs 选项,man 英文手册中有关 as 汇编器的内容原文如下

-g
       --gen-debug
           Generate debugging information for each assembler source line using whichever debug format is preferred by the target.  This currently means either STABS, ECOFF or DWARF2.

       --gstabs
           Generate stabs debugging information for each assembler line.  This may help debugging assembler code, if the debugger can handle it.

       --gstabs+
           Generate stabs debugging information for each assembler line, with GNU extensions that probably only gdb can handle, and that could make other debuggers crash or refuse to read your program. This may help debugging assembler code.  Currently the only GNU extension is the location of the current working directory at assembling time.

GDB 常用调试命令

以下是使用 gdb 命令对可执行文件 test 运行调试器的效果

运行 gdb 调试器后,在 gdb 命令提示下,可以输入调试命令,这里列出比较常用的命令

break在源代码中设置断点以便断下
(标号前加 * 号,比如 break *_start)
watch设置监视点,当变量变为特定值时断下
info观察寄存器、堆栈和内存
x检查内存位置
格式:x/nyz
n:要显示字段数
y:c 表示字符,d 表示十进制,x 表示十六进制
z:b 表示字节,h 表示双字节,w 表示四字节
print显示变量的值
格式:print/a
a:d 以十进制显示,t 二进制,x 十六进制
run在调试器内开始程序的执行
list列出指定的函数或者行
next执行程序中的下一条指令(与 step 等价)
step执行程序中的下一条指令(与 next 等价)
cont从断下的位置继续执行程序
until运行直到到达指定的源代码行

GNU 目标转储程序(objdump)

GNU objdump 程序是 binutils 软件包中十分有用的工具。程序员经常需要查看目标文件中由把编译器生成的指令码。objdump 既能显示汇编语言代码又能显示生成的原始指令码

简单用法

objdump 程序的 -d 选项可以将目标代码反汇编为指令码

GNU 简档器(gprof)

GNU 简档器(gprof)用于分析程序的执行和确定应用程序中的“热点”在什么位置。

应用程序的“热点”是程序运行时需要最多处理时间的函数。通常,它们是数学密集型的函数,但是情况不总是如此。I/O 密集型的函数也会增加处理时间。

对一个可执行文件的热点分析步骤有三步:

  1. 使用 -pg 选项编译源程序
  2. 运行该程序以生成 gmon.out 调用图表
  3. 对该程序运行 gprof 输出分析报告

这里有一个例程,包含两个函数

#include <stdio.h>

void fun1() {
    int i, j;
    for (i = 0; i < 100000; i++) 
        j += i;
}

void fun2() {
    int i, j;
    fun1();
    for (i = 0; i < 200000; i++) 
        j = i;
}

int main() {
    int i, j;
    for (i = 0; i < 100; i++)
        fun1();
    for (i = 0; i < 50000; i++)
        fun2();
    return 0;
}

执行结果如图

发表评论

电子邮件地址不会被公开。 必填项已用*标注