计算机组成原理——第四章指令系统(上)

news/2024/11/25 2:50:06/

提示:待到秋来九月八,我花开后百花杀

文章目录

  • 前言
  • 4.1.1 指令格式
  • 4.1.2 扩展操作码指令格式
  • 4.2.1 指令寻址
  • 4.2.2 数据寻址
  • 4.2.3 偏移寻址
  • 4.2.4 堆栈寻址
  • 汇总


前言

通过第二章我们学习了运算器是如何进行加减乘除,移位运算操作的,通过第三章学习了数据是如何存放于各种各样的存储器当中的,CPU又是如何从存储器中取走数据的,之前我们说过控制器是控制各种各样的部件,协调部件进行工作的,这一章主要是说控制器需要的指令如何设计


提示:以下是本篇文章正文内容,下面案例可供参考

4.1.1 指令格式

指令
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位,一台计算机的所有指令的集合构成该计算机的指令系统,也称为指令集,一个计算机只能执行自己的指令系统中的指令,不能执行其他系统的指令
一条指令通常要包括操作码字段和地址码字段两个部分,并且一个指令中可能包含多个地址码,根据地址码的数目不同,可以将指令分为零地址指令,一地址指令,二地址指令
零地址指令
1,不需要操作数,如空操作,停机,关中断等指令
2,堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压会栈顶,(后缀表达式)
一地址指令
1,只需要单操作数,如加一,减一,取反,求补等
指令含义:OP(A1)->A1 完成一条指令需要三次访存,取指->读A1->写A1
2,需要两个操作数,但是其中一个操作数隐含在某个寄存器,如隐含在ACC中
指令含义:(ACC)OP(A1)->ACC 完成一个指令需要两次访存,取值->读A1 ,这里因为不需要再放回数据,而是放回到ACC 所以少了一次访存
二,三地址指令
请添加图片描述
四地址指令
请添加图片描述
指令字长
一条指令的总长度(可能会变)
我们所说的半字长指令,单字长指令,双字长指令是说是机器字长的多少倍,指令字长会影响取指令所需要时间,如机器字长=存储字长=16bit,则取一条双字长指令需要两次访问内存
定长指令字结构:指令系统中所有指令的长度都相同
变长指令字结构:指令系统中各种指令的长度不等
按操作码长度进行分类
请添加图片描述
按操作类型分类
转移操作本质上来说就是实现的程序执行流的变化,如if else 这个时候就不是顺序的 有可能会发生跳转,其实也就死改变PC的值
请添加图片描述
本节回顾
请添加图片描述

4.1.2 扩展操作码指令格式

我们讲的扩展操作码指令格式是定长指令字结构,可变长操作码
CPU读入是直接读入16位的但是根据前n位1的个数来确定式几位地址指令,如下图前四位全1 则是二地址指令,前六位是1 则是一地址指令,前11位全1 则一定是零地址指令
请添加图片描述
请添加图片描述
二地址12条中大于1011的数还剩下1100,1101,1110 ,1111,你会发现这四个数都是11 开头的,所以加下来如果前六个都是全一的也就超过来二地址指令的范围,后面四bit又是一个地址,所以就留下了中间的六位用来表示操作指令,同样的若是比111101 大的也就是111110 此时前11位就是全1的,后面留有五位就是可以表示32种操作,
请添加图片描述
指令操作码
请添加图片描述

4.2.1 指令寻址

顺序寻址
这一节主要探讨指令是如何确定下一条指令的存放地址(始终由程序计数器PC给出),指令寻址可分为顺序寻址和跳跃寻址,因为有的是采用变长指令字结构的话,此时PC简单的加1 肯定是不行了,若是主存按照字节编址主存按字节编址,也就以为着每一个指令占据两个地址,则此时的PC应该是加2,若是采用变长指令字结构,读入一个字,根据前面的操作码,来确定是几地址指令,由此来判断此条指令的总字节数n 修改PC的值,此时也就是(PC)+n->PC,所以这个n 是根据指令字长和系统是按照字编址还是按照字节编址来确定的

跳跃寻址
由转移指令指出,如这里的JMP,类似C语言中的goto语句
请添加图片描述
本节回顾
请添加图片描述

4.2.2 数据寻址

观察上图你会发现上面是从0地址开始的,但是若是不从0开始 此时若是依然JMP 跳转到7这样不是很明显是错的吗,所以也就有了数据寻址:确定本条指令的地址码指明的真实地址,接下来我们会学习十种数据寻址的方式,然后知道用那种方式来解释这种地址码的含义,通常我们可以在地址码的前面加上这样的几个bit位,这里有十种,也就需要四个bit位便足够了,如这里我们中间加上几个寻址特征来确定寻址方式,若是有多个地址 自然每一个地址的方式也可能不同,这也就有可能有多种寻址特征、
实际应用中,往往是多种寻址方式复合使用
直接寻址

请添加图片描述
间接寻址
其实也就是相当于指针的形式,(A)依然是一个地址,若是真实的地址则是一次间址,若是(A)需要在看((A))则是二次间址
请添加图片描述
寄存器寻址
这个地址码指向的不是某一个内存单元而是指向了某一个寄存器,CPU会有许多的寄存器,每一个寄存器都有一个编号,直接去指向的这个寄存器找就可以了
请添加图片描述
寄存器间接寻址
比起之前我们提到的基于主存的间接寻址来说,这一次间接找地址的过程是不需要访存的,因此更快
请添加图片描述
隐含寻址
有的指令显式的给出一个地址,另外一个地址被隐藏的银隐含于ACC

