在汇编语言中,用到的工具主要用下面几个:linux
汇编器、链接器、调试器、编译器 编程
因为我在这里的是AT&T汇编语言。因此工具下也都是gnu下的那些。ubuntu
1.1 汇编器(as)函数
汇编器有很是多,masm,nasm,gas等,不像高级语言,尽管都叫汇编语言。但不一样的汇编器,其语法是存在很是大不一样的。Intel汇编的书籍处处可见,可是AT&T的却少之又少。但想看Linux内核的话,仍是要对AT&T汇编熟悉才行。这或许是本身为何学习汇编的缘由吧。说到汇编器,咱们用的是as,其可选參数有很是多。但咱们用的几个:工具
比方咱们要汇编test.s为ia-32平台的test.o,布局
$ as --32 -o test.o test.s这里仅仅用到了两个參数 --32 和 -o
--32:是指定为ia-32平台代码,学习
-o :后接目标文件开发工具
1.2 链接器(ld)spa
咱们选择ld.用到的參数主要有下面几个:操作系统
-m elf_i386 :将目标代码链接成elf_i386格式(即32位平台下的代码)
-o :后接目标文件
1.3调试器(gdb)
基本的命令有:
list :列出指定的函数或行
break :设置断点
run :执行
next :下一条指令
step : 运行程序中的下一条指令
1.4编译器(gcc)
纯汇编可以不用gcc。
gcc 的參数用到的也很少。有下面几个:
-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位代码
事实上,单纯用汇编来开发的程序已经很是少了。
我学习这个。主要目的有两个:
1.看懂Linux内核中的代码
2.看懂C/C++等程序生成的汇编代码
因此。我更但愿所用的汇编格式能直接与C语言连接起来。
2.1 汇编程序组成
汇编语言由定义好的段组成,每个段都有不一样的目的。
三个常常使用的段例如如下:
数据段(.section .data)
声明带有初始值的数据元素,用做汇编 语言程序中的变量
bss段 (.section .bss请问中文该怎样翻译?)
用途汇编语言的缓冲区
文本段 (.section .text)
存放代码
2.1.1 定义段的方法
GNU汇编器使用.section命令语句声明段。.section语句使用一个參数——它声明的段的类型。如下图所看到的。
这将是咱们之后要使用的布局 。
2.1.2 定义段的起点
当汇编语言程序被转换成可运行文件时,链接器要知道指向的起点,gnu汇编器声明一个默认标签_start,代表程序从这条指令開始。固然。也可以使用链接器參数-e来定义新的起始名称。
好,如下来总结一下咱们的汇编语言的基础模板:
.section .data <有初始值的数据放在这> .section .bss <未初始化的值放在这> .section .text .globl _start _start: <执行代码放在这>
今天就写到这吧,明天用详细实例来讲一下今天所说的工具的使用方法。