Linux汇编程序设计环境
- 所用的汇编器:GNU汇编器(称为gas)
- 所用的连接器:ld linker
检测是否安装gas:
GNU汇编器捆绑在binutils包中,即通过检查是否安装binutils包来检测是否安装gas:
- 基于RPM的linux版本:通过$ rpm -qa | grep binutils命令来检测
- 基于Debian包安装器的Linux版本通过$dpkg -l | grep binutils命令来检测
使用GNU汇编器
GNU汇编器在命令行可执行程序中称为as
使用的命令行参数:
- -a :指定输出中包含哪些清单
- -D:包含它用于向下兼容,但是被忽略了
- –defsym:在汇编源代码之前定义符号和值
- -f:快速汇编,跳过注释和空白
- –gstabs:包含每行源代码的体哦啊是信息
- –gastabs+:包含专门的gdb调试信息
- -I:指定搜索包含文件的目录
- -J:不警告带符号溢出
- -L:在符号表中保存本地符号
- -o:指定输出目标文件的名称
- -W:不显示警告信息
AT&T与Intel语法的主要区别
- AT&T使用$表示立即数,而Intel的立即数不需要界定
- AT&T在寄存器名称前加上前缀%,而Intel不用
- AT&T语法处理源和目标操作数时使用相反的顺序,例如:把十进制值4传送到EAX寄存器:movl $4, %eax
- AT&T在助记符后面使用一个单独的字符来引用操作中使用的数据长度,而Intel中数据长度被声明为单独的操作数。AT&T的指令 movl $test, %eax 等同于 Intel语法的 mov eax, dword ptr test
- 长调用和跳转使用不同语法定义段和偏移值。AT&T使用ljmp $section, $offset ,Intel语法使用jmp section:offset
运行一个汇编语言程序:
$ as -o test.o test.s-----------将汇编语言程序test.s转换成目标文件test.o
$ ld -o test test.o
./test
GNU编译器—gcc
使用gcc -S test.c 可将test.c文件进行汇编,可以再通过cat test.s显示汇编程序