计算机速成课Crash Course - 08. 指令和程序

今天开始计算机速成课Crash Course的系列讲解。

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

计算机速成课Crash Course - 08. 指令和程序

08. 指令和程序

上集我们把 ALU, 控制单元, RAM, 时钟结合在一起,做了个基本可用的"中央处理单元", 简称 CPU。

它是计算机的核心,我们已经用电路做了很多组件。这次我们给 CPU 一些指令来运行!

图片

CPU 之所以强大,是因为它是可编程的,如果写入不同指令,就会执行不同任务。

CPU 是一块硬件,可以被软件控制!

我们重新看一下上集的简单程序,内存里有这些值,每个地址可以存 8 位数据。因为我们的 CPU 是假设的,这里前4位是"操作码",后4位指定一个内存地址,或寄存器。

图片

内存地址 0 是 0010 1110,前 4 位代表 LOAD_A 指令,意思是:把后 4 位指定的内存地址的值,放入寄存器 A。后 4 位是 1110,十进制的 14,就是说8位的数据 0010 1110 看成 "LOAD_A 14" 指令。

图片

这样更好理解!也更方便说清楚。

可以对内存里剩下的数也这样转换,我们的程序只有4个指令,还有数字 3 和 14。

图片

现在一步步看:

"LOAD_A 14" 是从地址 14 中拿到数字3,放入寄存器A

"LOAD_B 15" 是从地址 15 中拿到数字14,放入寄存器B

好,挺简单的!

下一个是 ADD 指令,"ADD B A" 告诉 ALU,把寄存器 B 和寄存器 A 里的数字加起来,(B和A的)顺序很重要,因为结果会存在第二个寄存器。也就是寄存器 A。

图片

最后一条指令是 "STORE_A 13",把寄存器 A 的值存入内存地址 13。

好棒!我们把 2 个数加在了一起!

毕竟只有4个指令,也只能做这个了,加多一些指令吧!

图片

SUB 是减法,和 ADD 一样也要 2 个寄存器来操作。

还有 JUMP(跳转),让程序跳转到新位置。如果想改变指令顺序,或跳过一些指令,这个很实用。举例,JUMP 0 可以跳回开头。

JUMP 在底层的实现方式是,把指令后 4 位代表的内存地址的值,覆盖掉 "指令地址寄存器" 里的值。

还有一个特别版的 JUMP 叫 JUMP_NEGATIVE,它只在 ALU 的 "负数标志" 为真时,进行 JUMP。

第5集讲过,算术结果为负,"负数标志"才是真,结果不是负数时,"负数标志"为假。如果是假,JUMP_NEGATIVE 就不会执行,程序照常进行。

图片

最后,计算机还需要知道什么时候该停下来,所以有HALT指令,停止功能。

我们之前的例子程序,其实应该最后到HALT指令停止,才能正确工作。否则跑完 STORE_A 13之后,CPU 会不停运行下去,处理后面的 0,因为 0 不是操作码,所以电脑会崩掉!

还要指出一点,指令和数据都是存在同一个内存里的。它们在根本层面上毫无区别,都是二进制数。

HALT 很重要,能区分指令和数据。

好,现在用 JUMP 让程序更有趣一些,我们还把内存中 3 和 14 两个数字,改成 1 和 1。

现在来从 CPU 的视角走一遍程序。

首先 LOAD_A 14,把 1 存入寄存器A,(因为地址 14 里的值是 1)

然后 LOAD_B 15,把 1 存入寄存器B,(因为地址 15 里的值也是 1)

然后 ADD B A 把寄存器 B 和 A 相加,结果放到寄存器 A 里。

现在寄存器 A 的值是 2 (当然是以二进制存的)

然后 STORE_A 13 指令,把寄存器 A 的值存入内存地址 13

现在遇到 JUMP 2 指令

CPU 会把"指令地址寄存器"的值,现在是 4,改成 2

因此下一步不再是 HALT,而是读内存地址 2 里的指令,也就是 ADD B A。

图片

我们跳转了!

寄存器 A 里是 2,寄存器 B 里是 1,1+2=3,寄存器 A 变成 3,存入内存。

又碰到 JUMP 2,又回到 ADD B A。1+3=4,现在寄存器 A 是 4,发现了吗?

每次循环都+1,不断增多,但没法结束啊,永远不会碰到 HALT。总是会碰到 JUMP。

这叫无限循环,这个程序会永远跑下去.. 下去.. 

为了停下来,我们需要有条件的 JUMP,只有特定条件满足了,才执行 JUMP。

比如 JUMP NEGATIVE 就是条件跳转的一个例子,还有其他类型的条件跳转,比如,JUMP IF EQUAL(如果相等),JUMP IF GREATER(如果更大)。

现在把代码弄花哨一点,再过一遍代码。就像之前,程序先把内存值放入寄存器 A 和 B。

寄存器 A 是 11,寄存器 B 是 5,SUB B A,用 A 减 B,11-5=6,6 存入寄存器 A。

