汇编其实有不同的语法的,主要有两种 Intel 的 和 AT&T 的。应该是两个公司为了各自利益 搞了两种汇编语法出来。
虽然语法不同,但是他们用的是同一种CPU指令集。
AT&T 风格 主要是GNU使用的,也就是给 linux
用的。汇编器主要是GAS,也就是 linux
环境中的 as
命令,as
命令就是把 AT&T风格 的汇编代码翻译成 CPU指令。下面展示 一下 在 linux
环境 ,as
汇编器如何使用。
int main() {
int a = 1;
a = a + 1;
return 0;
}
上面是 C 语言代码,执行命令 gcc -S main.c
,把 C 语言代码 翻译成 AT&T 风格的汇编,如下:。
现在 就到 as
命令出场的时候了,执行 as -o main.o main.s
就可以把 汇编翻译成 二进制指令。
as -o main.o main.s
一般很少这样用,通常用的是 gcc -o main.o main.c
,直接把 C 代码翻译成 二进制指令。但是实际上,gcc
里面调的就是 as
命令。只不过为了易用性,gcc
集成了很多功能。看起来像这样,gcc 这个可执行文件 它即是 编译器(能把 C 代码编译成汇编就叫 编译器),又是 汇编器 (能把 汇编代码编译成机器指令就叫 汇编器),gcc 还是 链接器 (能把多个 .o 文件链接 生成可执行文件就是链接器)。
最后 再 执行 gcc -o main main.o
链接生成可执行文件,全部命令如下:
# C代码翻译成汇编
gcc -S main.c
# 汇编翻译成二进制指令
as -o main.o main.s
# 链接生成可执行文件
gcc -o main main.o
Intel 风格 主要是 windows 使用的,主要汇编器有 MASM (ml.exe)、NASM。
MASM 是 Microsoft Macro Assembler 的缩写,它是 微软 为 x86 微处理器 家族,所写的一套宏汇编器。
装个 vs2019, 里面的 ml.exe
就是 MASM 汇编器。下面展示 一下 在 windows
环境 ,ml.exe
汇编器如何使用。
int main() {
int a = 1;
a = a + 1;
return 0;
}
在 windows CMD 里面手动编译 C代码,需要做以下准备工作,不让会提示找不到 LIBCMT.lib
库之类的错误。
上面这个错误是因为,我是直接打开命令行的,而 cl.exe 是 vs2019 软件的命令,需要继承 vs2019 的环境变量,先找到 x64 Native Tools Command Prompt for VS 2019
,如图,点击这个 打开命令行 才能继承 vs2019 的环境变量,编译才不会报错。
正确打开命令行窗口之后,执行 cl.exe /Fa main.c
,把 C 语言代码 翻译成 intel 风格的汇编,如下:
可以看到 cl.exe
生成的汇编更贴心,有之前的C代码对照。
cl.exe /Fa main.c
命令不止 生成了 asm
汇编文件,obj
,exe
都生成了。具体 ml.exe
如何使用,我也不太清楚。
不过由于 本书的目的 是讲的是 linux
下面的 AT&T 风格 的汇编,所以 windows
的汇编如何编译先不管。
AT&T会在寄存器名字前加%,在立即操作数前加$前缀,且源和目标操作数的顺序和Intel相反。
扩展知识:
1,遇到不懂的汇编指令,搜索 GAS + 关键词,或者 AT&T + 关键词,例如 AT&T .file
, 搜索 .file
伪指令的用法
相关阅读:
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。