计算机速成课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点 - ,感谢大家关注、转发、点赞!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

观测云实现日志存储与分析 10 倍性价比提升|SelectDB 技术团队

作者:观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下,越来越多的企业开始将业务迁移到云端,传统的监控和故障排查方法已经无法满足企业的需求。而观测云可提供整体数据的分析、洞察、可视化、自动化、监测告警、智能巡查…

单周爆售150w+,“不是羽绒服买不起,而是军大衣更有性价比”

拼多多收盘市值超过阿里,成在美中概股市值第一。 截至美股收盘(11月30日),拼多多收盘市值超过阿里巴巴,成为在美中概股中的市值第一股。拼多多收涨4.03%,报147.44美元,市值1959亿美元&#xff…

Tiled Matrix Multiplication

if(true) { (function(i,s,o,g,r,a,m){i[‘GoogleAnalyticsObject’]r;i[r]i[r]||function(){ (i[r].qi[r].q||[]).push(arguments)},i[r].l1*new Date();as.createElement(o), ms.getElementsByTagName(o)[0];a.async1;a.srcg;m.parentNode.insertBefore(a,m) })(window,docum…

uniapp微信小程序分包,小程序分包

前言,都知道我是一个后端开发、所以今天来写一下uniapp。 起因是美工给我的切图太大,微信小程序不让了,在网上找了一大堆分包的文章,我心思我照着写的啊,怎么就一直报错呢? 错误原因 tabBar的页面被我放在分…

五肽-13|提亮肤色,美白肌肤

五肽-13 INCI名称:五肽-13 说明: 五肽-13是一种合成肽,由丙氨酸、精氨酸、赖氨酸、脯氨酸和缬氨酸组成 功能: 五肽-13起到增白剂的作用 应用程序: 提亮和美白

2023年2月8日 Go生态洞察:Profile-Guided Optimization预览

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Streamlit框架的定制化

Streamlit框架的定制化 最近做了一个关于streamlit框架的项目,颇有感触,所以在这里记录一下。 什么是streamlit? Streamlit 是一个python的WEB UI库,它做了高度的封装以便于不懂后前端开发的人员也能轻松构建画面。你可以从官网进行详细的…

Linux文件结构与文件权限

基于centos了解Linux文件结构 了解一下文件类型 Linux采用的一切皆文件的思想,将硬件设备、软件等所有数据信息都以文件的形式呈现在用户面前,这就使得我们对计算机的管理更加方便。所以本篇文章会对Linux操作系统的文件结构和文件权限进行讲解。 首先…

halcon如何设置窗口背景颜色?

halcon窗口背景默认是黑色,有时候图片背景是黑色,不方便观察边缘,如果需要设置窗口背景颜色,可以使用如下算子。 设置窗口背景颜色:白色 set_window_param (WindowHandle, background_color, white) 设置白色后的效…

13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)

文字激光打印特效 基于canvas实现的动画特效&#xff0c;你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印&#xff0c;精简易用。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

关于 mapboxgl 的常用方法及效果

给地图标记点 实现效果 /*** 在地图上添加标记点* point: [lng, lat]* color: #83f7a0*/addMarkerOnMap(point, color #83f7a0) {const marker new mapboxgl.Marker({draggable: false,color: color,}).setLngLat(point).addTo(this.map);this.markersList.push(marker);},…

从【注意力机制】开始的,零基础【大模型】系列

注意力机制 原理&#xff1a;从关注全部到关注重点软注意力-计算方式传统注意力问题 键值注意力&#xff1a;单标签的检索系统计算方式 多头注意力&#xff1a;多标签的检索系统自注意力&#xff1a;对输入数据内部关系进行预处理计算方式 Transformer 原理&#xff1a;从关注全…

医院预约挂号平台的设计与实现

摘 要 网络的空前发展给人们的工作和生活带来了极大的便利&#xff0c;信息技术已成为节约运营成本、提高工作效率的首选。相比之下&#xff0c;国内相当多的中小医院在医院预约工作中的手工工作比较保守&#xff0c;数据查询和存储成本都很高&#xff0c;但效率很低。为了使医…

docker-compose部署sonarqube 8.9 版本

官方部署文档注意需求版本 所以选择8.9版本 一、准备部署配置 1、持久化目录 rootlocalhost:/root# mkdir -p /data/sonar/postgres /data/sonar/sonarqube/data /data/sonar/sonarqube/logs /data/sonar/sonarqube/extensions rootlocalhost:/root# chmod 777 /data/sona…

天眼销为电销行业降低获客成本

当下&#xff0c;做电销的老板都有一个深刻体会&#xff1a;市场竞争越来越激烈&#xff0c;获客成本不断攀升&#xff0c;但效率不升返降&#xff0c;企业经营困难。特别是在这一两年&#xff0c;市场环境紧张&#xff0c;业务不好开展&#xff0c;更是雪上加霜。 销售也感觉…

Matlab 曲线动态绘制

axes(handles.axes1); % 选定所画坐标轴 figure也可 h1 animatedline; h1.Color b; h1.LineWidth 2; h1.LineStyle -; % 线属性设置 for i 1 : length(x)addpoints(h1,x(i),y(i)); % x/y为待绘制曲线数据drawnow;pause(0.01); % 画点间停顿 end 示例&#xff1a; figure…

BearPi Std 板从入门到放弃 - 引气入体篇(8)(ADC)

简介 基于前面的文章, 缩略STM32CubeMx创建项目的过程&#xff0c;直接添加ADC相关初 始化; 开发板 &#xff1a; Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 ADC1: PC2步骤 创建STM32CubeMX LED/串口ADC1初始…

「音视频处理」音频编码AAC详解,低码率提高音质?

AAC&#xff08;高级音频编码&#xff09; 也称为 MPEG-4 音频。数码音频压缩和编码的标准方式。AAC 编码文件可与音乐光盘的质量相匹敌&#xff0c;且声音质量通常等同于或高于以相同或甚至更高的位速率编码的 MP3 文件。 我们按这样的顺序讨论 &#xff1a; 1、 封装格式的…

如何使用 Zotero 导出所选条目的 PDF 文件

如何使用 Zotero 导出所选条目的 PDF 文件 Zotero 是一款强大的参考文献管理工具&#xff0c;但它并不直接提供将整个文件夹导出为 PDF 的选项。不过&#xff0c;您可以使用以下步骤来导出您所选的 Zotero 条目中的 PDF 文件&#xff0c;无需额外的插件。 选择所需的 Zotero 条…

2023年危险化学品生产单位安全生产管理人员证考试题库及危险化学品生产单位安全生产管理人员试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品生产单位安全生产管理人员证考试题库及危险化学品生产单位安全生产管理人员试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&a…