- 「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」。
- 当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!
Part 1. 机器指令
上一次 我们已经了解了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着微小的 「电子操作」,例如:从内存读取一个字节的数据到 CPU 又或者判断字节中的某一位是 0
还是 1
。
CPU 本身有一组 规定好的 可以执行的 「基本动作」(被称为 机器指令):
- 读取指令;2. 执行指令;3. 写寄存器;
这几乎就是 CPU 工作的全部了。 这些动作虽然每次只能执行一次,但是每秒可以执行数十亿次,这个数量级的「小操作」累加成为一个大的「有用的操作」。
处理器所做的一切都是基于这些微小的操作!幸运的是,我们已经不再需要了解这些操作的详细信息就可以编写和使用各类程序。诸如 Java 这一类的 「高级语言」 的 目的 就是 将这些微小的电子操作组织成由人类可读的「程序语言」表示的大型有用单元。
机器指令演示
一条 机器指令 一般由内存中的几个字节组成,它们告诉 CPU 应该执行一个什么样的 「机器操作」(是取数据还是写寄存器等…)。处理器依次查看 CPU 中的机器指令,并执行每一条。内存中的一组机器指令被称为 「机器语言程序」,或称为 「可执行程序」。
下面我们来使用机器语言来演示一个控制灯泡亮度的机器语言程序。
先和硬件做好规定
假设灯泡由内存中的某一个程序控制,该程序能够完全打开和关闭灯泡,可以使灯泡变亮或变暗,机器指令一个字节长度,并且与机器操作对应如下:
机器指令 | 机器操作 |
---|---|
00000000 | 停止程序 |
00000001 | 完全打开灯泡 |
00000010 | 完全关闭灯泡 |
00000100 | 灯泡暗淡 10% |
00001000 | 将灯泡照亮 10% |
00010000 | 如果灯泡完全点亮,则跳过下一条说明 |
00100000 | 如果灯泡完全熄灭,请跳过下一条说明 |
01000000 | 转到程序的开始(地址 0) |
Demo 程序 && 演示
根据上方作出的规定,我们写下如下的程序:(为了方便理解,我把对应的机器操作也写在了后面,实际的程序只包含机器指令)
地址 | 机器指令 | 机器操作 |
---|---|---|
0 | 00000001 | 完全打开灯泡 |
1 | 00000010 | 完全关闭灯泡 |
2 | 00000001 | 完全打开灯泡 |
3 | 00000100 | 灯泡暗淡10% |
4 | 00000100 | 灯泡暗淡10% |
5 | 00000000 | 停止程序 |
所以这样的一段程序执行效果就如下图:
您可以尝试自己利用 01000000
(跳转到程序开始) 来改写程序来达到让「灯逐渐变亮又逐渐变暗」的目的。
小结
上面演示的程序 核心思想 是:
- 机器语言程序是内存中一系列机器指令的集合;
- 机器指令由一个或多个字节组成(在此示例中,仅一个字节);
- 处理器一次运行一条机器指令的程序;
- 所有的小机器操作加起来都是有用的;
在实际的 CPU 中,拥有更多的机器指令,而且更详细,并且不同的 CPU,指令集是不同的。典型的 CPU 拥有一千或更多的机器指令。
Part 2. 汇编语言
- 图片来源:http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
机器语言太 "反人类”
我们已经可以开始写一些程序使用了,但是使用 机器语言编写代码会十分辛苦,比如:
00000001 00000010 00000001
00000100 00000100 00000000
即使你刚看过你也会对这一段就在 上方的实例代码 没有什么感知,这是因为机器语言是设计给机器的,人类记忆和使用起来就会显得十分麻烦。
如此你就会感知到 上个世纪 的程序员使用 打孔卡片: