《程序是怎样跑起来的》第十章
本章主要讲的是通过汇编语言认识程序的真面目。我感觉本章难度比较大,是最近看这几章以来最难的一章。汇编语言和本机代码是一一对应的,在我们看来,本机代码就是一串数字,直接用数字来编写程序,无异于写天书,于是我们就想了一个办法,为每个本机代码的指令分配一个英文缩写来表示其功能,例如把32位数据进行加法运算的本机代码称为addl,把进行比较的本机代码称为acmpl,这些编写都称为助记符使用助记符的编程语言,就称为汇编语言,但是它和本机代码来说是等价的。即使是用汇编语言编写的源代码,最终也必须转换成本机代码才能运行,用来完成这种转换的程序,称为汇编器这个转换过程,称为汇编再将源代码转换成本机代码,这一点上可以说汇编器和编译器的功能是相同的,用汇编编语言编写的源代码和本机代码是一一对应的,因此我们也可以将本机代码反过来转换成汇编语言的源代码,用这种反向转换功能的程序称为反汇编器,这种反向转换的过程称为反汇编。
汇编语言源代码的指令分为两种,一种是会被转换成本机代码的一般指令。另一种是专门针对汇编器的伪指令,伪指令负责告诉汇编器程序的结构和汇编的方法,因此也称为汇编程序指令。在汇编语言中,每一行都表示CPU要执行的一个指令。汇编语言指令的语法是操作码,操作数,其中操作码表示指定的动作操作数,表示指定的操作对象。如果我们将操作码类比为谓语动词,将操作数类比为宾语,就会发现他和英语的祈使句的语法是相同的。我们可以使用哪些操作码取决于CPU的类型。
在基代码需要加载到内存后,运行本机代码中指令和数据都存在内存中,当程序运行时,CPU会从内存中读取指令和数据,并将其存入CPU内部的计算器中进行,最后将结果写回内存。寄存器是CPU内部的存储空间,但是寄存器的功能并不仅限于存储指令和数据,寄存器还可以参与运算。用于向寄存器和内存存放数据的movl指令,可以说是最常用的指令movl指令有两个操作数,分别表示数据取出和存放的目标位置,操作数可以是数值标签,寄存器名,我们也可以在他们的左右两边加上圆括号来表示。C语言中的变量分为两种,在函数外部声明的变量称为全局变量,在函数内部声明的变量称为局部变量,全局变量可以,在程序的所有函数中,访问而局部变量只能在声明它的函数中访问。条件分支也是通过比较指令和跳转指令来实现的。