1.1 机器语言
既然要讲汇编语言就不能不提机器语言了,机器代码是由0和1组成的指令序列,计算机可以直接执行机器代码,因此用机器语言编写的程序执行速度快,既然这样,那为什么现在的程序员基本上不用机器语语言编写程序呢?下面举一个用机器语言编写的程序,大家就应该很容易明白了,下面这段代码是一个用机器语言写的程序的一部分,是在我的HP机器上写的:
1011001010100101001101001010010010 0110010010100100101001010101010001 0010100110100000111001010101010100
现在问大家:这段代码的功能是什么?相信大家都看不懂吧,此外若不小心把程序写成了下面这个程序,请你找出这个错误:
1011001010100101001101001010010010 0110010010100100101101010101010001 0010100110100000111001010101010100
你是不是有种欲哭无泪的感觉呢?这还只是一个非常小的代码段,这就如此麻烦了,要是来个上万甚至几十万行的机器代码,那还不得把人得弄死,这就暴露了机器语言晦涩难懂,难以修改维护的缺点。
此外,我前面特意强调了是在HP机器上编写的代码,这不是在为HP打广告。之所以强调这个是因为如果我现在把这个程序放到另外一台mac或者其它的电脑上,这段程序就不能运行了。程序员编写的程序是为大家服务的,对于完成同一功能的程序,总不能针对每一台电脑都编写一个版本吧。机器语言的第二个缺点就凸显出来了:可移植性差。
看看,机器语言有这么严重的缺陷,我看只有傻子才会用它编写程序吧,这就是机器语言几乎销声匿迹的原因了。
1.2 汇编语言
既然机器语言那么晦涩难懂,程序员在编写程序的时候需要记忆大量的机器指令且容易记错,给整个软件的行业的发展带来了障碍,但是人类的智慧是无限的,人们发明了汇编语言,汇编指令是机器指令的助记符,每一条汇编指令都有与之一一对应的机器指令,对于程序员来说这是个很大的福音,他们不需要再记那些枯燥的01序列了。
汇编语言的出现确实在很大程度上解放了程序员,但是我们需要知道的是,计算机只认识01序列,即机器指令,并不认识我们所写的汇编指令,要让计算机能够执行我们所写的汇编程序,必需存在一个“翻译”,能够将我们的汇编程序翻译为计算机能识别执行的机器码,这个翻译就是“编译器”。当然,在由汇编代码à机器码的转换过程中,并不仅仅只是编译器的功劳,还牵涉到链接器等等。下图是将汇编程序转换为可执行机器码的过程;这是一个极其复杂的过程,不在本文的讨论范围内,有兴趣的同学可以查阅相关资料。