指令的存储与执行初探

前言导读:从零开始构造一台二进制加法器

假设一个处理器与存储器相连,存储器中存放着一些指令。这些指令通过处理器发出的寻址信号被加载到处理器中,这个过程称为取指令

下面通过简单的加法运算,来看一下指令和数据是怎么存储在RAM中的。

如果要将76ABh236Ch相加,先将这两个加数存储在数据RAM中如下:

这里写图片描述

这是两个加数存储在RAM中的位置,为了方便运算,将高低字节分别存储。可以看到这个RAM存储器的最小存储单元是一个字节,地址是一个16位地址,所以这个RAM总共由2的16次方个小的8位RAM组成:即该RAM的大小为64K*8

说完了数据的存储情况,再看一下代码的存储情况:
这里写图片描述

实现该设计的关键是,将这些代码输出到3个不同的寄存器中保存。第一个寄存器保存代码本身,第二个寄存器保存地址的高字节,第三个寄存器保存地址的低字节。第二个和第三个寄存器的输出构成了数据RAM的一个16位地址。

取指令在这里就是指的寻址RAM,将代码RAM中的指令放进加法器中执行。在这里一条指令有3个字节,所以取每条指令需要3个时钟周期,由于第二位和第三位寄存器中保存的是RAM中的一个地址,所以在取到这个地址后还需要取RAM的相应地址,以获得该地址上的数据。所以一个完整的指令周期在这里需要4个时钟周期。

现在我们使用的是3字节长的指令格式,第二个字节和第三个字节用来指明操作数在RAM中的存储地址,为了方便,完全没有必要取分数据RAM和代码RAM。

例如,现在这里有一个算术运算:45h+A9h-8Eh。如何通过指令代码来描述这个运算?

这里写图片描述

从0000h到000Ch都是指令代码,从0010h开始的3个存储单元,存放的是操作数据。可以看到在同一个RAM上已经完全可以描述一个算术运算。

此时,如果需要在原来的运算结果基础上再加上两个数:45h+A9h-8Eh+43h+2Fh

有两种做法:

第一种就是从0000h开始,向存储器中输入新的指令以替换原来所有的指令,这种方式不需要懂任何脑筋,是最笨的方法,就像你从北京出发去南京旅游,到了南京以后突然改变主意,想去上海,然后你又回到北京,买了北京到上海的票。

第二种做法利用了前面的计算结果,接着做计算,这才是正常的思路。先将000Ch处的halt指令去掉,从000Ch开始加上新增的两条add指令和halt指令,可是这样的话新增的指令会覆盖掉从0010h处开始存放的原来的数据。于是又有另一种方法,能不能从0014h以后的某片RAM区域开始,存放新的指令以及数据,这时两片区域是不连续的:

这里写图片描述

在这里假设从0020h开始加上新的指令以及数据,可是问题又来了,要知道程序计数器是从0000h开始顺序递增的,不会从一个地址跳到另外一个不相邻的地址,要想实现跳转的功能,得从硬件层面对计数器进行改进,这是可以实现的,具体的方法这里就不展开叙述了

通过对计数器的改进,我们新增了一条指令:Jump指令。即加法器(此时的加法器可以理解为一个简易的CPU,它会去执行从RAM中读取到的指令)一执行到Jump指令,改造后的计数器就会被强制输出该Jump指令后的16位地址值,代码的执行不再是顺序执行。

将原来000Ch处的halt指令修改如下:
这里写图片描述

当pc运转到000Ch的时候,被强制输出0020h,即代码跳到0020h开始接着执行。在硬件层面上这只是一个很小的改动,可是对于代码的执行而言,是一个很大的改进。有了Jump指令,我们就可以在RAM存储空间中自由的跳转,其实相比较于跳转指令,我们更需要的是让跳转指令在某个条件下才执行。

例如,现在有一个乘法运算:00A7h*001Ch。小学生都学过,乘法运算的实质就是加法运算,即00A7h和001Ch相乘的结果和把001Ch(十进制为28)个00A7h累加的结果相同。

这里写图片描述

这里写图片描述

可以看到,从0000h开始到0012h,使RAM地址1004h和1005h里面保存的值是00A7h乘以1的结果。如果将这段区间的指令重复28次,当然可以得到想要的乘法运算结果,可是这种方法挺笨的。

如果用到之前提过的一个新指令,就是在0012h处放置一条Jump。

这里写图片描述

这样确实能让代码不断的重复,但是这样会有一个问题,0000h到0012h之间的指令会永远重复的执行,因为没有一条halt指令让它停下来。这时其实我们需要的是一种条件跳转指令,就是让某段指令重复指定的次数,一旦达到某个值,就不重复了。要实现条件跳转,还是先得从硬件层面进行优化:

