侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux as命令教程:如何使用as命令编译汇编代码(附实例详解和注意事项)

Linux as命令介绍

as命令是GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。as命令是二进制工具集GNU Binutils的一员,它可以与其他的GNU工具,如ld、objdump、objcopy等配合使用,来进行程序的编译、链接、调试等工作。as命令可以将汇编代码编译为二进制代码,也可以将二进制代码反汇编为汇编代码。

Linux as命令适用的Linux版本

as命令可以在大多数的Linux发行版中使用,但是不同的Linux版本可能会有不同的as命令版本,因此可能会有一些细微的差别。例如,CentOS 7和CentOS 8的as命令版本分别是2.27和2.30,它们支持的处理器类型和选项可能会有所不同。如果你想查看你的Linux系统中的as命令版本,你可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as --version
GNU assembler (GNU Binutils) 2.30
...

如果你的Linux系统中没有安装as命令,你可以使用相应的包管理工具来安装它。例如,如果你使用的是CentOS系统,你可以使用以下命令来安装as命令:

[linux@bashcommandnotfound.cn ~]$ sudo yum install binutils

如果你使用的是Ubuntu系统,你可以使用以下命令来安装as命令:

[linux@bashcommandnotfound.cn ~]$ sudo apt install binutils

Linux as命令的基本语法

as命令的基本语法格式如下:

as [OPTIONS] --|FILES

其中,OPTIONS表示一些可选的参数,用来控制as命令的行为,例如指定输出文件的名字、生成调试信息、显示帮助信息等。FILES表示要编译的汇编文件的名字,如果没有指定文件名,as命令会从标准输入读取汇编代码。如果使用了--符号,as命令会忽略后面的所有选项,只将它们视为文件名。

Linux as命令的常用选项或参数说明

as命令有很多的选项或参数,可以用来控制as命令的行为,例如指定输出文件的名字、生成调试信息、显示帮助信息等。这里我们只介绍一些常用的选项或参数,如果你想查看所有的选项或参数,你可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as --help

以下是一些常用的选项或参数的说明:

选项或参数说明
-a [cdghlmns]开关列表。以下选项可以进行组合;如果使用=FILE选项,必须是最后一个。默认地,-a 等于 -ahls。-ac:忽略失败条件;-ad:忽略调试指令;-ah:包括高级源;-al:包括装配;-am:包括宏扩展;-an:忽略形式处理;-as:包括符号;=FILE:指定列出文件的名字
-f表示 fast,跳过空白和注释预处理
-g, --gen-debug产生调试信息
-I DIR将目录 DIR 加入到指令 .include 的搜索列表
-J符号溢出不警告
-L, --keep-locals在符号表中保留本地符号
-o OBJFILE指定要生成的目标文件
-R将数据段折叠到代码段
--statistics打印汇编所用的最大空间和总时间
-v, --version打印版本信息不退出
--version打印版本信息并退出
-W, --no-warn不显示告警信息
--fatal-warnings将告警视为错误
--warn显示告警或将告警视为错误
-Z产生目标文件即使发生错误
--从标准输入读取或由文件指定汇编代码

Linux as命令的实例

下面我们给出一些as命令的实例,来演示如何使用as命令来编译汇编代码。

实例1:将汇编文件编译为目标文件

假设我们有一个汇编文件 test.s,它的内容如下:

.section .data
msg: .ascii "Hello, world!\n"
len = . - msg

.section .text
.globl _start
_start:
    mov $4, %eax
    mov $1, %ebx
    mov $msg, %ecx
    mov $len, %edx
    int $0x80
    mov $1, %eax
    mov $0, %ebx
    int $0x80

这是一个简单的汇编程序,它的功能是在屏幕上打印出"Hello, world!"。我们可以使用以下命令来将它编译为目标文件 test.o:

[linux@bashcommandnotfound.cn ~]$ as test.s -o test.o

如果没有出现任何错误或告警,我们就可以使用objdump命令来查看目标文件的内容:

[linux@bashcommandnotfound.cn ~]$ objdump -d test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_start>:
   0:   b8 04 00 00 00          mov    $0x4,%eax
   5:   bb 01 00 00 00          mov    $0x1,%ebx
   a:   b9 00 00 00 00          mov    $0x0,%ecx
   f:   ba 0e 00 00 00          mov    $0xe,%edx
  14:   cd 80                   int    $0x80
  16:   b8 01 00 00 00          mov    $0x1,%eax
  1b:   bb 00 00 00 00          mov    $0x0,%ebx
  20:   cd 80                   int    $0x80

我们可以看到,目标文件中包含了我们的汇编代码对应的二进制指令。

实例2:将目标文件反汇编为汇编文件

如果我们想要将一个目标文件反汇编为汇编文件,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as -o test.s test.o

这样,我们就可以得到一个汇编文件 test.s,它的内容如下:

.file   "test.o"
.text
.globl _start
.type   _start, @function
_start:
.LFB0:
    .cfi_startproc
    movl    $4, %eax
    movl    $1, %ebx
    movl    $0, %ecx
    movl
