Welcome

首页 / 软件开发 / 汇编语言 / 计算机系统原理(十三) 汇编语言简介

计算机系统原理(十三) 汇编语言简介2014-08-22

引言

本系列拖了蛮久了,主要是因为LZ写的时候其实刚看到第二章,因此这一段时间快速看了下第三章,并花了点时间沉淀了一下,这才耽误了下来。

本文是3.X系列的第一篇,也是汇编世界的开篇。LZ一直在想如何能让这一系列稍微变得有趣一些,因为第二章实在是太枯燥了,连LZ都觉得无聊至极,不过LZ竟然鬼使神差的把课后题做了不少。汇编这一部分相对而言会好很多,尽管它依然不是我们熟悉的编程语言,但是终归还是语言,而不再是我们几乎不打交道的0和1。

为何要学习汇编语言

对于大部分猿友来说,平时写的都是一些高级程序设计语言,是计算机领域的诸多大神,经过几层的封装才让我们享有了这样的待遇。这样一来,我们在平时的开发过程中,可以省去很多底层的麻烦。试想一下,倘若在你写一个方法的时候,你还需要去操心哪些变量需要放在寄存器,哪些变量放在主存,放在寄存器的话又该放在哪一个里面,放在主存的话又该放在那个内存区域等等这一类底层的问题,以及还要去记各种各样的寄存器名称和它们的作用等等诸如此类的事,你是否会崩溃呢。

因此这不难看出,高级语言给我们带来了很多便捷,但是事情总不是十全十美的,这样所带来的便捷也同时引来了一些问题。这是因为我们看到的代码,在实际执行它们的时候,可能已经面目全非了,所以很多时候会造成一些莫名其妙的问题发生。

举一个小例子,LZ曾经在群里问过类似的问题,这次LZ写一个小程序,各位学过Java的猿友来看看这个程序的结果。

public class Main{public static void main(String[] args){Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);}}
相信有不少人看不出来这个程序的问题在哪,觉得应该输出两个true就对了。可是这个程序的结果却是一个true和一个false,如果哪位猿友不信的话可以自己试一下。至于原因是什么,各位有兴趣的可以去研究下Java的自动拆装箱,另外再看一下Integer对象的valueOf方法缓存的范围,答案就会自动揭晓。

产生这个问题的根本原因,其实还是因为编译器给开发者蒙上了一层迷雾,导致一些开发人员只知其然,而不知其所以然,他们根本不清楚自己写出来的程序,实际上到底是如何运行的。这样的一层迷雾注定会降低开发者的水平,所以为了提高自己,我们有必要揭开这层迷雾。对于C/C++的开发者来讲,揭开这层迷雾其实就是了解汇编语言的过程。

汇编语言对于C/C++程序猿来讲,就像class文件对于Java程序猿是一样的,因为它们都是编译器处理后的产物,我们可以从下图当中简单的了解一下两者的关联。

这个图中应该看起来还算比较清晰,其实LZ说了这么多,只是想说一件事,那就是了解汇编语言的知识,对我们平时的开发有着不可忽视的好处,尤其是对于从事C/C++的开发者来说,好处更是无穷无尽的。

可能会有猿友觉得,LZ是一个靠Java吃饭的家伙,了解汇编语言是不是有点多此一举了,毕竟Java语言离汇编还是有点太远了吧。毕竟Java要先编译成class文件,然后交给虚拟机的执行引擎,而虚拟机的执行引擎则是由C/C++来实现的,C/C++又需要经过预处理和GCC编译器的编译才能最终成为汇编语言。这猛地一看,Java确实离汇编语言太远了。

可是LZ想说的是,无论你处于什么样的一个岗位当中,只要你做的事是指挥计算机帮助你完成一些事情,那么你就必须了解计算机如何帮你完成这些事情,否则你就只会指挥,而不会懂得如何去做。不知道如何去做的后果就是,你不会知道如何才能做的更好,反映到现实当中,就是你不知道如何写出更好的程序。这点其实不难理解,试想一下,你都不知道你的程序实际上是如何运行的,你又怎么可能知道怎么写是更好的呢。