现在很多汇编的学习资料、途径和工具都是关于 Windows 下的,所以这里来介绍一下 macOS 上学习使用汇编需要的资料和工具。
为什么需要学习汇编(使用途径)
汇编是计算机的“魔法”,虽然做个只会高级语言的“战士”也可以,但是当给“武器”附魔之后,战斗力也会大大增加(当然也有“玩火自焚”的)。
在现代,学习汇编之后的使用途径有几种:
- 直接用汇编指令写程序的代码,然后使用汇编器(Assembler)汇编成程序(这种学习的过程中可能使用比较多,在实际情况下很少用,因为太复杂了)。
- 用在 C 语言代码中,提高性能和速度,或者实现一些特别的功能。例如 UNIX 和 Linux中的汇编代码就是为了提高运行速度,不然完全可以用纯 C 语言写出来;还有苹果不让开发者 iOS 平台获取 CPU 频率之后,一些开发者通过在 Objective-C 代码中使用汇编指令来推测频率。
- 能看懂反编译出来的内容(这种一般常规程序员用不到)。
不过在现在,汇编并不是编程的门槛,而是通往高手的必修课。但是新手还是建议先学会 C 语言再接触汇编(这里的学会是指能明白)。
相关资料推荐
在现在各种高级语言、脚本语言遍地开花的今天,汇编语言越来越不受欢迎,因为繁琐、复杂,学习成本极高。例如, Intel CPU 开发手册就有5000页(每次发新的 CPU 之后都会更新,或增或减)。
第一个推荐的是苹果官方的汇编指南:《Mac OS X Assembler Guide》,下载地址在这里。
这本指南包含了 Mac OS X 汇编器as
的使用,汇编指令和地址模式的介绍等内容。
需要注意的是,它不光包括了 Intel CPU 的汇编内容,还包括更早期的 Power PC 的汇编内容。
但是由于该指南最新版本是2005年的,Intel 的指令有了巨大的更新,例如 AVX 等。并且苹果也已经在转向自己的 M1 芯片了(有意思的是,OS X 的汇编器手册最新更新时间是2020年6月23日,而这就是 M1 更新的日子,不知道苹果会不会在稳定之后再次更新)。
第二个推荐的是 Intel 的 《Introduction to x64 Assembly》,这是一篇汇编快速入门。新手可以看看,干货浓度极高。
第三个是:Intel 的开发手册。
这个手册虽然很长,但是一个很不错的资料,而且更新频率很高,如果需要了解新的 Intel 指令,那么这就是必须要看的了。所以这篇属于经常需要翻阅的。当然如果想见识见识也可以看看。链接是:Intel 64 和 IA-32 处理器相关的文档
可以直接下载合订本当作存档,不过这样不方便阅读。(关于这个,曾经 Intel 可以免费提供纸质版,只要你发邮件提供地址即可,有不少人定,不过大多都垫了显示器或者吃灰了。现在 Intel 不提供这个福利了,挺可惜的)
第一卷是一些大致的介绍,以及 Intel CPU 发展历程和区别,如果是初学者可以瞅瞅;第二卷开始就是指令的介绍了。第2卷的日常使用率比较高,需要经常查阅。具体区别在之前的链接中的界面可以看到。
这里需要注意的是,虽然常说 Intel 挤牙膏,但是 Intel 几乎每一代都会有指令、寄存器的更新和更改。所以文档的更新频率比较高,如果你需要使用最新的指令,那么请及时更新自己存储的文档。
第四个是一组关于 ARM 汇编的文档。
首先因为 Mac 现在以及转向自研的 M1 芯片了,M1 芯片是 ARM 架构的。
其次因为 ARM 现在并不像 Intel 一样提供了汇编指南《ARM ® DeveloperSuite Assembler Guide
Version 1.2》(这篇指南最新的b版本是2001年的),而是分散开了。如果想入门,阅读这本2001年的指南即可。
如果想深入了解最新的指令,那么查看这里https://developer.arm.com/architectures/instruction-sets。
汇编器以及实用工具介绍
这里介绍一下汇编器以及可能用得到的实用工具们(包括编辑器)。
as:
Mac OS X 的汇编器,需要在“终端”中使用,类似于 Windows 的 masm。支持 Intel 处理器的汇编以及 Power PC 处理器的汇编。放在/usr/bin/as
目录下。在《Mac OS X Assembler Guide》中有使用方法的介绍。
clang:
Mac OS X 上,默认的 C、C++、Objective-C 编译器。如果在“终端”里使用命令cc
,那么会调用 clang,而不是 gcc。
Xcode:
苹果自己的 IDE,可以编写 C、C++、Objective-C和Swift语言的程序。可以利用 Xcode 来编写含有汇编代码的程序和 App。