...

实例3:指定输出文件的名字

如果我们想要指定输出文件的名字,而不是使用默认的文件名,我们可以使用-o选项来指定。例如,如果我们想要将汇编文件 test.s 编译为目标文件 hello.o,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as test.s -o hello.o

这样,我们就可以得到一个名为 hello.o 的目标文件。

实例4:生成调试信息

如果我们想要生成调试信息,以便于后续的调试工作,我们可以使用-g或--gen-debug选项来指定。例如,如果我们想要将汇编文件 test.s 编译为目标文件 test.o,并生成调试信息,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as test.s -o test.o -g

这样,我们就可以使用objdump命令来查看目标文件的内容,并发现它包含了一些调试信息,如下所示:

[linux@bashcommandnotfound.cn ~]$ objdump -d test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_start>:
   0:   b8 04 00 00 00          mov    $0x4,%eax
                        0: R_X86_64_32S .debug_info+0x0000000000000000
   5:   bb 01 00 00 00          mov    $0x1,%ebx
                        5: R_X86_64_32S .debug_info+0x0000000000000000
   a:   b9 00 00 00 00          mov    $0x0,%ecx
                        a: R_X86_64_32S .debug_info+0x0000000000000000
   f:   ba 0e 00 00 00          mov    $0xe,%edx
                        f: R_X86_64_32S .debug_info+0x0000000000000000
  14:   cd 80                   int    $0x80
  16:   b8 01 00 00 00          mov    $0x1,%eax
                        16: R_X86_64_32S .debug_info+0x0000000000000000
  1b:   bb 00 00 00 00          mov    $0x0,%ebx
                        1b: R_X86_64_32S .debug_info+0x0000000000000000
  20:   cd 80                   int    $0x80

我们可以看到,目标文件中包含了一些调试信息的引用,它们的格式为R_X86_64_32S .debug_info+0x0000000000000000。这些调试信息可以帮助我们在调试器中跟踪汇编代码的执行过程。

实例5:将数据段折叠到代码段

如果我们想要将数据段折叠到代码段,以减少目标文件的大小,我们可以使用-R选项来指定。例如,如果我们想要将汇编文件 test.s 编译为目标文件 test.o,并将数据段折叠到代码段,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ as test.s -o test.o -R

这样,我们就可以使用objdump命令来查看目标文件的内容,并发现它只有一个代码段,而没有数据段,如下所示:

[linux@bashcommandnotfound.cn ~]$ objdump -d test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <msg>:
   0:   48 65 6c 6c             rex.W prefix %fs:0x6c(%rsi)
   4:   6f                      outsl  %ds:(%rsi),(%dx)
   5:   2c 20                   sub    $0x20,%al
   7:   77 6f                   ja     78 <msg+0x78>
   9:   72 6c                   jb     77 <msg+0x77>
   b:   64 21 0a                and    %ecx,%fs:(%rdx)
   e:   00 00                   add    %al,(%rax)

0000000000000010 <len>:
  10:   0e                      (bad)
  11:   00 00                   add    %al,(%rax)

0000000000000013 <_start>:
  13:   b8 04 00 00 00          mov    $0x4,%eax
  18:   bb 01 00 00 00          mov    $0x1,%ebx
  1d:   b9 00 00 00 00          mov    $0x0,%ecx
  22:   ba 0e 00 00 00          mov    $0xe,%edx
  27:   cd 80                   int    $0x80
  29:   b8 01 00 00 00          mov    $0x1,%eax
  2e:   bb 00 00 00 00          mov    $0x0,%ebx
  33:   cd 80                   int    $0x80

我们可以看到,目标文件中只有一个.text段,它包含了我们的数据段和代码段的内容。这样,我们可以节省一些空间,但是也可能会增加一些运行时的开销。

Linux as命令的注意事项

  • as命令是一个汇编语言编译器,它不是一个完整的编译器,它只能将汇编代码编译为目标文件,而不能生成可执行文件。如果我们想要生成可执行文件,我们还需要使用其他的工具,如ld、gcc等,来进行链接和其他的工作。
  • as命令支持多种不同类型的处理器,它可以根据汇编代码中的指令来自动判断处理器的类型,也可以使用-m选项来指定处理器的类型。例如,如果我们想要使用as命令来编译一个适用于ARM处理器的汇编文件,我们可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ as -marm test.s -o test.o

这样,我们就可以指定as命令使用ARM模式来编译汇编文件。

  • as命令的语法和选项可能会随着版本的变化而有所不同,因此在使用as命令时,我们需要注意查看as命令的版本和文档,以避免出现一些错误或不兼容的情况。我们可以使用以下命令来查看as命令的版本和文档:
[linux@bashcommandnotfound.cn ~]$ as --version
[linux@bashcommandnotfound.cn ~]$ man as
  • 如果我们在使用as命令时,遇到了bash: as: command not found的错误,说明我们的Linux系统中没有安装as命令,我们需要使用相应的包管理工具来安装它。例如,如果我们使用的是CentOS系统,我们可以使用上面命令来安装as命令。
0

评论区