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

news2024/11/25 2:28:52

今天开始计算机速成课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.coloradmin.cn/o/1288862.html

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

相关文章

无需公网IP实现公网远程访问本地WebDAV服务

windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

威胁态势 | 0day占比超85%!两大勒索家族“均分天下”

近日,亚信安全正式发布《亚信安全2023年11月威胁态势报告》(以下简称“报告”),报告显示,11月份新增安全漏洞778个, APT组织在国内外活动仍然呈上升趋势,多个国家政府、企业和科研单位遭受攻击&…

Linux之进程(一)

目录 一、概念 1、基本概念 2、描述进程的PCB 3、task_struct 二、查看进程 三、获取进程的PID和PPID 通过系统调用获取进程的PID和PPID 四、通过系统调用创建进程 1、fork函数创建子进程 2、用if进行分流 五、进程状态 1、操作系统进程状态 1、新建 2、运行 3、…

Java利用UDP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目,并命名。 二、实现代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class liaotian extends JFrame{private stat…

expdp单独导出导入dblink

文章目录 前言一、实现步骤获取ddl方式(不可行)expdp单独导出dblink 二、impdp单独导入dblink 前言 在实际工作中可能会遇到测试或者迁移工作,对于数据库建立较多的dblink应用重新建立dblink工作量较大,此时可以通过逻辑导出导入…

邮件协议讲解(SMTP、POP3、IMAP)

邮件收发基本概念 常见邮件协议 发邮件:SMTP(加密版本SMTPS) 收邮件:IMAP(加密版本IMAPS)、POP3(加密版本POP3S) 邮件协议端口号 SMTP: TCP 25 IMAP:…

西门子SMART精彩触摸屏如何在进入某个画面时置位某个BOOL变量?

西门子SMART精彩触摸屏如何在进入某个画面时置位某个BOOL变量? 以下举例进行说明具体的操作: 如下图所示,新建一个项目后,在变量表中添加好自己需要的变量; 添加一个画面,这里以“画面_1”进行举例说明&…

在 Node-RED 中引入 ECharts 实现数据可视化

Node-RED 提供了强大的可视化工具,而通过引入 ECharts 图表库,您可以更直观地呈现和分析数据。在这篇博客中,我们将介绍两种在 Node-RED 中实现数据可视化的方法:一种是引入本地 ECharts 库,另一种是直接使用 CDN&…

美图发布自研视觉大模型4.0,主打AI设计与AI视频【无际Ai分享资讯】

12月5-6日,主题为“未来AI设计”的美图创造力大会在厦门举行。美图公司发布自研AI视觉大模型MiracleVision(奇想智能)4.0版本,主打AI设计与AI视频。 AI设计方面,新增了矢量图形、文字特效、智能分层、智能排版四大能力…

机器学习实验五:集成学习

系列文章目录 机器学习实验一:线性回归机器学习实验二:决策树模型机器学习实验三:支持向量机模型机器学习实验四:贝叶斯分类器机器学习实验五:集成学习机器学习实验六:聚类 文章目录 系列文章目录一、实验…

windows install git

refer: https://developers.weixin.qq.com/miniprogram/dev/devtools/wechatvcs.html https://blog.csdn.net/weixin_40228200/article/details/128451324 在使用小程序的时候,需要初始化项目,需要注册Git账号 1.在本地确认cmd没有安装Git,进入Git官网…

开放式耳机什么品牌好?南卡、韶音、cleer开放式耳机哪个好?

全球TWS耳机出货量从2016年的918万台增长至2023年第二季度的6816万台。开放式耳机的新赛道在2023年持续发酵,成为市场中的新关注点,各大品牌也在今年争先推出新款开放式耳机,韶音、南卡、Cleer的新产品都在上半年纷纷亮相,开放式耳…

阻碍“元宇宙”游戏行业发展的最大瓶颈是什么?

很显然,我们现在还没看到真正的“元宇宙”产品,在3-5年内也不太可能看到这样的产品。按照米哈游CEO蔡浩宇的说法,2030年希望建成一个“上亿人愿意生活在其中的虚拟世界”,那也是八年以后的事情了。 原因很简单:技术不成…

Java 输入输出流01

1. 什么是 IO Java 中 I/O 操作主要是指使用 Java 进行输入,输出操作. Java 所有的 I/O 机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java 的 I/O 流提供了读写数据的标准方法。任何 Java 中表示数据源的对象都会提供…

2024年终工作总结汇报,这样来写更科学

时光荏苒,2024年已经悄然而至,伴随而来的是一年一度的终年工作总结,以回首过去的一年的成果与不足。然而,怎样写一份既真实又有说服力的总结汇报成了摆在很多人面前的一道难题。 在为年终总结苦恼时,我突然想到了平时…

CompletableFuture异步执行

CompletableFuture异步执行 概念 Java 8引入了一个强大的类:CompletableFuture,它在java.util.concurrent包中。CompletableFuture是Future的增强版本,主要用于实现异步编程。 首先,我们要理解什么是Future。Future是Java5引入的一个接口,代表一个异步计算的结果。你可…

虹科干货 | 关于JSON数据库

来源:艾特保IT 虹科干货 | 关于JSON数据库 原文链接:https://mp.weixin.qq.com/s/NutCGWa32rOcEHrk3UDGcQ 欢迎关注虹科,为您提供最新资讯! 如何理解JSON数据库?作为NoSQL数据库的一种类型,JSON数据库有哪…

cocos creator [Window] Cannot read property ‘dump‘ of null

写脚本的时候,出现了如下的问题, [Window] Cannot read property dump of null 原因:在下图中,方式一是正常的,而方式二则会爆出此错误,所以需要初始化,给它赋值

人工智能|网络爬虫——用Python爬取电影数据并可视化分析

一、获取数据 1.技术工具 IDE编辑器:vscode 发送请求:requests 解析工具:xpath def Get_Detail(Details_Url):Detail_Url Base_Url Details_UrlOne_Detail requests.get(urlDetail_Url, headersHeaders)One_Detail_Html One_Detail.cont…

AI助力智慧农业,基于YOLOv6最新版本模型开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义,在前面的系列博文中,我们从一些现实世界里面的所见所想所感进行了很多对应的实践,感兴趣的话可以自行移步阅读即可: 《自建数据集,基于YOLOv7开发构建农田场景下杂草…