当前位置: 首页 > news >正文

简易CPU设计入门:本CPU项目的指令格式

在这一节里面,主要是理论知识,基本上不讲代码。不过,本项目的代码包,大家还是需要下载的。

本项目的代码包的下载方法,参考下面的链接所指示的文章。

下载本项目代码

本节,其实是要讲本项目CPU的指令集。

什么是指令集?

我的理解,一个CPU,它所支持的所有的指令的集合,就叫做它的指令集。

同一个架构的CPU,会支持大致相同的指令,且功能大致相同。像这样的,支持大致相同的指令的架构,叫做指令集架构。英文简写为ISA,全称为:Instruction Set Architecture。

我们这个CPU项目,它也有它的指令集。不过,暂时谈不上什么架构。

本项目使用的指令集,大体上,和姜咏江先生的书,《自己设计制作CPU与单片机》里面所用的指令集是一样的。指令格式大致相同。我给大家贴一下姜咏江先生的这本书的图片。

现在呢,大家在淘宝网,当当网等等的电商平台里面,应该还能够买得到。

我的这个项目,我只是采用了其中的一部分的指令,且有的指令,我作出了一点调整与改动。

接下来呢,我来讲一讲本项目CPU所使用的CPU指令格式。

一.   本项目CPU所用的CPU的指令格式

首先呢,我将姜咏江先生的书3.5.1节中所说的指令给贴出来。大家先略微看一看就行。

格式    机器指令编码    汇编指令    功能解释
1         00001               Lda r           将dram的r单元的数取出来,送到累加器da
2         00010               Add r           dram的r单元的数与累加器da相加,结果放在da中
3         00011              Out r            将dram的r单元内容送到out寄存器输出
4         00100              Sdal n          将常数n送入累加器da的低8位,并扩充成16位有符号数
5         00101              Sdah n         将常数n送入累加器da的高8位,并与低8位组成16位有符号数
6         00110              Str r              将累加器da的内容送到dram的r单元保存
7         00111              Sub r            dram的r单元与累加器da相减,结果放在累加器da
8         01000             Jmp r            跳转到iram的r单元
9         01001             Jz r               若da=0,则跳转到iram的r单元
10       01010             Jn r               若da<0,则跳转到iram的r单元
11       01011             Call r             调用子程序r,r是子程序地址
12       01100             Ret               从子程序返回
13       01101             Mult r            dram的r单元与累加器da相乘,结果放在累加器da
14       01110             Divi r             dram的r单元与累加器da相除,结果放在累加器da
15      11111              Stp                停止

最左列,为格式。其实它也是5bit的指令码对应的十进制数。

第二列,为机器指令编码,是二进制码。大家对照着第一列和第二列的格式码与机器指令码,就会发现,除了最后一行,其余的行里面,某一行的机器指令编码所对应的二进制数,与第一列中的十进制数的值是相等的。

第三列,是表示这个机器指令的汇编指令格式码。

第四列,为对这一指令的功能介绍。

原书的3.5.1节共设计了15条指令。我选取了这15条指令中的一部分指令,并且略作修改,形成了本CPU所支持的指令集。本CPU项目支持的指令集如下。

格式    机器指令编码    汇编指令    功能解释
2          00010                 Add r        dram的r单元的数与累加器da相加,结果放在da中
4          00100                 Sdal n      将常数n送入累加器da的低8位,并扩充成16位无符号数
6          00110                 Str r          将累加器da的内容送到dram的r单元保存
7          00111                 Sub r        dram的r单元与累加器da相减,结果放在累加器da

在功能解释部分,ram也好,dram也好,都指的是内存。而累加器,在功能解释部分,是用da来表示的。

(一)累加器的概念

关于累加器,学习过汇编语言的同学,对它应该是并不陌生的。没学过的,可能会有些陌生吧。

我略微来谈一谈。

在英特尔8086处理器里面,有8个通用寄存器,这些通用寄存器,都是16位的。列示如下。 

图1

图1所示的,英特尔8086CPU的8个通用寄存器,大家可以看一看。不要求记忆,但是呢,你还是应该对此有所了解。最好呢,以后可以渐渐地做到心里头熟悉这张表。

在图1里面,第一个寄存器,是累加器AX。关于累加器,大概起初在设计它的时候,就是为了用它做加法运算。然而,这基本上算是一个大忙人。好多的运算,都会用到累加器。包括我们自己编写汇编代码的时候,也常常会去使用累加器。累加器,是一个相当常用的寄存器。

我目前所接触过的CPU有两个,一个是英特尔架构的CPU,另一个是小时候的小霸王游戏机里面会用到的 6502 CPU。