首先新增一个一位锁存器,该锁存器称为零锁存器,将该锁存器与加法器和或非门连接如下:
这里写图片描述

只有当上一步操作是add、subtract、add with carry、subtract with borrow时,零锁存器才会存住一个数,至于这个数是0还是1,就要看上一步操作的输出是什么了。如果加法器的8位输出全为0时,零锁存器里的值为1。如果加法器8位输出有一个为1,零锁存器里的值就是0。

现在通过对硬件的改进,新增了下面四种跳转指令:

  • Jump If Zero(零跳转)
  • Jump If Carry(进位跳转)
  • Jump If Not Zero(非零跳转)
  • Jump If Not Carry(非进位跳转)

要实现乘法运算,我们使用一个非零跳转,对应的指令码为33h

将0012h后的指令设计如下:
这里写图片描述

这一段指令执行的操作是,将001Ch(其中一个乘数)00FFh相加,这两个数相加的结果其实就等同于从001Ch中减一的结果,如果是第一次执行,这个结果为001Bh,所以加法器的输出不全为0,执行非零跳转,跳转到0000h处开始继续执行下一轮加法运算,所以上面这段代码其实起到了一个计数的功能,记录了当前的累加执行到哪一次了,当执行完最后一次类加,1003h里保存的值是0001h,加上00FFh后,结果为0,即加法器的输出全为零,所以不会执行非零跳转指令,而是接着执行001Eh中的halt指令(注意:这个地址里的FFh,我们既可以把它当作一个普通的二进制数,也可以把它当作一个halt指令)。

还需要特别注意的是,这里的非零跳转中的非零指的是加法器的输出非零,而不是指的锁存器里的值非零与否。如果把非零理解为零锁存器中的值的话,逻辑就完全相反了。

至此我们通过一个新增的指令,在加法的基础上完成了乘法的操作。

通过不断的硬件完善,特别是加上条件跳转指令后,已经具备了计算机的雏形。能否控制循环是计算器计算机的区别。上面演示了如何通过条件跳转实现乘法运算,用类似的方法还能实现除法运算,甚至是开平方、取对数、三角函数等等也完全可以实现,只不过相对复杂一些。

转载于:https://www.cnblogs.com/KKSJS/p/9622810.html

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

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

相关文章

