汇编语言的基础知识

30 阅读2分钟

在第一门面向程序员的编程语言出现前,人们只能通过理解 CPU 指令的二进制表示,将程序以二进制数据方式刻录到存储(比如 ROM 或硬盘)上。 我们首先要把表达的执行指令翻译成二进制的比特数据,然后再把这些数据刻录到存储上。这个时候软件和硬件的边界还非常模糊,并不存在所谓软件工程师(或者叫“程序员”)这样的职业。写程序也并不是一个纯软件的行为,把程序刻录到存储上往往还涉及了硬件的电气操作。

为了解决编程效率的问题,汇编语言(和解释它的编译器)诞生了。汇编语言的编译器将汇编语言写的程序编译成为 CPU 指令序列,并将其保存到外置的存储设备(比如硬盘)上。汇编语言非常接近计算机的 CPU 指令,一条汇编指令基本上和 CPU 指令一一对应。

汇编语言的出现,让写程序(编程)成为一个纯软件行为(出现“程序员”这个分工的标志),人们可以反复修改程序,然后通过汇编编译器将其翻译成机器语言,并写入到外置的存储设备(比如硬盘)。并且,程序员可以按需执行该程序。

对 CPU 指令来说,函数只有地址没有名字。但从编程的角度,函数是机器指令的扩展,和机器指令需要用文本符号来助记一样,函数的名称也需要用文本符号来助记。

高级语言里面,流程控制的语法有很多,比如 goto、if .. else、for、while、until 等等。但是从汇编角度来说,只有两种基本的跳转指令:无条件跳转(jmp)和条件跳转 (je、jne)。同样,跳转的目标地址用文本符号(也就是“标签 -label”)有助于程序逻辑的表达,而不是让人把精力放在具体的指令跳转地址上。

总结来说,汇编从指令能力上来说,和机器指令并无二致,它只不过把人们从物理硬件地址中解脱出来,以便专注于程序逻辑的表达。

此文章为4月Day02学习笔记,内容来源于极客时间《03 | 汇编:编程语言的诞生 (geekbang.org)