深入计算机组成原理(五)计算机指令:让我们试试用纸带编程

你在学写程序的时候,有没有想过,古老时代的计算机程序是怎么写出来的/p>

其实在当年,不想现在这样,都是用一种古老的物理设备,叫做“打孔卡”(Punched Card)。用这种设备写程序,可没法像现在这样,掏出键盘就能打字,而是要先在脑海里或者在纸上写出程序,然后在纸带或者卡片上打洞。这样,要写的程序,要处理的数据,就变成一条条纸带或者卡片,之后再交给当时的计算机去处理。

从编译到汇编,代码怎么变成机器码/h1>

了解了计算机指令和计算机指令集,接下来我们来看看,平时编写的代码,到底是怎么变成一条条计算机指令,最后被CPU执行的呢们拿一小段真实的C语言程序来看看。

这是一段再简单不过的C语言程序,即便你不了解C语言,应该也可以看懂。我们给两个变量a、b分别赋值1、2,然后再将a、b两个变量中的值加在一起,重新赋值给了a整个变量。

要让这段程序在一个Linux系统上跑起来,我们需要把整个程序翻译成一个汇编语言(ASM,Assembly Language)的程序,这个过程我们一般叫做编译(Compile)成汇编代码。

针对汇编代码,我们可以再用汇编器(Assembler)翻译成机器码(Machine Code)。这些机器码由”0“和”1“组成的机器语言表示。着一条条机器码,就是一条条的计算机指令。这样一串串的16进制数字,就是我们CPU能够真正认识的计算机指令。

在一个Linux系统上,我们可以简单地使用gcc和objdump这样两条命令,把对应的汇编代码和机器码都打印出来。

可以看到,左侧有一堆数字,这些就是一条条机器码;右边有一系列的push、mov、add、pop
等,这些就是对应的汇编代码。一行C语言代码,有时候只对应一条机器码和汇编代码,有时候则是对应两条机器码和汇编代码。汇编代码和机器码之间是一一对应的。

这个时候你可能又要问了,我们实际在用GCC(GUC编译器套装,GUI Compiler Collection)编译器的时候,可以直接把代码编译成机器码呀,为什么还需要汇编代码呢因很简单,你看着那一串数字表示的机器码,是不是摸不着头脑是即使你没有学过汇编代码,看的时候多少也能”猜“出一些这些代码的含义。

因为汇编代码其实就是”给程序员看的机器码“,也正因为这样,机器码和汇编代码是一一对应的。我们人类很容易记住add、moc这些用英文表示的指令,而8b 45 f8这样的指令,由于很难一下子看明白是在干什么,所以会非常难以记忆。尽管早年互联 上到处流传,大神程序员拿小刀在光盘上刻出操作系统的梗,但是要让你用打孔卡来写哥程序,估计浪费的卡片比用上的卡片要多得多。

我们说过,不同的CPU有不同的指令集,也就是对应着不同的汇编语言和不同的机器码。为了方便你快速理解这个机器码的计算方式,我们选用最简单的MIPS指令集,来看看机器码是如何生成的。

MIPS是一组由MIPS技术公司在80年代中期设计出来的CPU指令集。就在最近,MIPS公司把整个指令集和芯片架构都完全开源了,想要深入研究CPU和指令集的同学,可以了解一下。

深入计算机组成原理(五)计算机指令:让我们试试用纸带编程

好了,恭喜你,读到这里,你应该学会了怎么作为人肉编译和汇编器,给纸带打孔编程了,不用再对那些用过打孔卡的前辈们顶礼膜拜了。

总结延伸

到这里,想必你也明白了,我们在这一讲开头提到的打孔卡,其实就是一种存储程序型计算机。

只是着整个程序的机器码,不是通过计算机编译出来的,而是由程序员,用人脑”编译”成一张张卡片的。对应的程序,也不是存储在设备里,而是存储成一张打好孔的卡片。但是整个程序运行的逻辑和其他CPU的机器语言是没有什么分别的,也是处理一串“0“和”1“组成的机器码而已。

这一讲里,我们看到了一个C语言程序,是怎么被编译成汇编语言,乃至通过汇编器再翻译成机器码的。

除了C语言这样的编译型的语言之外,不管是Python这样的解释型语言,还是Java这种使用虚拟机的语言,其实最终都是由不同形式的程序,把我们写好的代码,转换成CPU能够理解的机器码来执行的。

只是解释型语言,是通过解释器在程序运行的时候逐句翻译,而 Java 这样使用虚拟机的语言,则是由虚拟机对编译出来的中间代码进行解释,或者即时编译成为机器码来最终执行。

然而,单单理解一条指令是怎么变成机器码的肯定是不够的。接下来的几节,我会深入讲解,包含条件、循环、函数、递归这些语句的完整程序,是怎么在 CPU 里面执行的。

思考

我们把一个数字在命令行里面打印出来,背后对应的机器码是什么可以试试通过GCC把这个的汇编代码和机器码打出来。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年5月2日
下一篇 2019年5月2日

相关推荐