JUMP NEGATIVE 出场,上一次 ALU 运算的结果是 6,是正数,所以 "负数标志" 是假,因此处理器不会执行 JUMP,继续下一条指令。

JUMP 2 没有条件,直接执行!又回到寄存器 A-B,6-5=1,A 变成 1,下一条指令。

又是 JUMP NEGATIVE,因为 1 还是正数,因此 JUMP NEGATIVE 不会执行,来到下一条指令,JUMP 2又来减一次。

这次就不一样了。

1-5=-4,这次ALU的 "负数标志" 是真,现在下一条指令。

图片

JUMP NEGATIVE 5, CPU 的执行跳到内存地址 5,跳出了无限循环!

现在的指令是 ADD B A,-4+5=1,1 存入寄存器 A。下一条指令STORE_A 13,把 A 的值存入内存地址 13,最后碰到 HALT 指令,停下来。

虽然程序只有 7 个指令,但 CPU 执行了 13 个指令,因为在内部循环了 2 次。

这些代码其实是算余数的,11除以5余1,如果加多几行指令,我们还可以跟踪循环了多少次,11除5,循环2次,余1。

当然,我们可以用任意2个数,7和81,18和54,什么都行,这就是软件的强大之处,软件还让我们做到硬件做不到的事。

ALU 可没有除法功能,是程序给了我们这个功能。别的程序也可以用我们的除法程序,来做其他事情。

这意味着一层新抽象!

我们这里假设的 CPU 很基础,所有指令都是 8 位,操作码只占了前面 4 位,即便用尽 4 位,也只能代表 16 个指令,而且我们有几条指令,是用后 4 位来指定内存地址。

因为 4 位最多只能表示 16 个值,所以我们只能操作 16 个地址,这可不多,我们甚至不能 JUMP 17,因为 4 位二进制无法表示数字 17。

因此,真正的现代 CPU 用两种策略,最直接的方法是用更多位来代表指令,比如 32 位或 64 位,这叫“指令长度”。

毫不意外,第二个策略是 "可变指令长度"。

举个例子,比如某个 CPU 用 8 位长度的操作码,如果看到 HALT 指令,HALT 不需要额外数据,那么会马上执行。

如果看到 JUMP,它得知道位置值,这个值在 JUMP 的后面,这叫 "立即值",这样设计,指令可以是任意长度,但会让读取阶段复杂一点点。

要说明的是,我们拿来举例的 CPU 和指令集都是假设的,是为了展示核心原理。我们现在来看个真的 CPU 例子。

1971年,英特尔发布了 4004 处理器,这是第一次把 CPU 做成一个芯片,给后来的英特尔处理器打下了基础。它支持 46 个指令,足够做一台能用的电脑,它用了很多我们说过的指令,比如 JUMP ADD SUB LOAD,它也用 8 位的"立即值"来执行 JUMP, 以表示更多内存地址。

图片

处理器从 1971 年到现在发展巨大,现代 CPU,比如英特尔酷睿 i7,有上千个指令和指令变种,长度从1到15个字节。

举例,光 ADD 指令就有很多变种,指令越来越多,是因为给 CPU 设计了越来越多功能。

下集我们会讲!


以上内容就是 08. 指令和程序 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM框架实现超市进销存购物商城管理系统项目【项目源码+论文说明】

基于java的SSM框架实现超市进销存购物商城管理系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,社区生活超市管理系统当然也不能排除在外。社区生活超市管理系统…

【QT】容器类的迭代

迭代器(iterator)为访问容器类里的数据项提供了统一的方法,Qt有两种迭代器类:Java类型的迭代器和STL类型的迭代器。 Java类型的迭代器更易于使用,且提供一些高级功能,而STL类型的迭代器效率更高。 Qt还提供一个关键字foreach&…

ORACLE使用Mybatis-plus批量插入

ORACLE使用mybatis-plus自带的iservice.saveBatch方法时,会报DML Returing cannot be batch错误: 推测原因是oracle不支持insert into table_name (,) values (,),()的写法。且oracle不会自动生…

华为Watch Buds手表耳机声音小怎么办?试试这些方法

使用华为 WATCH Buds 的手表耳机的铁子们,你们有没有和我遇到同样的问题:刚用的时候音质超级好,但是用了一段时间后,偶尔会遇到耳机声音变小,甚至出现左右耳音量不一致的情况。 如果有的话,不用担心&#…

【libcurl库】安装及其编程访问百度首页(一)

