05 | 计算机指令:让我们试试用纸带编程

解析指令和机器码

了解了这个过程,下面我们放大局部,来看看这一行行的汇编代码和机器指令,到底是什么意思。 我们就从平时用的电脑、手机这些设备来说起。这些设备的 CPU 到底有哪些指令呢还真有不少,我们日常用的 Intel CPU,有 2000 条左右的 CPU 指令,实在是太多了,所以我没法一一来给你讲解。不过一般来说,常见的指令可以分成五大类。 第一类是 算术类指令 。我们的加减乘除,在 CPU 层面,都会变成一条条算术类指令。 第二类是 数据传输类指令 。给变量赋值、在内存里读写数据,用的都是数据传输类指令。 第三类是 逻辑类指令 。逻辑上的与或非,都是这一类指令。 第四类是 条件分支类指令 。日常我们写的“if/else”,其实都是条件分支类指令。 最后一类是 无条件跳转指令 。写一些大一点的程序,我们常常需要写一些函数或者方法。在调用函数的时候,其实就是发起了一个无条件跳转指令。 你可能一下子记不住,或者对这些指令的含义还不能一下子掌握,这里我画了一个表格,给你举例子说明一下,帮你理解、记忆。

总结延伸

到这里,想必你也应该明白了,我们在这一讲的开头介绍的打孔卡,其实就是一种存储程序型计算机。 只是这整个程序的机器码,不是通过计算机编译出来的,而是由程序员,用人脑“编译”成一张张卡片的。对应的程序,也不是存储在设备里,而是存储成一张打好孔的卡片。但是整个程序运行的逻辑和其他 CPU 的机器语言没有什么分别,也是处理一串“0”和“1”组成的机器码而已。 这一讲里,我们看到了一个 C 语言程序,是怎么被编译成为汇编语言,乃至通过汇编器再翻译成机器码的。 除了 C 这样的编译型的语言之外,不管是 Python 这样的解释型语言,还是 Java 这样使用虚拟机的语言,其实最终都是由不同形式的程序,把我们写好的代码,转换成 CPU 能够理解的机器码来执行的。 只是解释型语言,是通过解释器在程序运行的时候逐句翻译,而 Java 这样使用虚拟机的语言,则是由虚拟机对编译出来的中间代码进行解释,或者即时编译成为机器码来最终执行。 然而,单单理解一条指令是怎么变成机器码的肯定是不够的。接下来的几节,我会深入讲解,包含条件、循环、函数、递归这些语句的完整程序,是怎么在 CPU 里面执行的。

推荐阅读

这一讲里,我们用的是相对最简单的 MIPS 指令集作示例。想要对我们日常使用的 Intel CPU 的指令集有所了解,可以参看《计算机组成与设计:软 / 硬件接口》第 5 版的 2.17 小节。

课后思考

我们把一个数字在命令行里面打印出来,背后对应的机器码是什么以试试通过 GCC 把这个的汇编代码和机器码打出来。 欢迎你在留言区写下你的思考和疑问,你也可以把今天的文章分享给你朋友,和他一起学习和进步。 确认放弃笔记弃后所记笔记将不保留。新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开量公开的笔记不会为你同步至部落 公开 同步至部落取消完成 0/2000划线 笔记 复制

75人觉得很赞给文章提建议

? 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。 文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览115003 人正在系统学习中

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

上一篇 2022年5月5日
下一篇 2022年5月5日

相关推荐