GNU的gcc提供了对汇编源码进行编码、连接的功能,其汇编语法为AT&,当然可以支持intel汇编语法。
本汇编程序的开发工具为gcc在window平台的开发工具,MinGW。
#这是一个汇编程序 .section .data .section .text .globl _start .def _start; .scl 2; .type 32; _start: pushl %ebp movl %esp,%ebp andl $-16,%esp movl $1,%eax leave ret |
as hello.s –o hello.o
ld hello.o –o hello.exe
hello
1).section .data
.section是一个分段指示符,.data表示是数据段。全局变量存此,本程序无全局变量故为空
2).section .text,表示代码段
3) globl _start ,指示代码段的入口函数,_start代表一个符号,在汇编中符号代表一个地址,如同c的数组名、变量名、函数名一样。汇编一般要_start表示入口函数,如c语言用main函数表示程序的入口执行函数。
4) def _start; .scl 2; .type 32;对入口函数_start进行说
5) pushl %ebp
movl %esp,%ebp
andl $-16,%esp
win32下的汇编程序的默认写法,表示程序地址按16的倍数对齐
6) movl $1,%eax 把1这个值赋给寄存器eax 。函数返回值通回是放在eax寄存器
7) leave
let
8)#表示行注释,相当于c的//
代表函数返回
as指令使用intel汇编指令示例如下:
as hello.s –o hello.o –msyntax=intel
工具 | 作用 | 示例 |
ar | 把对象文件进行归档,形成.a文件,相当于.lib文件 | ar –crs archine.a a1.o a2.o 意思是把a1.o与a2.o归档形成文档 |
as | 把汇编源程序编译成.o文件 | |
ld | 把.o程序进行连接 | |
c++filt | ||
gprof | 对exe程序性能进行统计 | gcc -o demo demo.c –pg
gprof demo |
nlmconv | ||
nm | 列出一个o文件的符合 | nm hello.o 结果输出汇编源程序定义的各种符号,如常量、标号、函数名 |
objcopy | copy与转换一个对象文件格式 | 如: objcopy hello.o -O elf32-i386 如win平台的o文件格式默认为pei-i386,为了让o文件能用readelf进行分析,可以进行格式转换 |
objdump | 显示信息从一个对象文件或exe文件 | ojbdump –dS hello.exe把这个exe进行反汇编 |
ranlib | 为一个归档文件.a生成索引 | ranlib archive.a |
readelf | 读一个elf格式的o文件 | readelf hello.o |
size | 得到程序四个区的大小 | size msvcrt.dll 得到这个dll文件四个区的大小 |
strings | 显示可打印的字符串 | 如: strings msvcrt.dll 通过这个指令可以看到dll中包含那些函数 |
strip | ||
windres | 编译ms的资源文件 |
评论