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命令。
评论区