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

news2024/9/19 23:06:21

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

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

下载本项目代码

本节,其实是要讲本项目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。

结束语

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

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

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

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

相关文章

大模型蒸馏技术

一篇题为《The Mamba in the Llama: Distilling and Accelerating Hybrid Models》的论文证明&#xff1a;通过重用注意力层的权重&#xff0c;大型 transformer 可以被蒸馏成大型混合线性 RNN&#xff0c;只需最少的额外计算&#xff0c;同时可保留其大部分生成质量。 先来说…

Python学习——【2.1】if语句相关语法

文章目录 【2.1】if语句相关一、布尔类型和比较运算符&#xff08;一&#xff09;布尔类型&#xff08;二&#xff09;比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…

AlexNet项目图片分类通用模型代码

目录 一&#xff1a;建立AlexNet模型&#xff08;在model文件中写&#xff09; 1.构造5层卷积层 2.构造3层神经网络层 3.forward函数 4.模型最终代码 二&#xff1a;训练数据&#xff08;在train中写&#xff09; 1.读出数据 2.训练 3. 测试模型更新参数 4.完整的训练…

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/姜子…

新的突破,如何让AI与人类对话变得“顺滑”:Moshi背后的黑科技

你有没有想过,当我们跟智能音箱、客服机器人或者语音助手对话时,它们是怎么“听懂”我们说的话,又是怎么迅速给出回应的?就好像你对着Siri、Alexa说一句:“给我订个披萨”,它立刻明白你想要干嘛,然后帮你下单。背后的技术其实比我们想象的要复杂得多,但现在,有了Moshi…

Qt_布局管理器

目录 1、QVBoxLayout垂直布局 1.1 QVBoxLayout的使用 1.2 多个布局管理器 2、QHBoxLayout水平布局 2.1 QHBoxLayout的使用 2.2 嵌套的Layout 3、QGridLayout网格布局 3.1 QGridLayout的使用 3.2 设置控件大小比例 4、QFormLayout 4.1 QFormLayout的使用 5、…

【2024】前端学习笔记8-内外边距-边框-背景

学习笔记 外边距&#xff1a;Margin内边距&#xff1a;Padding边框&#xff1a;Border背景&#xff1a;Background 外边距&#xff1a;Margin 用于控制元素周围的空间&#xff0c;它在元素边框之外创建空白区域&#xff0c;可用于调整元素与相邻元素&#xff08;包括父元素和兄…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月19日新模型预测第92弹

经过90多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;90多期一共只错了10次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0…

教育政策与智能技术:构建新时代教师队伍

据最新统计&#xff0c;我国目前拥有各级各类教师共计1891.8万人&#xff0c;这一庞大的教师群体不仅支撑起了全球规模最大的教育体系&#xff0c;更成为了推动教育创新与变革的主力军。面对教育数字化的不断发展&#xff0c;育人内容、目标要求、方式方法的全面升级&#xff0…

【测向定位】差频MUSIC算法DOA估计【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;554073254 摘要 利用多频处理方法&#xff0c;在不产生空间混叠的情况下&#xff0c;估计出高频区域平面波的波达方向。该方法利用了差频&#xff08;DF&#xff09;&#xff0c;即两个高频之间的差。这使得能够在可…

鹏鼎控股社招校招入职SHL综合能力测评:高分攻略及真题题库解析答疑

鹏鼎控股&#xff08;深圳&#xff09;股份有限公司&#xff0c;成立于1999年4月29日&#xff0c;是一家专注于印制电路板&#xff08;PCB&#xff09;的设计、研发、制造与销售的高新技术企业。公司总部位于中国广东省深圳市&#xff0c;并在全球多个地区设有生产基地和服务中…

【软考】数据字典(DD)

目录 1. 说明2. 数据字典的内容2.1 说明2.2 数据流条目2.3 数据存储条目2.4 数据项条目2.5 基本加工条目 3. 数据词典管理4. 加工逻辑的描述4.1 说明4.2 结构化语言4.3 判定表4.3 判定树 5. 例题5.1 例题1 1. 说明 1.数据流图描述了系统的分解&#xff0c;但没有对图中各成分进…

软件自动定时启动器-添加可执行文件软件,设置启动的时间,也可以设置关闭的时间-供大家学习研究参考

点击添加软件&#xff0c;可以添加可执行文件软件&#xff0c;设置启动的时间&#xff0c;也可以设置关闭的时间 注意&#xff0c;时间为00&#xff1a;00&#xff1a;00 等于没设置&#xff0c;这个时间不在设置范围&#xff0c;其他任何时间都可以。 下载地址&#xff1a; h…

【C++ Primer Plus习题】16.9

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <ctime> #include <v…

驱动---动态模块编译

动态模块编译 ctags 用法 创建文件 ------- ctags -R 一定要在顶层目录下 1&#xff0e; ctags –R * 2. vi –t tag (请把tag替换为您欲查找的变量或函数名) 3&#xff0e; Ctrl ] (跳转到要找的目标) 4&#xff0e; Ctrl T (回跳) 5&#xff0e; set tag/p…

解决使用nvm管理node版本时提示npm下载失败的问题

目录 一、引言 二、解决步骤 1. 访问该网站下载对应版本的npm Release v6.14.18 npm/cli GitHubthe package manager for JavaScript. Contribute to npm/cli development by creating an account on GitHub.https://github.com/npm/cli/releases/tag/v6.14.18 2. 解压到n…

mac使用技巧

mac使用技巧 快捷键 Command-X&#xff1a;剪切所选项并拷贝到剪贴板。Command-C&#xff1a;将所选项拷贝到剪贴板。这同样适用于“访达”中的文件。Command-V&#xff1a;将剪贴板的内容粘贴到当前文稿或应用中。这同样适用于“访达”中的文件。Command-Z&#xff1a;撤销上…

高级算法设计与分析 学习笔记6 B树

B树定义 一个块里面存了1000个数和1001个指针&#xff0c;指针指向的那个块里面的数据大小介于指针旁边的两个数之间 标准定义&#xff1a; B树上的操作 查找B树 创建B树 分割节点 都是选择正中间的那个&#xff0c;以免一直分裂。 插入数字 在插入的路上就会检查节点需不需要…

Ansible——Playbook基本功能???

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;---以及多个---&#xff1f;&#xff1f;使用 include 指令 1. 基本结构2. 数…

搜维尔科技:Haption力反馈遥操作解决方案

硬件设备 多种力反馈设备型号&#xff1a; 1.Haption Virtuose 6D&#xff1a;能在 6 个自由度&#xff08;x、y、z 轴 3 个平移和 3 个旋转&#xff09;上提供精确的力反馈&#xff0c;工作空间相当于一条人体手臂的活动范围&#xff0c;最大力度和旋转扭矩分别高达 35N 和 …