# 零、简介

## 汇编语言

这本书是对 x64 汇编语言的介绍。这是几乎所有现代台式机和笔记本电脑都使用的语言。x64 是 AMD、英特尔、VIA 和其他 CPU 制造商使用的最新一代 x86 CPU 的通称。x64 汇编有陡峭的学习曲线，来自高级语言的概念很少适用。它是 x64 CPU 程序员可用的最强大的语言，但它通常不是最实用的语言。

汇编语言是中央处理器的语言，但是机器代码的数字被容易记住的助记符代替。而不是用纯十六进制编程，比如`83 C4 04`，程序员可以用一些更容易记忆和阅读的东西，比如`ADD ESP, 4`，给 ESP 加 4。人类可读的版本由一个叫做汇编程序的程序读取，然后通过一个叫做汇编的过程(类似于高级语言的编译)被翻译成机器代码。现代汇编语言是物理中央处理器和汇编程序共同作用的结果。现代汇编语言也有高级功能，如宏和用户定义的数据类型。

## 为什么学汇编？

很多高级语言(Java、C#、Python 等)。)有共同的特点。如果一个程序员熟悉其中的任何一个，那么他或她在几个星期的学习后会毫不费力地学会其他的。汇编语言很不一样；它与高级语言几乎没有什么共同之处。不同 CPU 架构的汇编语言往往没有什么共同点。例如，MIPS R4400 汇编语言与 x86 语言非常不同。没有复合语句。没有 if 语句，一直使用 goto 指令(`JMP`)。没有对象，也没有类型安全。程序员必须构建自己的循环结构，浮点和 int 没有区别。没有什么可以帮助程序员防止逻辑错误，执行指令和数据没有区别。汇编语言之间有许多不同之处。

我可以继续列举 x64 汇编语言与高级语言相比缺少的有用特性，但从某种意义上说，这意味着汇编语言的障碍更少。类型安全、预定义的调用约定以及将代码与数据分开都是限制。这些限制在程序集中不存在；唯一的限制是硬件本身施加的限制。如果机器有能力做某事，可以告诉它用自己的汇编语言来做。

一个法国人可能知道英语是他们的第二语言，他们可以被指示用英语做一项任务，但是如果任务太复杂，一些概念可能会在翻译中丢失。向法国人解释如何执行复杂任务的最好方法是用法语解释。同样，C++ 和其他高级语言也不是 CPU 的母语。计算机非常擅长用 C++ 接受指令，但是当你需要确切地解释如何做一些非常复杂的事情时，CPU 的母语是唯一的选择。

学习汇编语言的另一个重要原因是简单地理解 CPU。中央处理器与其汇编语言没有区别。这种语言被刻在中央处理器本身的硅片上。

## 目标受众

本书面向使用微软 Visual Studio 的开发人员。这是一个通用且非常强大的汇编语言 IDE。这本书的目标读者是对 C++ 有良好基础并且希望使用 Visual Studio IDE(专业版和快速版)对本机程序集进行编程的程序员。这些例子已经用 Visual Studio 和附带的汇编程序 ML64.exe(微软宏汇编程序 MASM 的 64 位版本)进行了测试。

掌握汇编语言编程知识也有助于程序员理解高级语言，如 Java 和 C#。这些语言被编译成虚拟机代码(Java 和 CIL 的 Java 字节码或的通用中间语言)。NET 语言)。虚拟机代码可以从。NET 可执行文件或动态链接库文件。当. NET 应用程序被另一个工具 ILAsm.exe 执行时，它会将 CIL 机器代码翻译成本机 x86 机器代码，然后由 CPU 执行。CIL 类似于一种汇编语言，对 x86 汇编的全面了解使得 CIL 的大部分代码都是可读的，尽管它们是不同的语言。这本书的重点是 C++，但这些信息同样适用于编程高级语言。

这本书是关于大多数台式机和笔记本电脑的汇编语言。几乎所有现代台式电脑都有基于 x86 架构的 64 位 CPU。传统的 32 位和 16 位处理器及其汇编语言将不会涉及任何细节。

MASM 使用英特尔语法，本书中的代码与美国电话电报公司汇编程序不兼容。大多数指令在其他流行的英特尔语法汇编器中是相同的，例如 YASM 和 NASM，但是每个汇编器的指令语法是不同的。