在6502 CPU里面,也有累加器。而在姜咏江先生的书里面,同样是提到了累加器。

当前,电脑上使用的CPU,以英特尔和AMD公司的CPU为多。这俩公司的CPU,都属于英特尔的X86架构的CPU。而在手机,平板电脑上,使用的,大概以ARM架构的CPU为多。ARM架构的CPU的汇编代码,我还没有学习过。我估计,在ARM汇编里面,大概,也会使用到累加器。

累加器,大概会是各种CPU都是用到的一个寄存器。

(二)ram的概念

ram,是一个英文缩写,全称是 random access memory,中文翻译为随机访问存储器。它可以分为两种类型,一个是动态随机访问存储器,英文缩写为DRAM,另外一个是静态随机访问存储器,英文缩写为SRAM。

在速度上,SRAM要比DRAM快好多。不过,由于SRAM造价比较高,所以,在我们的计算机里面,并没有用SRAM来制作内存条,而是用DRAM来制作内存条。而SRAM,也是有使用的,主要是用于CPU中的高速缓存。

在我们的系统中,不存在SRAM,不存在CPU缓存,只有DRAM。所以,在我们的系统中,你可以认为RAM与DRAM是同义语。

在我们的系统中,我是用Quartus II软件的IP核,生成了两个ram IP核。这俩ram,一个是专门用来存储机器指令码,另一个是专门用来存储数据。这么去处理的原因,是因为,姜咏江的书是这么写的,另一个教写CPU代码的书也是这么写的。

大家都这么写,我也就跟着这么写了。

现实中的内存条,也就是DRAM,你可以将其看作是一个大的字节数组。每一个内存单元的尺寸,是1字节。如果某一个内存条的的容量是1024B,则它能够存储1024个字节。字节编号,就是这个内存单元的地址。

内存地址从0开始编号。内存地址511为第512个字节单元。

现实中的内存地址,指的是字节编号。

而在我们的这个系统中,内存地址,并非字节编号。我们这个系统,每一个内存单元的尺寸,是16bit,2字节。2字节,在汇编语言中,可以被称为一个字。我们的ram,每一个单元的尺寸,都是2字节,一个字。字编号,才是我们这个系统的内存地址。而我们的系统中,内存地址依然是从0开始编号。

举例来说,在我们这个系统中,内存地址0,它对应着现实内存的地址0和地址1。

本系统内存地址       现实内存的地址

0                              0和1

3                              6和7

10                            20和21

1024                       2048和2049

(三)指令码讲解

我来讲一讲本系统使用的4条指令的功能。

首先来看下面一条指令。

格式    机器指令编码    汇编指令    功能解释
4          00100                 Sdal n      将常数n送入累加器da的低8位,并扩充成16位无符号数

 

上述指令,它是一个基本的立即数加载指令。我们平时所说的常数,指的是1,2,3,3.5等等的整数与小数之类的,数值保持不变的。在程序设计语言中,英文字符,中文字符也都是常数。

如果你在C语言中定义了如下的代码

#define NUM_01  102

那么,NUM_01 也成为了一个常数,它代表着102。

如果你在英特尔8086汇编语言中定义了如下的代码

NUM_02   =   103

则 NUM_02 也会称为一个常数,所代表的数是103。在汇编语言中,常数,也被称作立即数。这是因为,很多时候,汇编语言或者机器语言中参与运算的数,很多时候是需要去寻址的。这个数,要么是被存放在寄存器中,要么是被存放在内存地址里面。而有的时候,实际参与运算的数,并不存放在寄存器或者内存中,而是在指令中直接给出这个常数。所以,在汇编语言中,常数就被称作立即数了。

把它叫做立即数,是因为不需要从寄存器或者内存中将其寻找和取出来,而是可以立即从指令码中得到。

格式4所对应的指令的功能是,将立即数n送入累加器的低8位,并且扩充成为16位的数。

比如说,我们可以将30这个整数,送到累加DA中,并且扩充为16位的数。

在这里,为啥会提到扩充为16位呢?

现实中的处理器,它可以有着不同尺寸的指令。有的指令为1字节,有的为2字节,也有3字节和4字节,乃至更多的字节的指令。而在我们的系统中,所有的指令都是2字节的大小。

一个机器指令,要分为操作码和操作数两部分。我们这个系统里面,所有的指令都是操作码占一个字节,操作数占一个字节,所以都是2字节的指令。

在我的这个系统中,我设置了8个通用寄存器,而实际使用到的,仅仅是第一个通用寄存器,累加器。这个累加器是16位的。

 Sdal n,这个汇编指令,它的操作码要占据一个字节,其中会包含机器指令编码【00100】。操作数n也要占据一个字节。操作数n为8位,一个字节。本指令,其实是要将8位的立即数n送入16位的累加器DA中。

