Linux下的汇编语言之汇编工具

运维 系统运维
汇编语言是基本的语言之一,他的明显优势是速度快,可以直接对硬件进行操作。Linux下如何使用汇编语言,语法格式有哪些?需要使用哪些开发工具?本文将会为大家详细道来。

      作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,***限度地发挥硬件的性能。

第二课时:Linux 汇编工具

  Linux 平台下的汇编工具虽然种类很多,但同 DOS/Windows 一样,最基本的仍然是汇编器、连接器和调试器。

  1.汇编器

  汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台

汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序:

  [xiaowp@gary code]$ as -o hello.o hello.s

  Linux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf

、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是 Intel 汇编语法,可以用来编译用 Intel

语法格式编写的汇编程序:

  [xiaowp@gary code]$ nasm -f elf hello.asm

  2.链接器

  由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一

个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,

它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:

  [xiaowp@gary code]$ ld -s -o hello hello.o

  3.调试器

  有人说程序不是编出来而是调出来的,足见调试在软件开发中的重要作用,在用汇编语言编写程序时尤其如此。Linux 下调试汇编代码既可以用

GDB、DDD 这类通用的调试器,也可以使用专门用来调试汇编代码的 ALD(Assembly Language Debugger)。

  从调试的角度来看,使用 GAS 的好处是可以在生成的目标代码中包含符号表(symbol table),这样就可以使用 GDB 和 DDD 来进行源码级的调试

了。要在生成的可执行程序中包含符号表,可以采用下面的方式进行编译和链接:

  [xiaowp@gary code]$ as --gstabs -o hello.o hello.s

  [xiaowp@gary code]$ ld -o hello hello.o

  执行 as 命令时带上参数 --gstabs 可以告诉汇编器在生成的目标代码中加上符号表,同时需要注意的是,在用 ld 命令进行链接时不要加上 -s

参数,否则目标代码中的符号表在链接时将被删去。

  在 GDB 和 DDD 中调试汇编代码和调试 C 语言代码是一样的,你可以通过设置断点来中断程序的运行,查看变量和寄存器的当前值,并可以对代

码进行单步跟踪。图1 是在 DDD 中调试汇编代码时的情景: 

Linux/汇编语言


  图1 用 DDD 中调试汇编程序。汇编程序员通常面对的都是一些比较苛刻的软硬件环境,短小精悍的ALD可能更能符合实际的需要,因此下面主要介绍一下如何用ALD来调试汇编程

序。首先在命令行方式下执行ald命令来启动调试器,该命令的参数是将要被调试的可执行程序:

  [xiaowp@gary doc]$ ald hello

  Assembly Language Debugger 0.1.3

  Copyright (C) 2000-2002 Patrick Alken

  hello: ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)

  Loading debugging symbols...(15 symbols loaded)

  ald>

  当 ALD 的提示符出现之后,用 disassemble 命令对代码段进行反汇编:

  ald> disassemble -s .text

  Disassembling section .text (0x08048074 - 0x08048096)

  08048074 BA0F000000 mov edx, 0xf

  08048079 B998900408 mov ecx, 0x8049098

  0804807E BB01000000 mov ebx, 0x1

  08048083 B804000000 mov eax, 0x4

  08048088 CD80 int 0x80

  0804808A BB00000000 mov ebx, 0x0

  0804808F B801000000 mov eax, 0x1

  08048094 CD80 int 0x80

  上述输出信息的***列是指令对应的地址码,利用它可以设置在程序执行时的断点:

  ald> break 0x08048088

  Breakpoint 1 set for 0x08048088

  断点设置好后,使用 run 命令开始执行程序。ALD 在遇到断点时将自动暂停程序的运行,同时会显示所有寄存器的当前值:

  ald> run

  Starting program: hello

  Breakpoint 1 encountered at 0x08048088

  eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000F

  esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

  ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000

  ss = 0x0000002B cs = 0x00000023 eip = 0x08048088 eflags = 0x00000246

  Flags: PF ZF IF

  08048088 CD80 int 0x80

  如果需要对汇编代码进行单步调试,可以使用 next 命令:

  ald> next

  Hello, world!

  eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000F

  esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

  ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000

  ss = 0x0000002B cs = 0x00000023 eip = 0x0804808F eflags = 0x00000346

  Flags: PF ZF TF IF

  0804808F B801000000 mov eax, 0x1

  若想获得 ALD 支持的所有调试命令的详细列表,可以使用 help 命令:

  ald> help

  Commands may be abbreviated.

  If a blank command is entered, the last command is repeated.

  Type `help ' for more specific information on .

  General commands

  attach clear continue detach disassemble

  enter examine file help load

  next quit register run set

  step unload window write

  Breakpoint related commands

  break delete disable enable ignore

  lbreak tbreak

  Linux操作系统是用C语言编写的,汇编只在必要的时候才被人们想到,但它却是减少代码尺寸和优化代码性能的一种非常重要的手段,特别是在与

硬件直接交互的时候,汇编可以说是***的选择。Linux提供了非常优秀的工具来支持汇编程序的开发,使用GCC的内联汇编能够充分地发挥C语言和汇

编语言各自的优点。
 

【编辑推荐】

  1. 2.3 用汇编语言编写程序
  2. 术语汇编 基本CSS滤镜概述
  3. 琢石成器—Windows环境下32位汇编语言程序设计
  4. 3.1.3 as86汇编语言程序的编译和链接
  5. 3.1.2 as86汇编语言程序
  6. 3.1.1 as86汇编语言语法
  7. 3.2.6 as汇编命令

 

责任编辑:zhaolei 来源: 网络转载
相关推荐

2011-01-14 14:39:32

Linux汇编语言

2011-01-14 14:15:11

Linux汇编语言

2011-01-14 14:22:50

Linux汇编语言

2011-01-14 13:44:45

Linux汇编语言

2012-02-09 09:00:54

汇编语言

2021-03-25 13:05:56

网络安全寄存器汇编语言

2010-11-09 09:51:52

汇编语言

2021-06-11 10:02:39

语言编程开发

2018-01-11 14:58:40

2011-01-04 17:08:10

汇编语言

2022-10-31 14:02:24

汇编语言神经网络

2023-11-23 08:25:40

开发人员SmaliAndroid

2017-01-12 22:36:30

2011-07-21 09:59:26

JavaScript

2023-06-01 16:27:34

汇编语言函数

2022-03-25 21:57:49

汇编Go语言

2010-07-13 10:21:19

2020-12-18 08:49:11

相对跳转绝对跳转指令

2010-08-10 10:32:02

Flex语言

2010-06-10 18:27:00

UML语言
点赞
收藏

51CTO技术栈公众号