这本教科书简要介绍了汇编语言编程。这个介绍之所以“温和”是因为它假设读者已经熟悉 C 或 C++ 编码。我们使用这些假定的知识向后过渡到低级 ISA(指令集架构)。
我们要强调一个非常尖锐的观点:
汇编语言没什么可怕的!如前所述,如果您已经熟悉 C(或 C 的派生语言,例如 C++),那么本书将从您已经了解的内容开始。
后面的章节将更深入地探讨 ARM V8 ISA 的角落和凹槽,适合那些希望掌握 64 位 ARM 处理器丰富指令集的人。
是的,绝对是。
汇编语言编程非常依赖于底层硬件架构。主机操作环境在确定汇编语言程序的构建方式方面发挥着巨大的作用。 “调用约定”是指如何调用函数以及如何传递参数。
最初,本书只教授 ARM LINUX 约定。然而,随着时间的推移,我们开发了一套宏,使编写在 MacOS 或 LINUX 上使用的代码变得更加容易。
此链接将指向它们的最新副本以及文档。还包括使编程变得更容易的宏。
本章提供了有关 Apple Silicon 汇编语言编程的一些附加信息。
您会注意到我们直接使用 C 运行时而不是进行操作系统系统调用。因此,例如,如果我们想调用write()
,我们就从汇编语言中调用write
。
此版本的系统调用write
是内置于 C 运行时 (CRT) 中的包装函数,它处理执行系统调用的较低级别细节。请参阅此处,了解这些包装函数内部实际发生的情况。
使用 CRT 包装器的好处是使用 CRT 包装器掩盖的发行版和体系结构之间存在差异。因此,当您使用包装器而不是直接进行系统调用的方法时,您的代码将更加可移植。
尽管 ARM 的设计值得称赞,但 ARM 的知识产权命名约定却很糟糕。在本书中,AARCH64 和 ARM V8 被视为 64 位 ARM 指令集架构 (ISA) 的同义词。
在 ARM 站点上找到文档非常困难,因为它们有如此多的版本,同一事物有如此多的名称,而且一般文档也如此之多。这真的会让人抓狂。
在文本中,我们将酌情提供密切相关的链接。
这是指向“a”主指令集页面的链接。
获取汇编语言开发工具非常简单 - 也许您已经拥有它们。从 Linux 终端使用apt
,如下所示:
sudo apt update
sudo apt install build-essential gdb
在 Macintosh 上键入:
xcode-select --install
进入航站楼并按照指示操作。请注意, gdb
已被lldb
取代,其差异足以让您哭泣。
那么您将需要您最喜欢的编辑器。我们自己使用vi
进行快速编辑,使用 Visual Studio Code 进行任何繁重的工作。
我们使用gcc
,C“编译器”。也可以使用g++
。在 Mac 上,也可以使用clang
。
这有什么意义......使用“编译器”来“编译”汇编语言?
好吧,要回答这个问题,我们必须明白“编译器”一词仅指构建序列中的一个步骤。我们所说的“编译器”实际上是一个保护伞,包括:
作用于任何#
预处理器命令(例如#include
的预处理器。这些命令不是 C 或 C++ 的一部分。相反,它们是预处理器的命令。
请注意,如果您的汇编语言文件以.S
(大写 S)结尾,则gcc
将调用 C 预处理器。如果您的文件以小写 s 或任何其他文件扩展名结尾,则可能会或可能不会调用它,具体取决于您的系统。
实际的编译器,其工作是将高级语言(例如 C 和 C++)转换为汇编语言。
汇编器,将汇编语言转换为尚未准备好执行的机器代码。
最后是链接器,它组合了潜在的许多中间机器代码文件(称为目标文件)、潜在的许多库文件(Windows 上静态链接的 .dll 和 Linux 上静态链接的 .a 文件)。链接器是该链中的最后一步。
这是解释此过程的视频。
我们直接使用 gcc 和 g++,因为它们是保护伞,可以自动执行上述步骤并自动与 CRT 链接。
假设您已在 C 文件 (main.c) 中实现了main()
,并且想要使用您编写的汇编语言文件 (asm.S)。它可以通过多种方式完成。
gcc main.c asm.S
这就是最小构建所需的全部内容。生成的程序将写入a.out
。生成的所有中间文件都将被删除。
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
以这种方式使用, .o
文件会保留在磁盘上。使用前面的方法, .o
文件将被删除,而您看不到它们。
假设main()
是用汇编语言实现的,并且main.s
是独立的,那么简单地:
gcc main.S
通常,您需要启用调试器gdb
或lldb
。这样做:
gcc -g main.S
如果没有-g
命令行选项,您的调试器可能无法正常运行。
重复一遍,如果您希望gcc
通过 C 预处理器运行您的代码(例如处理#include
),请使用大写 S 命名您的汇编语言源代码文件。因此,在 Linux 上:
gcc main.s
不会经过 C 预处理器,但是
gcc main.S
将要。
为了说明“编译器”是一个保护伞,使用 gcc 来“编译”程序会导致在 ARM 上运行的 Ubuntu 上调用以下命令:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
是 C 预处理器 - 它是一个通用工具,也可以被其他语言使用(例如 C++)。
cc1
是实际的编译器。
汇编器as
。
ld
是链接器。
你可以明白为什么我们在本书中默认使用伞命令。
我们首先提供所谓的从 C 和 C++ 到汇编语言的“桥接”。我们利用您已有的知识来学习新知识 - 这真是太酷了!
章 | 降价 | |
---|---|---|
0 | 启动 | 关联 |
1 | 你好世界 | 关联 |
2 | 如果语句 | 关联 |
3 | 循环 | |
3a | While 循环 | 关联 |
3b | For 循环 | 关联 |
3c | 实施继续 | 关联 |
3d | 实施中断 | 关联 |
4 | 间奏曲 | |
4a | 寄存器 | 关联 |
4b | 加载和存储 | 关联 |
4c | 更多关于ldr | 关联 |
4天 | 寄存器大小 | 关联 |
4e | 十六进制 | 关联 |
5 | switch | 关联 |
6 | 功能 | |
6a | 呼叫和返回 | 关联 |
6b | 传递参数 | 关联 |
6c | 调用一些常见C运行时函数的示例 | 关联 |
7 | FizzBuzz - 一个完整的程序 | 关联 |
8 | 结构体 | |
8a | 结盟 | 关联 |
8b | 定义 | 关联 |
8c | 使用 | 关联 |
8天 | 什么是“这个” | 关联 |
9 | const | 关联 |
浮点运算使用自己的指令和自己的寄存器组。因此,浮点运算在其各自的部分中进行了介绍:
章 | 降价 | |
---|---|---|
0 | 章节概述 | 关联 |
1 | 什么是浮点数? | 关联 |
2 | 寄存器 | 关联 |
3 | 截断和舍入 | 关联 |
4 | 文字 | 关联 |
5 | fmov | 关联 |
6 | 半精度浮点数 | 关联 |
7 | NEON SIMD 尚未编写 | 关联 |
一本关于汇编语言的书如果没有一点点的抨击会怎样呢?
章 | 降价 | |
---|---|---|
1 | 位字段 | |
1a | 没有位域 | 关联 |
1b | 带位域 | 关联 |
1c | 审查新描述的指令 | 关联 |
2 | 字节序 | 关联 |
在本节中,我们将介绍各种材料,包括我们关于调试的“世界著名讲座”。本次讲座受到多所高校的邀请。它面向使用 C、C++ 和汇编语言等语言的读者,但其中包含的一些课程适用于所有语言。
章 | 降价 | |
---|---|---|
1 | 苹果硅 | 关联 |
2 | Apple / Linux 融合 | 关联 |
3 | 可变参数函数 | 关联 |
4 | 底层:系统调用 | 关联 |
5 | 确定 C 函数的字符串文字长度 | 关联 |
6 | 从 Python 调用汇编语言 | 关联 |
7 | 原子操作 | 关联 |
8 | 跳转表 | 关联 |
9 | 精液 | ASM代码 |
10 | 自旋锁 | 关联 |
- | 调试讲座 | PPTX |
如上面所示,可以在此处找到宏套件。
这里有一些项目规范,可以为您不断提高的掌握能力提供挑战。以下是按字母顺序排列的非常简短的描述。
也许在解决这些问题之前,请先查看完整描述的 FIZZBUZZ 程序。
然后尝试将此作为您的第一个项目。加上一些空行和注释,它总共有 35 行。
DIRENT 项目演示了如何在汇编语言中使用复杂的struct
。
PI 项目演示了浮点指令。该程序将“向目标投掷飞镖”,通过跟踪“击中目标”的飞镖数量与“投掷”的飞镖总数来计算 PI 的近似值。
SINE 项目强调浮点数学和函数。
SNOW 项目使用 1970 年代的技术来制作简单的粒子系统动画。该项目展示了将复杂问题分解为更简单部分的合理设计过程。
WALKIES 呈现了一个可爱的小动画,演示了一些指针取消引用的循环。
Perry Kivolowitz 在计算机科学领域的职业生涯只有不到 50 年。他创办了超过 5 家公司,主要涉及硬件、图像处理和视觉效果(用于电影和电视)。 Perry 因其在《巴比伦 5》试播集《The Gathering》中的出色表现而获得艾美奖。后来,他与 SilhouetteFX, LLC 的同事一起获得了艾美奖工程奖。 SilhouetteFX 几乎用于所有重要的电影中,用于动态观察、绘画、跟踪、2D 到 3D 重建、合成等。
1996 年,佩里因其形状驱动变形和变形技术的发明而获得奥斯卡科学技术成就奖。 《阿甘正传》、《泰坦尼克号》和《星际之门》中的许多著名效果就是采用这种技术。
二二十三岁是佩里在大学教授计算机科学的第 19 个年头,在威斯康星大学麦迪逊分校教授十年,现在在迦太基学院教授 8 年多。
Perry 对汇编语言充满热情,曾在以下 ISA 工作过(按时间顺序排列):
尤尼真空1100
数字设备公司 PDP-11
数字设备公司 VAX-11
摩托罗拉 68000
以 AARCH64 开头的 ARM
谨将此作品献给我的妻子萨拉以及儿子伊恩和埃文。
Perry 创建了一个包含约 200 个编程项目的库,适用于 CS 1、CS 2、数据结构、网络、操作系统和计算机组织课程。如果计算机科学教科书(或其他计算机科学相关内容)的出版商有兴趣购买该图书馆,请联系我们。
另外,还可以看看 Get Off My L@wn,一本写给程序员的僵尸小说。
您没看错……精英程序员 Doug Handsman 退休后回到妻子 Ruth Ann 的故乡威斯康星州北部。然后,世界末日发生了。真糟糕。
评分为 4.3 分(满分 5 分),有超过 70 条评论,读起来很有趣,而且几乎不需要花钱。