机器指令到汇编再到高级编程语言

Part 1. 机器指令

机器指令到汇编再到高级编程语言

文章插图
 
上一次 我们已经了解了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着微小的 「电子操作」,例如:从内存读取一个字节的数据到 CPU 又或者判断字节中的某一位是 0 还是 1 。
CPU 本身有一组 规定好的 可以执行的 「基本动作」(被称为 机器指令):
  1. 读取指令;2. 执行指令;3. 写寄存器;
这几乎就是 CPU 工作的全部了 。 这些动作虽然每次只能执行一次,但是每秒可以执行数十亿次,这个数量级的「小操作」累加成为一个大的「有用的操作」 。
处理器所做的一切都是基于这些微小的操作!幸运的是,我们已经不再需要了解这些操作的详细信息就可以编写和使用各类程序 。诸如 JAVA 这一类的 「高级语言」 的 目的就是 将这些微小的电子操作组织成由人类可读的「程序语言」表示的大型有用单元 。
机器指令演示一条 机器指令 一般由内存中的几个字节组成,它们告诉 CPU 应该执行一个什么样的「机器操作」(是取数据还是写寄存器等..) 。处理器依次查看 CPU 中的机器指令,并执行每一条 。内存中的一组机器指令被称为 「机器语言程序」,或称为 「可执行程序」 。
下面我们来使用机器语言来演示一个控制灯泡亮度的机器语言程序 。
先和硬件做好规定假设灯泡由内存中的某一个程序控制,该程序能够完全打开和关闭灯泡,可以使灯泡变亮或变暗,机器指令一个字节长度,并且与机器操作对应如下:
机器指令机器操作00000000停止程序00000001完全打开灯泡00000010完全关闭灯泡00000100灯泡暗淡 10%00001000将灯泡照亮 10%00010000如果灯泡完全点亮,则跳过下一条说明00100000如果灯泡完全熄灭,请跳过下一条说明01000000转到程序的开始(地址 0)
Demo 程序 && 演示根据上方作出的规定,我们写下如下的程序:(为了方便理解,我把对应的机器操作也写在了后面,实际的程序只包含机器指令)
地址机器指令机器操作000000001完全打开灯泡100000010完全关闭灯泡200000001完全打开灯泡300000100灯泡暗淡10%400000100灯泡暗淡10%500000000停止程序
所以这样的一段程序执行效果就如下图:
机器指令到汇编再到高级编程语言

文章插图
 
您可以尝试自己利用 01000000(跳转到程序开始) 来改写程序来达到让「灯逐渐变亮又逐渐变暗」的目的 。
小结上面演示的程序 核心思想 是:
  • 机器语言程序是内存中一系列机器指令的集合;
  • 机器指令由一个或多个字节组成(在此示例中,仅一个字节);
  • 处理器一次运行一条机器指令的程序;
  • 所有的小机器操作加起来都是有用的;
在实际的 CPU 中,拥有更多的机器指令,而且更详细,并且不同的 CPU,指令集是不同的 。典型的 CPU 拥有一千或更多的机器指令 。
Part 2. 汇编语言
机器指令到汇编再到高级编程语言

文章插图
 
  • 图片来源:http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
机器语言太 "反人类”我们已经可以开始写一些程序使用了,但是使用 机器语言编写代码会十分辛苦,比如:
00000001 00000010 0000000100000100 00000100 00000000即使你刚看过你也会对这一段就在 上方的实例代码 没有什么感知,这是因为机器语言是设计给机器的,人类记忆和使用起来就会显得十分麻烦 。
如此你就会感知到 上个世纪 的程序员使用 打孔卡片:
机器指令到汇编再到高级编程语言

文章插图
 
使用 纸带:
机器指令到汇编再到高级编程语言

文章插图
 
甚至是 直接插拔线路 or 按下开关:
机器指令到汇编再到高级编程语言

文章插图
 
是一件多么硬核的事情...
机器指令到汇编再到高级编程语言

文章插图
 

如果你对它们如何工作以及多么硬核感兴趣,可以参考一下下方的链接:
开发语言小传之一:最早的编程语言——机器语言 - https://blog.csdn.net/killer080414/article/details/42219091


推荐阅读