一个汇编程序员至少应该有下面这些工具:
1.汇编器
2.连接器
3.调试器
汇编器自然不用说,就是将汇编代码转换成目标代码的程序.注意是目标代码,windows平台上的可能会理解成最终的二进制代码,原因其实就是你们所用的IDE真的是给你们做了太多隐藏的工作..
连接器就是将目标代码连接起来的工具.从而组成可执行文件.
汇编语言程序主要由3部分组成,
1.操作码助记符
2.数据段
3.命令
第一篇我就说过,汇编语言其实是没有语法标准的,其中最大的区别主要在于汇编器命令.
对于每个汇编器,命令都是独特的..这也是为什么我学了16位的汇编还要去看32位汇编的原因..如果想在linux下工作的话还是直接学AT&T汇编算了.以后手机上用arm芯片我想也可以直接用linux的汇编器来写吧,估计精简指令集的话,会在这个基础上再删除一些指令吧.
连接器需要知道你的代码中任何函数的具体实现代码.所以外部函数必须包含在目标代码中或者动态链接库(比如C中的printf,估计shell也是用的这个来显示命令行的吧.)
顺带说一下高级语言所需的工具
1.编译器
2.目标代码反汇编器(搞逆向的必备工具?)
3.简档器
编译器自然不用说,不过很多新手还是很容易把编译器和编辑器搞混呢..vi是编辑器,只负责编写代码的工作,只有编译器才能让代码生成汇编代码或者可执行程序(编译器一般会自己进行连接工作,并且调用as命令将汇编代码生成目标代码).
简档器(profiler)这是个分析程序运行的好工具啊.你可以运行一段程序,然后分析哪个函数运行多久.原来学16位汇编的时候还不知道有这么好的东西.等下介绍的时候可以自己编个程序来用用这个简档器
安装汇编器
rpm -qa | grep binutils
dpkg -l | grep binutil
tar -zxvf binutils-xx.xx.tar.gz(xx表示按照之前显示的来)
./configurs (检查宿主系统以便确保编译包所需的所有包和工具在系统上是可用的)
.make (make install,书上指示写的是make但是下面写的是make install,..)
我的系统用的是centos6.4的.然后裸机安装到破烂的笔记本上.选择的开发者的选项.所有的环境就可以使用了.所以也没怎么管过安装..有问题的话可以把结果告诉我~
貌似我给同学装虚拟机的时候没有这个选项,所以可能读者需要了解一下.
至于汇编器的参数常用的也就下面这么几个
-a | 指定输出信息 |
--gstabs | 包含每行源代码的调试信息(gdb调试) |
--gstabs+ | 包含专门的gdb调试信息 |
-J | 不警告带符号溢出 |
-o | 指定输出目标文件的名称 |
-R | 把数据段合并进文本段 |
--statistics | 显示汇编使用的最大空间和总时间 |
-W | 不显示警告信息 |
-- | 对于源文件使用标准输入(就是两个’-’,这一条我还没用过..) |
就像这样使用,在shell模式下
as -o test.o test.s
GNU连接器ld
这个的命令格式好多..不过也用不到那么多,大多就这样
ld -o mytest mytest.o
目标代码文件mytest.o就生成了可执行文件.mytest
-l | 把指定的存档文件添加到要连接的文件清单 |
-L | 把指定的路径添加到搜索库的目录清单 |
-n | 设置文本段为只读 |
-no-keep-memory | 生成优化了的输出文件 |
-O(大写) | 生成优化了的输出文件 |
-o | 指定输出文件的名称 |
-rpath | 把指定的目录添加到运行时库搜索路径 |
-shared | 创建共享库 |
-Ttest | 使用指定的地址作为文本段的起点 |
-Tdata | 使用指定的地址作为数据段的起点 |
-Tdata | 使用指定的地址作为bss段的起点 |
很多命令参数我也是第一次发现.貌似-T开头是系统开发人员必备参数?
-rpath 如果是写汇编的库来给高级语言用的话基本就不用了.都是把汇编程序封装成静态或动态的库来用的.
编译器gcc
生成可执行程序就像这样
gcc -o ctest ctest.c
想当年刚接触linux就这么几行命令都不知道怎么敲呢.....
-c | 编译或者汇编代码,但是不进行连接 |
-S | 编译后停止,但是不进行汇编(也就是生成汇编代码) |
-o | 指定要使用的输出文件名(貌似不用也可以) |
-g | 生成调试信息(与gdb一起用) |
-O | 优化可执行代码(有3级别,除此还有-O2 -O3) |
-W | 设置编译器警告消息级别 |
-pedantic | 按照C标准发布强制性诊断清单 |
-I | 指定包含文件的目录 |
-L | 指定库文件的目录 |
-D | 预定义源代码中使用的宏(用宏来调试C/C++代码的时候用) |
-gp | 生成gprof制作简档要使用的额外代码 |
这里面的好几个之前都没注意.-pedantic貌似是个对学习语言很好的个指令参数.
GNU调试器gdb
通常都要跟编译器和汇编器一起联用,必须在生成可执行文件的时候加上相应的参数.
比如
gcc -gstabs -o ctest ctest.c
gdb ctest
gdb的参数没用过,主要还是用gdb内部的命令
break | 设置断点 |
watch | 设置监视变量,达到特定值的时候停止 |
info | 查看寄存器,堆栈和内存的信息 |
x | 检查内存位置 |
| 显示变量值 |
run | 在调试器内开始程序的执行 |
list | 列出指定的函数或者行 |
next | 执行程序中的下一条指令(不进入函数) |
step | 执行程序的下一条指令(进入函数) |
cont | 从停止的位置继续执行程序 |
until | 运行程序,直到打到指定的源代码行 |
用的比较多的就是break,watch,print,next,step,cont了.在汇编里面的话info用的也比较多的.
GNU的反汇编程序objdump
这个程序部只用于反汇编,由于命令很多,对于linux下都用开源软件,所以就只介绍一下反汇编命令 -d
gcc -c ctest.c
objdump -d ctest.c
这样就可以看ctest.s的程序了.不过汇编代码中的标识全部变成了逻辑地址的形式了.
GNU简档器程序 gprof
重要的东西出现了!!应该服务器开发的人都该知道这个吧..不过这个东西参数也很多....
参数主要分为3组:
1.输出格式参数
2.分析参数
3.杂项参数
格式参数
-A | 显示所有函数的源代码,或者值相爱你是指定函数的 |
-b | 不显示解释分析字段的详细输出 |
-C | 显示所有函数的总计数,或者只显示指定函数的 |
-i | 显示简档数据文件的摘要信息 |
-I | 指定查找源文件的搜索目录清单 |
-L | 显示源文件名的完整路径名称 |
-p | 显示所有函数的一般简档,或者只是显示指定函数的 |
-P | 不输出所有函数的一般简档,或者不显示指定函数的 |
-q | 显示调用图标分析 |
-Q | 不显示调用图表分析(貌似没用?) |
-Z | 不显示函数的总计数和被调用的次数 |
--function-reordering | 按照分析显示建议的函数的重排序 |
-w | 设置输出行的宽度 |
-x | 在函数之内显示被注解的源代码中的每一行 |
分析参数
-a | 不分析静态声明的函数的信息 |
-c | 分析程序中永远不会被调用的子函数的信息 |
-l | 按行分析 |
-m | 只分析被调用超过指定次数的函数 |
-n | 只分析指定的函数的时间 |
-N | 不分析指定的函数的时间 |
z | 分析所有函数,即使是从不被调用的那些 |
杂项
-d | 使gprof处于调试模式中,指定数字化的调试级别 |
-O | 指定简档数据文件的格式 |
-s | 使gprof只在简档数据文件中汇总数据 |
-v | 输出gprof的版本 |
使用如下:
gcc -o demo demo.c -pg
./demo 会在相同目录下生成gmon.out的文件.这是图表简档文件
gprof demo > gprof.txt 生成完整的报告输出到gprof文件中.txt不是必须的
这样基本就有了一个完整的linux下汇编开发环境了.
下一篇开始真正的开始写汇编程序了!