公司为什么做网站seo专业培训费用
敲黑板:课程用的是 GNU 汇编器,macOS 和 Linux 已内置,本文的汇编语言的写法是 GNU 汇编器规定的写法。Windows 系统可安装 MinGW 或 Linux 虚拟机。
对于静态编译型语言,比如 C 语言和 Go 语言,编译器后端的任务就是生成汇编代码,然后再由汇编器生成机器码,生成的文件叫目标文件,最后再使用链接器就能生成可执行文件或库文件了。
就算像 JavaScript 这样的解释执行的语言,也要在运行时利用类似的机制生成机器码,以便调高执行的速度。Java 的字节码,在运行时通常也会通过 JIT 机制编译成机器码。而汇编语言是完成这些工作的基础。
对你来说,掌握汇编语言是十分有益的,因为哪怕掌握一小点儿汇编技能,就能应用到某项工作中,比如,在 C 语言里嵌入汇编,实现某个特殊功能;或者读懂某些底层类库或驱动程序的代码,因为它可能是用汇编写的。
本节先带你了解一下汇编语言,来个破冰之旅。然后在接下来的课程中再带你基于 AST 手工生成汇编代码,破除你对汇编代码的恐惧,了解编译期后端生成汇编代码的原理。
以后,当你看到高级语言的代码,以及 IR 时,就可以想象出来它对应的汇编代码是什么样子,实现从上层到底层认知的贯通。
了解汇编语言
机器语言都是 0101 的二进制的数据,不适合我们阅读。而汇编语言,简单来说,是可读性更好的机器语言,基本上每条指令都可以直接翻译成一条机器码。
跟你日常使用的高级语言相比,汇编语言的语法特别简单,但它要跟硬件(CPU 和内存)打交道,我们来体会一下。
计算机的处理器有很多不同的架构,比如 x86-64、ARM、Power 等,每种处理器的指令集都不相同,那也就意味着汇编语言不同。我们目前用的电脑,CPU 一般是 x86-64 架构,是 64 位机。(如不做特别说明,本课程都是以 x86-64 架构作为例子的)。
说了半天,汇编代码长什么样子呢?用 C 语言写的例子来生成一下汇编代码。
#include <stdio.h>
int main(int argc, char* argv[]){printf("Hello %s!\n", "Richard");return 0;
}
在 macOS 中输入下面的命令,其中的 -S 参数就是告诉编译器把源代码编译成汇编代码,而 -O2 参数告诉编译器进行 2 级优化,这样生成的汇编代码会短一些:
clang -S -O2 hello.c -o hello.s
或者:
gcc -S -O2 hello.c -o hello.s
生成的汇编代码是下面的样子:
.section __TEXT,__text,regular,pure_instructions.build_version macos, 10, 14 sdk_version 10, 14.globl _main ## -- Begin function main.p2align 4, 0x90
_main: ## @main.cfi_startproc
## %bb.0:pushq %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq %rsp, %rbp.cfi_def_cfa_register %rbpleaq L_.str(%rip), %rdileaq L_.str.1(%rip), %rsixorl %eax, %eaxcallq _printfxorl %eax, %eaxpopq %rbpretq.cfi_endproc## -- End function .section _