在操作的时候,是将8位的立即数n送入累加器DA的低8位,而将DA的高8位清零。

我这样子解释,希望大家能听懂。

我们再来看下一条指令

格式    机器指令编码    汇编指令    功能解释
6          00110                 Str r          将累加器da的内容送到dram的r单元保存

上述指令,是将累加器DA中的数,送入内存单元r中。

比如说,将累加器DA中的数12送入内存单元63中。

注意,我们系统的内存单元63,它的尺寸是2字节的。它对应着现实的内存的126和127两个字节单元。

在这里,我所使用的汇编指令符号,都是抄的姜咏江的书的。我自己其实并不喜欢这种风格的汇编书写格式。因为,我平时所用的,基本上都是英特尔汇编,我更喜欢【mov ax, cx】,【add cx, [1234H]】这样的书写方式。然而,我在写代码的时候,还是偷懒了,没有去认真地设置指令的机器码编码格式,也没有去认真地设置汇编指令书写格式。

当时写代码的时候,我是追求着,快点将这个项目给写完,凑合着搞出来一个简易的CPU就行了,所以也没有认真地去设计指令格式啥的。

如果以后,我自己再去认真一些地,去写一个CPU的话,我是希望,能够将6502 CPU,给实现出来。如果能够再认真一些,我希望能够将8086 CPU,给部分地实现出来,好在自己写的8086 CPU里面,运行着8086汇编代码。

本项目所用的汇编指令格式,如果你不需要这样的符号,你就自己去改好了。此处,我实在是不想费这个事。

最后,我们再来看剩余的两个指令的格式。

格式    机器指令编码    汇编指令    功能解释
2          00010                 Add r        dram的r单元的数与累加器da相加,结果放在da中
7          00111                 Sub r        dram的r单元与累加器da相减,结果放在累加器da

2号和7号指令,分别是加法与减法指令,将DRAM的r单元中的数与累加器DA中的数作运算,运算结果存放在累加器DA中。

我这里所列出的汇编指令里面,都没有涉及通用寄存器的编号的问题。像是 Add rSub rStr r ,都是在汇编指令里面,仅仅指出了内存单元 r,而并未指出要操作哪个通用寄存器。

之所以未指定寄存器的编号,这是因为,在我们的这个系统中,仅仅使用了一个通用寄存器,就是第1个通用寄存器,累加器DA。

结束语

关于指令格式,其实本节并未完全讲完。然而,这一节不可能讲完。因为,还有一部分内容,是需要在讲译码器的时候,才能去讲解的。

这一节内容,我写得比较累。因为不知道要咋去讲。希望你已经看懂了我所讲的内容。如果没有看懂,那就请私信联系我好了。

相关文章:

简易CPU设计入门:本CPU项目的指令格式

在这一节里面&#xff0c;主要是理论知识&#xff0c;基本上不讲代码。不过&#xff0c;本项目的代码包&#xff0c;大家还是需要下载的。 本项目的代码包的下载方法&#xff0c;参考下面的链接所指示的文章。 下载本项目代码 本节&#xff0c;其实是要讲本项目CPU的指令集。…...

Datawhile 组队学习Tiny-universe Task01

Task01&#xff1a;LLama3模型讲解 仓库链接&#xff1a;GitHub - datawhalechina/tiny-universe: 《大模型白盒子构建指南》&#xff1a;一个全手搓的Tiny-Universe 参考博客&#xff1a;LLaMA的解读与其微调(含LLaMA 2)&#xff1a;Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子…...

MCU与SOC的区别

自动驾驶中 MCU 与 SoC 的区别 在自动驾驶系统中&#xff0c;**MCU&#xff08;微控制单元&#xff0c;Microcontroller Unit&#xff09;和SoC&#xff08;系统级芯片&#xff0c;System on Chip&#xff09;**都是关键的电子元件&#xff0c;但它们在性能、功能和应用领域等…...

51单片机-DS18B20(温度传感器)AT24C02(存储芯片) IIC通信-实验2-温度实时监测(可设置阈值)

作者&#xff1a;王开心 座右铭&#xff1a;刻苦专研&#xff0c;百折不挠&#xff0c;千磨万击还坚韧&#xff0c;任尔东西南北风&#xff01;干就完了&#xff01;&#xff08;可交流技术&#xff09; 主要利用DS18B20芯片去采集温度&#xff0c;通过采集的温度能够自动保存…...

Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能

目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装…...

msvcp140.dll丢失如何解决?msvcp140.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到msvcp140.dll丢失的情况时&#xff0c;应该如何解决呢&a…...

