linux平台学x86汇编(三):相关开发工具

【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】

类似于其它高级语言,编写汇编语言,必须有一个开发环境,那么也就需要适当的工具了。搭建汇编语言至少应该有下面这些工具:汇编器、链接器、调试器。下下面看看在汇编语言开发环境中如何使用它们。

  • 汇编器

汇编器用于把汇编语言源代码转换为处理器指令码。选择的汇编器必须能够生成所在系统的处理器系列指令码。汇编语言源代码程序有3个部分:操作码助记符、数据段、命令。但是每种汇编器对于每个部分使用的格式是不同的,所以使用一种汇编器进行程序设计可能和使用另一种汇编器完全不同,汇编器之间最大的区别是汇编命令,一般选择可以简单地为目标环境创建指令码的汇编器。Intel
IA-32平台上一些常见的汇编器有MASM、NASM、GAS(GNU汇编器)、HLA。

  • 链接器

汇编器不像高级语言那样编译、链接一气呵成,需要一个手工操作把汇编目标代码和其它库连接在一起。

  • 调试器

调试器必须了解硬件平台的指令码集合,并且了解操作系统处理寄存器和内存的方法。

GNU汇编器时(gas)unix环境下最流行的汇编器,它可以为几种不同硬件平台汇编指令码的能力。本系列文章所有汇编范例都针对gas编写。

大多数linux发行版已经包含了gas汇编器,其和其它开发软件一起包含在GNU binutils包中。如下为笔者系统相关信息和查找到已安装的binutils包。

</pre><pre name="code" class="plain">$ uname -a
Linux localhost.localdomain 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 UTC 2013 i686 i686 i386 GNU/Linux
$ rpm -qa | grep binutils
binutils-2.20.51.0.2-5.36.el6.i686
binutils-devel-2.20.51.0.2-5.36.el6.i686
$ 

GUN汇编器时面向命令行的程序,所以运行时应该使用正确的命令行参数。其命令行可执行程序是“as”命令。其用法在命令行上查看其帮助即可。GNU链接器为命令“ld”,用于把目标代码文件链接为可执行文件或者库文件。

把一个汇编语言程序编译链接成可执行文件大致如下:

as -o test.o test.s
ld -o test test.o

GNU objdump 程序是binutils包中另一个对程序员非常有用的工具。程序员可以使用该命令查看目标文件中由编译器生成的指令码,他不仅能够显示汇编代码,而且能够显示生成的你是指令码。

在本系列文章中,我们使用linux环境进行开发,所以使用的工具很自然就是使用GNU的工具了,并且其是免费的。

时间: 2024-10-14 20:37:47

linux平台学x86汇编(三):相关开发工具的相关文章

linux平台学x86汇编(二十):汇编库的使用

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 汇编语言和C一样,可以通过使用库来简化阻止大量函数的目标文件的问题.GNU C编译器可以不在命令行中独立地包含每个独立地函数目标文件,它允许吧所有目标文件组合在单一存档文件中.在编译C程序时,要做的工作就是包含单一的目标库文件,在编译时,编译器可以从库文件中挑出所需的正确目标文件.在库文件中,经常按照应用程序类型或者函数类型把函数分组在一起,单一应用程序项目可以使用多个库文件

linux平台学x86汇编(四):从“hello world!”开始

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 汇编语言程序由定义好的段构成,每个段有各自的目的.三个最常用的的段如下:数据段.bss段.文本段.文本段是可执行程序内声明指令码的地方,所有汇编程序都必须有文本段,数据段和bss段是可选的,但是在程序中经常使用.数据段声明带有初始值的变量,bss段声明使用0值初始化的数据元素,这些元素常用作汇编程序的缓冲区.下图为汇编语言程序的布局. GNU汇编器使用.section命令语句

linux平台学x86汇编(十九):C语言中调用汇编函数

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 除了内联汇编以外,还有一种途径可以把汇编代码整合到C/C++语言中,C/C++语言可以直接调用汇编函数,把输入值传递给函数,然后从函数获得输出值. 如果希望汇编语言函数和C/C++程序一起工作,就必须显示地遵守C样式的函数格式,也就是说所有输入变量都必须从堆栈读取,并且大多数输入值都返回到EAX嫁寄存器中.在汇编函数代码中,C样式函数对于可以修改哪些寄存器和函数必须保留哪些寄

linux平台学x86汇编(十五):使用命令行参数

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在高级语言中,程序在命令行上启动时常常带一个或多个参数,在汇编语言中也可以实现这一特性.在实现这一特性之前,我们先了解一下linux如何从命令行执行程序. 每一个应用程序开始执行时,系统都会为该程序分配一块内存区域,并且每个程序都分配相同的虚拟内存地址.虚拟内存地址由操作系统映射到物理内存地址.在Linux中,程序的虚拟内存地址是从0x80480000开始,到地址0xbfff

linux平台学x86汇编(十七):在汇编中使用linux系统调用

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在前面章节我们已经看到,启动系统调用需要使用INT指令.linux系统调用位于中断0x80,执行INT指令时,所有操作转移到内核中的系统调用处理程序,完成后执行转移到INT指令之后的下一条指令. linux的系统调用在如下文件(32位系统)可以查看: $ cat /usr/include/asm/unistd_32.h #ifndef _ASM_X86_UNISTD_32_H

linux平台学x86汇编(五):使用gdb调试汇编程序

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 正如C语言一样,编写所有语言程序一样会出现一些一些错误,发生错误时,我们可以使用调试器一步一步运行程序以监视数据是如何被处理的.本节使用GNU调试器检查上一节hello程序,监视处理过程中寄存器和内存的值的变化.要调试汇编语言程序,在编译时,需要使用-gstabs参数重新汇编源代码,使用了该参数编译出来的可执行文件要比之前稍大一些,因为添加了附加信息.上一节程序不使用-gst

linux平台学x86汇编(六):数据的传送

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 前面讲了定义数据元素,既然定义了数据元素,那么就需要知道如何处理这些数据元素.数据元素位于内存中,并且处理器很多指令要使用寄存器,所以处理数据元素的第一个步骤就是在内存和寄存器之间传送它们.数据传送指令为mov,其为汇编语言中最常用的指令之一. mov指令的基本格式如下: movx source, dest 其中source和dest的值可以是内存地址.存储在内存中的数值.指

linux平台学x86汇编(一):现代计算机结构组成与工作过程

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 现代计算机计算过程通常是把用户书写并送入计算机内的高级语言程序翻译成机器能识别的语言程序,再通过机器自动运行该语言程序计算出结果并输出. 但在早期没有高级语言的时候,用户是直接编写机器语言,直接在机器执行.向编写这种只由0.1构成的二进制代码,对程序员的要求非常高,需要熟悉其所使用计算机的硬件机器和指令系统,这样编写程序难度很大,并且操作过程复杂易出错. 到了20世纪50年代

linux平台学x86汇编(二):处理器指令码及IA-32平台了解

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在计算机操作的最底层,所有计算机处理器都按照制造厂商在处理器内部定义的二进制代码来操作数据,这些代码定义了处理器应该利用程序员提供的数据完成相应的功能,这些预置的代码被称为指令码.不同类型的处理器的指令码是不一样的,但处理指令码的方式是类似的. 当计算机处理器芯片运行时,他会读取存储在内存中的指令码,每个指令码包含不同长度字节的信息,这些信息指示处理器完成特定任务.每条指令码