请添加图片描述
立即寻址
直接寻址放的式操作数的地址,而立即寻址则存放的是操作数,寻址特征中我们写了一个# 号也就意味着后面跟的形式地址就是一个立即数,
请添加图片描述

4.2.3 偏移寻址

以某个地址作为起点 形式地址视为偏移量,这节我们主要学习三种,相对寻址(以程序计数器PC所指地址作为起点),基址寻址(以程序的起始存放地址作为起点),变址寻址(程序员自己决定从哪里作为起点)
基址寻址
优点是便于程序“浮动”方便实现多通道程序并发运行,所谓浮动就是指可以从内存中任何一个地址作为一个起始地址,每一个程序运行之前CPU的基址寄存器的值通常都是存放于程序控制块PCD中的,基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量),普通程序员可以使用汇编语言来直接操纵某一个通用寄存器中的值,读或者写都行,但是当某一个寄存器被指定作为一个基址寄存器后,那么这个寄存器中的值也是不能修改的,其内容会由操作系统进行管理,同时由于基地址的位比较长,也可扩大寻址范围
请添加图片描述
请添加图片描述
变址寻址
这种变址寻址在循环中有很大作用,在数组的处理过程中,可设定A为数组的首地址,不断改变变址寄存器ix的内容,便可很容易的形成数组种任一数据的地址,特别适合编制循环程序
请添加图片描述
相对寻址
是相对于下一个指令地址的偏移量,这个偏移量可正可负,用补码表示,因为当cpu取出一条指令之后,pc一定是自动加n的,自动指向下一条指令,优点:操作数的地址不是固定的,它随着PC的值变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,(一段代码再程序内部浮动,直接寻址的浮动是整段程序的浮动,而这里是一段代码的浮动)但是这里也就有了一个问题,若是修改程序段,数组始址不再是存放于7这个位置,这里一种解决方法就是将数据段,程序段分开
请添加图片描述
请添加图片描述
本节回顾
注意这里的偏移量是相对于下一个指令的偏移量,这里两个数进行比较是通过相减,相减的结果结果信息会记录再程序状态字寄存器中PSW,根据PSW的某几个标志位进行条件判断,来决定是否转移
请添加图片描述

4.2.4 堆栈寻址

堆栈指针存放于一个寄存器中,也就意味着我们不需要一个显式的操作地址,它的操作地址是隐藏于SP这个寄存器中的
软堆栈:从主存中划分一部分区域作为,也就意味着弹出一个元素 或压入一个元素都是需访问主存,所以没有直接放在寄存器的快
出栈时之间EA(有效地址)便可,但是入栈的时候需要先加一或者减一才能入栈
请添加图片描述

汇总

取值的时候是需要访存的,但是这里指的是指令执行期间
请添加图片描述


http://www.ppmy.cn/news/43238.html

相关文章

Java14新特性

一、Java14新特性 Records(记录):Records是一种新的类类型,它允许您声明一个不可变的数据类,该类包含默认方法和构造函数。你可以使用record关键字来定义一个记录。 Switch表达式(Switch Expressions&…

Linux内核源码下载方式

官网 Linux内核源码下载页面 https://www.kernel.org/pub/linux/kernel/页面介绍: HTTP https://www.kernel.org/pub/ GIT https://git.kernel.org/ RSYNC rsync://rsync.kernel.org/pub/HTTP地址(https://www.kernel.org/pub/)提供了HTTP…

pytorch lightning之快速调试

调试代码 此阶段主要测试各阶段代码是否有问题。 快速测试 fast_dev_run项可以配置train/val/test阶段的循环次数,跑完就停止代码,快速查看各流程代码正确性,避免train调试后训练又在val/test阶段出错,白白浪费时间和计算成本。…

Hadoop 开启 histotryserver

Hadoop 开启 histotryserver Hadoop自带了一个历史服务,可以通过历史服务在web端查看已经运行完的Mapreduce作业记录, 默认情况下,Hadoop历史服务是没有启动的,需要自行启动。 启动后,在下图中点击history可跳转至历史…

C#基础学习--转换

目录 什么是转换 隐式转换 显式转换和强制转换 ​编辑 转换的类型 数字的转换 ​编辑 隐式数字转换 溢出检测上下文 显式数字转换 引用转换 隐式引用转换 显式引用转换 有效显式引用转换 装箱转换 装箱是创建副本 装箱转换 拆箱转换 用户自定义转换 用户自定义…

【C++进阶】function和bind及可变模板参数

文章目录1. function和bind1.1 function使用方法1.2 bind2. 可变模板参数2.1 可变模板参数函数2.2 可变模板参数的展开1. function和bind C中的function和bind是为了更方便地进行函数对象的封装和调用而设计的。 function是一个通用的函数对象容器,可以存储任意可…

Wombat:93%ChatGPT性能!无需RLHF就能对齐人类的语言模型

文 | zzy文章地址: https://arxiv.org/abs/2304.05302v1训练代码:https://github.com/GanjinZero/RRHF模型权重:https://huggingface.co/GanjinZero/wombat-7b-delta文章提出RRHF一种无须强化学习的对齐方法训练语言模型。该文章利用chatGPT或者GPT-4作为…

CAN 发展史

一、起源 1986 年 2 月 Robert Bosch 公司在 SAE 汽车工程协会 大会上介绍了一种新型的串行总线 CAN控制器局域网,那是 CAN 诞生的时刻。今天,在欧洲几乎每一辆新客车均装配有 CAN 局域网。同样,CAN也用于其他类型的交通工具,从火…