高效财税自动化软件如何提升企业财务工作的效率与准确性

在当今企业运营中&#xff0c;财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策&#xff0c;还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战&#xff0c;财务管理亟需进行持续的转型与提升&#xff0c;为企业高质量发展目标的实现…...

Leetcode 3286. Find a Safe Walk Through a Grid

Leetcode 3286. Find a Safe Walk Through a Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;3286. Find a Safe Walk Through a Grid 1. 解题思路 这一题的话思路上就是一个宽度优先遍历&#xff0c;我们按照health进行排序进行宽度优先遍历&#xff0c;看看在health被消…...

shell脚本语法

shell脚本的变量 系统变量 系统变量是操作系统用来存储配置信息的变量&#xff0c;它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。以下是一些常见的系统变量类别和它们可能包含的内容&#xff1a; 环境变量&#xff1a;这些…...

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”&#xff0c;我们叫它互联网&#xff0c;而这条公路上的车辆&#xff0c;则是数据包。你可以把 TCP&#xff08;传输控制协议&#xff09;想象成一位交通警察&#xff0c;负责管理这些车辆的行驶速度&#xff0c;以防止交通堵塞——也就是网络拥塞。 第一…...

(黑马点评) 五、探店达人系列功能实现

5.1 发布和查看探店笔记 5.1.1 发布探店笔记 这块代码黑马已经完成了&#xff0c;在发布探店笔记界面&#xff0c;有两块内容是需要上传的。一是笔记内容&#xff0c;二是笔记配图。其中笔记配图部分黑马使用的是上传到本地前端服务器上面的。我我觉得可以将图片文件发布在阿里…...

SQLiteDatabase insert or replace数据不生效

在Android开发中&#xff0c;如果您在SQLite数据库中更新了数据&#xff0c;但重启应用后更新的数据不再生效&#xff0c;那么可能的原因有&#xff1a; 更新操作没有正确执行&#xff0c;可能是由于SQL语句错误或者数据库没有正确打开。 更新操作在事务中没有被正确提交。 更…...

基于Python实现一个浪漫烟花秀

为了实现一个类似烟花秀的效果&#xff0c;我们可以通过复杂的粒子系统来模拟烟花的升起、绽放和下落效果。以下是一个示例&#xff0c;旨在创建更为动态和逼真的烟花秀效果。 示例代码 这个代码示例将使用 matplotlib 和 numpy&#xff0c;并实现更丰富的视觉效果&#xff1…...

电气自动化入门03:安全用电

视频链接&#xff1a;2.1 电工知识&#xff1a;触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击&#xff1a;电流通过人体。 电伤&#xff1a;电流热效应…...

【深度学习】(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…...

前端面试记录

js 1. 函数式编程 将计算过程视为一系列的函数调用,函数的输出完全由输入决定&#xff0c;不依赖于或改变程序的状态,使得函数式编程的代码更加可预测和易于理解。 函数式编程的三个核心概念&#xff1a;纯函数、高阶函数和柯里化。 高阶函数&#xff1a;函数可以作为参数传…...

裁员了,很严重,大家做好准备吧!

最近刷到这样一个故事&#xff1a; 一个网友在大厂当牛马接近10年&#xff0c;部门优秀员工&#xff0c;业绩一直很稳&#xff0c;没想到&#xff0c;今年公司引进AI降本增效&#xff0c;开始大幅裁员&#xff0c;有些部门一夜之间被连锅端&#xff01; 上个月果然轮到他了&a…...

uniapp组件uni-datetime-picker选择年月后在ios上日期不显示

uniapp组件uni-datetime-picker选择年月后在ios上日期不显示 操作步骤&#xff1a; ios 选择年月 预期结果&#xff1a; 日期变为选择年月的日期 实际结果&#xff1a; 日期不显示 bug描述&#xff1a; uni-datetime-picker 2.2.22 ios点击年月选择后日期不显示 解决方案 …...

01_快速入门

读取数据 import pandas as pd# df pd.read_excel(https://xxxx/xxx//xx.xslx) # 读取网络数据 # df pd.read_excel(rd:\data\xx.xslx) # 读取本地文件 # 如果是csv文件&#xff0c;用read_csv()函数 df pd.read_csv(seaborn/iris.csv)查看数据 df.head() # 前5条记录 d…...

数据结构之分文件编译学生管理

list.h #ifndef LIST_H_ #define LIST_H_ #define MAX 30 typedef struct {int id;//学号char name[20];//姓名char major[20];//专业int age;//年龄 }student,*Pstudent;typedef struct {student data[MAX];//储存学生信息的数组int len;//统计学生个数 }list,*Plist;Plist c…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...