X86汇编入门-语法 - 弦外之音

/ 0评 / 0

汇编其实有不同的语法的,主要有两种 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

MASMMicrosoft 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 汇编文件,objexe 都生成了。具体 ml.exe 如何使用,我也不太清楚。

不过由于 本书的目的 是讲的是 linux 下面的 AT&T 风格 的汇编,所以 windows 的汇编如何编译先不管。

AT&T会在寄存器名字前加%,在立即操作数前加$前缀,且源和目标操作数的顺序和Intel相反。


扩展知识:

1,遇到不懂的汇编指令,搜索 GAS + 关键词,或者 AT&T + 关键词,例如 AT&T .file , 搜索 .file 伪指令的用法

相关阅读:

  1. 《在 Win10 下如何用 VS2019 编译汇编及 win32 汇编程序》

由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注