java 中的流_Java中的流(IO

Java中的流(IO流.java.io包中定义了多个流类型(类或抽象类)来实现 输入 / 输出功能,可以从不同的角度对其进行分类:按单位可分为: 字节流 (一个字节一个字节的读取) 字符流 (一个字符一个字符的读取『一个字符是两个字节』)按…

python基础学习_35岁零基础学习Python编程是否能学得会并用得上

首先,学习编程语言并没有年龄上的限制,在当前的工业互联网时代,不论是初级职场人还是资深职场人,学习一门编程语言都是有必要的,从这个角度来看,35岁开始学习编程语言是完全可以的。虽然说学习Python语言并…

css的再深入7(更新中···)

1.transparent 透明的 2.placeholder 提示语 写页面 搞清结构层次,保证模块化,让他们之间不能受到影响 (1) 元素性质 (2) 标准流 浮动带来的脱离文档流撑不起父级的高度的问题可以采用清除浮动的方式消除影响,absolute和fixed带来的脱…

窥探JBoss Fuse 6.1的新功能

我对即将发布的Fuse 6.1版本感到非常兴奋,因为有很多很棒的新功能是我真正想要的,而且已经有一段时间了。 HAWT工具。 因此,这是一个快速的先睹为快,主要关注于新版本的Fuse Management Console(现已由hawtio开源项目…

[C语言] 选择排序之直接选择排序的特性及实现

[C语言] 选择排序之直接选择排序的特性及实现 1、算法特性 直接选择是一种简单、不稳定的选择排序方法,属于最为基础的排序方法之一。 其时间复杂度最好情况为O(n)、最差为O(n)、平均为O(n)&…

电脑测速软件_联通你我【宽带提速】让网速飞!超实用的宽带测速提速攻略来啦!...

宅在家里,在家娱乐、在家办公、在家上课,都需要畅快的宽带网络,所以很多小伙伴都办理了联通宽带怎样才是正确的宽带测速姿势?小沃给大家介绍两种简便的测速方法,同时说说怎样才能完全释放宽带网速、让咱享受到真正的提…

MyEclipse - 查询使用的JDK版本

查询 MyEclipse 使用的 JDK 版本 MyEclipse 菜单->Windows->Proferences->java->Installs Jres重新设置JDK路径,改为开发程序时的JDK版本(如上图)(我做到这一步就可以了!我的eclipse是7.0,jdk…

解析什么是绝对定位,相对定位与浮动

在理解定位之前,先说一个概念,文档普通流,就是元素标签正常在HTML里的顺序,块级元素从上至下排列,行内元素从左到右排列。 绝对定位 绝对定位:absolute,元素相对于离它最近的已定位祖先元素进…

具有多个查询参数的Camel CXF服务

出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法。 希望该帖子将在下一版本的Camel中变得过时。 (当前,我使用2.7.5) 问题 大于1的查询参数作为null值传递给Camel-CXF服务。 假设网址中有四个查询参数…

《JavaScript高级程序设计》读书笔记(三)基本概念第四小节 操作符

内容---语法 上一小节---数据类型 本小节 操作符---流程控制语句---理解函数 操作符--操作数据值的操作符--算术(如加减)、位操作符、关系、相等--ECMAScript操作符可以适用于很多类型的值--在用于对象时,会先调用对象的valueOf()和&#xff…

el-table数据不显示_数据透视表,一篇就够了

| 函数部分告一段落,这一篇文章助你学懂数据透视表目录:一、创建数据透视表二、数据透视表字段列表值的显示方式三、分析1、切片器2、计算字段3、计算项4、组合四、设计1、分类汇总2、报表布局首先,我们要知道应用数据透视表的前提&#xff1…

app vue 真机运行_使用 HBuilder 将 Vue 项目打包成手机 App

在开发移动端 app 时可以选择原生 app 和 webapp, 原生 app 体验好,开发成本高,相对的 webapp 体验要差,开发成本低。webapp 要求很低,可以说只要会开发web 站就能开发 webapp,这里不讨论怎么选择&#xff…

解决安卓字体偏移:页面整体缩放

在h5中实现一些小标签、按钮的时候,很容易发现部分安卓机型上的字体显示有问题,总会向上偏移2px左右。这是设置padding或line-height无法修复的,与rem也无关,即使在字体大于12px时依然存在。下图来自于网友的分享,从左…

bmp调色板颜色信息重复_如何更改 Linux 终端颜色主题 | Linux 中国

你可以用丰富的选项来定义你的终端主题。-- Seth Kenlon如果你大部分时间都盯着终端,那么你很自然地希望它看起来能赏心悦目。美与不美,全在观者,自 CRT 串口控制台以来,终端已经经历了很多变迁。因此,你的软件终端窗口…

mac 配置java adb环境_MAC 配置android adb命令的环境变量

1,打开终端,敲入命令:sudo vi .bash_profile (如果有密码就为本机登录密码)(如果没有这个文件就会创建一个新的)默认终端目录如图,生成的文件为隐藏文件:(显示隐藏文件命令:defaults write com.apple.finder AppleSho…

mac懒人版_这些实用的Mac软件你迟早会用到,建议收藏!

日常使用mac,遇到不同的问题可以通过不同的应用进行来进行处理,所以称手的工具是必不可少的。然而这些问题也会引导我们去发现更多实用优秀的软件,今天macdown就把自己在使用Mac过程中遇到的一些实用的Mac软件推荐给大家,相信你迟…

Metro风格的Java组合框(JMetro)–重新介绍

我上一篇有关JMetro的文章–我的都市风格的Java外观(或外观)是关于日历选择器控件的外观 。 我本打算使用Tom Eugelink不错的日历选择器,但是当时我了解到它是由Oracle创建并随Java 8一起交付的,因此出于时间的考虑(几…

左斜杠和右斜杠有什么区别_「斜杠云」SEO推广和SEO优化有什么区别?

1,首先,从概念上来说,网络推广就是企业从开始申请域名、租用空间、网站备-案、建立网站、直到网站正式上线开始就算是介入了网络推广活动,而通常我们所指的网络推广是指通过互联网的种种手段,进行的宣传推广等活动&…

python算两个时间之间的天数,将天数转成int型

import time import datetime#计算两个日期相差天数,自定义函数名,和两个日期的变量名。 def Caltime(date1,date2):#%Y-%m-%d为日期格式,其中的-可以用其他代替或者不写,但是要统一,同理后面的时分秒也一样&#xff1…

并发编程-concurrent指南-阻塞队列BlockingQueue

阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列。 适用场景: BlockingQueue通常用于一个线程生产对象,而另一个线程消费对象的场景。 一个线程往里面放,另一个线程从里面取的…