一、Libcurl库简介 二、Libcurl等三方库的通用编译方法 库的配置、编译、安装 (1)安装位置的更改(2)编译、安装(3)预览 三、调用libcurl编程访问百度主页 编译(编译时链接库、头文件路径&am…

操作系统的特征

一、并发 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。 并行 :是指两个或多个事件同一事件发生。 操作系统的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看…

Hadoop学习笔记(HDP)-Part.20 安装Flume

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

java小工具util系列3:JSON转实体类对象工具

文章目录 准备工作1.JSONObject获取所有的key2.集合中实体对象转换 list中Enrey转Dto3.字符串转List<BusyTimeIndicatorAlarmThreshold>4.json字符串转JSONObject5.list根据ids数组过滤list6.json字符串转JavaBean对象7.json对象转javabean8.jsonObject转map9.List\<U…

微服务的利与弊

一、前言 自从大多数web架构从单体演进到服务拆分&#xff0c;到微服务一统天下的几年来&#xff0c;应该没有web应用不是微服务架构的吧。最开始是阿里的doubble分层架构&#xff0c;到后来的SpringCloud全家桶&#xff0c;还有各个大厂自己定义的一套服务治理框架。微服务无…

DS二分查找_搜索二维矩阵

Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性&#xff1a; 1. 每行中的整数从左到右升序排列&#xff1b; 2. 每行的第一个整数大于前一行的最后一个整数。 Input 第一行输入m和n&#xff0c;分别表示矩阵的行数和列数&#…

python 自动发送邮件

对于工作中&#xff0c;如果每日需要发送具有规律性的邮件&#xff0c;采用python自动发送可以节约很多时间&#xff0c;提高效率。本文主要以腾讯企业邮箱为例&#xff0c;介绍python自动发送邮件&#xff08;含附件&#xff09;的功能。为保护隐私&#xff0c;代码中的邮箱及…

Edge调用Aria2下载

一、准备工作 1、Edge浏览器&#xff1a;Windows系统自带或点击下载&#xff1b;   2、Aria2 gui&#xff1a;点击github下载或自行搜索下载其他版本&#xff1b; 二、启动Aria2 gui 解压下载的Aria2 gui到任意目录&#xff0c;点击“Aria2c启动器”或“AriaNg启动器”皆可。…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《“无废”电–氢充能服务区多源微网优化运行模型》

这个文章标题涉及到“无废”电–氢充能服务区、多源微网和优化运行模型。下面我将对标题中的关键术语进行解读&#xff1a; “无废”电–氢充能服务区&#xff1a; 无废电&#xff08;Waste-free electricity&#xff09;&#xff1a; 这可能指的是通过某种方式生产的电力&…

从零开始学习 JS APL(六):完整指南和实例解析

学习目标&#xff1a; 1. 能够利用正则表达式校验输入信息的合法性 2. 具备利用正则表达式验证小兔鲜注册页面表单的能力 学习内容&#xff1a; 正则表达式 综合案例 阶段案例 学习时间&#xff1a; 周一至周五晚上 7 点—晚上9点周六上午 9 点-上午 11 点周日下午 3 点-下…

短视频系统设计:如何支持三千万用户同时在线看视频?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 短视频&#xff08;short video&#xff09;通常时长在 15 分钟以内&#xff0c;主要是在移动智能终端上进行拍摄、美化编辑或加特效&#xff0c;并可以在网络社交平台上进行实时分享的一种新型视频形式。短视频具有时…

简单地将附件POST到Notes应用中

大家好&#xff0c;才是真的好。 这半年我们会讲很多开发知识&#xff0c;这篇紧接上篇《通过URL将HTML表单数据创建到Domino应用中》&#xff0c;讲述如何将附件POST到Note应用中。 原理是一样&#xff0c;首先&#xff0c;你得有一个表单&#xff0c;我们用html写一个&…

Android 缩减、混淆处理和优化应用

为了尽可能减小应用的大小&#xff0c;您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后&#xff0c;您还会受益于两项功能&#xff0c;一项是混淆处理功能&#xff0c;该功能会缩短应用的类和成员的名称&#xff1b;另一项是优化功能&#xff0c;该功…

云HIS:新一代云架构医院信息管理系统源码(java语言)

云HIS信息管理云平台&#xff0c;提供全方位的临床系统应用&#xff0c;是国内领先的以云计算为基础&#xff0c;以云计算赋能医疗机构&#xff0c;是颠覆传统医疗信息化业态的技术与模式创新&#xff0c;以SaaS方式&#xff0c;为医疗机构提供信息系统服务&#xff0c;满足从医…

Deep Learning(wu--84)调参、正则化、优化--改进深度神经网络

文章目录 2偏差和方差正则化梯度消失\爆炸权重初始化导数计算梯度检验OptimizationMini-Batch 梯度下降法指数加权平均偏差修正RMSpropAdam学习率衰减局部最优问题 调参BNsoftmax framework 2 偏差和方差 唔&#xff0c;这部分在机器学习里讲的更好点 训练集误差大&#xff…

【生信分析】基因组学导论

由于工作需要&#xff0c;现在开始跨行学生信&#xff01; 祝我成功 目标&#xff1a;通过一周的学习能对对不同高通量测序数据集&#xff08;RNA-seq、ChIP-seq、BS-seq 和多组学集成&#xff09;进行分析。 配置环境 if (!requireNamespace("BiocManager", quiet…