AT&T汇编语言——工具及程序组成

时间:2021-08-13 01:59:57

1.开发工具

在汇编语言中,用到的工具主要用以下几个:

汇编器、连接器、调试器、编译器 

因为我在这里的是AT&T汇编语言,所以工具下也都是gnu下的那些。


1.1 汇编器(as)

汇编器有很多,masmnasm,gas等,不像高级语言,虽然都叫汇编语言,但不同的汇编器,其语法是存在很大不同的。Intel汇编的书籍到处可见,可是AT&T的却少之又少。但想看Linux内核的话,还是要对AT&T汇编熟悉才行。这也许是自己为什么学习汇编的原因吧。说到汇编器,我们用的是as,其可选参数有很多,但我们用的几个:

比如我们要汇编test.sia-32平台的test.o,

$ as  --32  -o test.o test.s
这里只用到了两个参数--32-o 

--32:是指定为ia-32平台代码,

-o :后接目标文件


 1.2 连接器(ld)

我们选择ld.用到的参数主要有以下几个:

-m elf_i386 :将目标代码连接成elf_i386格式(即32位平台下的代码)

-o :后接目标文件

 

1.3调试器(gdb)

主要的命令有:

list 列出指定的函数或行

break :设置断点

run     运行

next    :下一条指令

step     : 执行程序中的下一条指令


1.4编译器(gcc)

纯汇编可以不用gccgcc 的参数用到的也不多,有以下几个:

-g:调试模式的代码

-o:后接目标代码

-m32:生成ia32平台代码 


1.5 其他一些工具

1.5.1 objdump

Objdump是一个非常有用的工具 ,其可以实现反汇编

主要用到的参数有:-d 表示将目标代码反汇编成指令码

 

1.5.2 gprof 

gprof打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。

 

1.5.3 操作系统 linux 

我的测试环境是ubuntu 14.04  (x86_64 ),但自己学的只是ia-32位汇编,所以,使用--32-m32-m elf_i386 生成32位代码 

 

  

2 .汇编语言的模板范例

其实,单纯用汇编来开发的程序已经很少了。我学习这个,主要目的有两个:

1.看懂Linux内核中的代码

2.看懂C/C++等程序生成的汇编代码 

 

所以,我更希望所用的汇编格式能直接与C语言链接起来。

 

2.1 汇编程序组成 

汇编语言由定义好的段组成,每个段都有不同的目的。三个常用的段如下:

数据段(.section .data)

    声明带有初始值的数据元素,用作汇编 语言程序中的变量

bss段 (.section .bss请问中文该如何翻译?)

    用途汇编语言的缓冲区

文本段 (.section .text)

    存放代码

 

2.1.1 定义段的方法

GNU汇编器使用.section命令语句声明段。.section语句使用一个参数——它声明的段的类型。如图所示。这将是我们以后要使用的布局 。

 AT&T汇编语言——工具及程序组成

 

2.1.2 定义段的起点

当汇编语言程序被转换成可执行文件时,连接器要知道指向的起点,gnu汇编器声明一个默认标签_start,表明程序从这条指令开始。当然,也可以使用连接器参数-e来定义新的起始名称。

 好,下面来总结一下我们的汇编语言的基础模板:

.section .data

<有初始值的数据放在这>

.section .bss

<未初始化的值放在这>

.section .text

.globl _start

_start:

<运行代码放在这>

 今天就写到这吧,明天用具体实例来说一下今天所说的工具的用法。