8.指令格式,指令的寻址方式

目录

一. 指令格式

二. 扩展操作码

三. 指令寻址

(1)指令寻址

(2)数据寻址

1.直接寻址

2.间接寻址

3.寄存器寻址

4.寄存器间接寻址

5.隐含寻址

6.立即寻址

7.基址寻址

8.变址寻址

9.相对寻址

10.堆栈寻址


一. 指令格式

指令(又称机器指令):是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。Eg: x86架构、ARM架构。

指令格式:一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。一条指令通常要包括操作码字段和地址码字段两部分。根据地址码数目不同,可以将指令分为零地址指令、一地址指令、二地址指令...

零地址指令OP:

  • 不需要操作数,如空操作、停机、关中断等指令
  • 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶。例如数据结构后缀表达式。

一地址指令OP A1:

  • 只需要单操作数,如加1、减1、取反、求补等。指令含义:OP(A1)→A1,完成一条指令需要3次访存:取指→读A1→写A1
  • 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC)。指令含义: (ACC)OP(A1)→ACC,完成一条指令需要2次访存:取指→读A1

注:A1指某个主存地址(类比C语言指针),(A1)表示A1所指向的地址中的内容(类比指针所指位置的内容)

二地址指令OP A1(目的操作数) A2(源操作数):
常用于需要两个操作数的算术运算、逻辑运算相关指令。指令含义:(A1)OP(A2)→A1。完成一条指令需要访存4次,取指→读A1→读A2→写A1

三地址指令OP A1 A2 A3(结果):
常用于需要两个操作数的算术运算、逻辑运算相关指令。指令含义:(A1)OP(A2)→A3。完成一条指令需要访存4次,取指→读A1→读A2→写A3

四地址指令OP A1 A2 A3(结果) A4(下址):
A4=下一条将要执行指令的地址。指令含义:(A1)OP(A2)→A3。完成一条指令需要访存4次,取指→读A1→读A2→写A3。正常情况下:取指令之后PC+1,指向下一条指令。而四地址指令执行指令后,将PC的值修改位A4所指地址。

地址码的位数有什么影响?n位地址码的直接寻址范围=2^n.若指令总长度固定不变,则地址码数量越多,每一个地址码位数越少,寻址能力越差。

指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)

存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)

半字长指令、单字长指令、双字长指令――指令长度是机器字长的多少倍
指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存。

定长指令字结构:指令系统中所有指令的长度都相等。变长指令字结构:指令系统中各种指令的长度不等

定长操作码:指令系统中所有指令的操作码长度都相同,n位操作码→2^n条指令,控制器的译码电路设计简单,但灵活性较低
可变长操作码:指令系统中各指令的操作码长度可变,控制器的译码电路设计复杂,但灵活性较高

定长指令字结构(指令总长度不变)+可变长操作码→扩展操作码指令格式。

指令按操作类型分类:

二. 扩展操作码

定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般n位操作码字段的指令系统最大能够表示2"条指令。

  • 优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利;
  • 缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。

扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。

  • 优:在指令字长有限的前提下仍保持比较丰富的指令种类;
  • 缺:增加了指令译码和分析的难度,使控制器的设计复杂化。

在设计扩展操作码指令格式时,必须注意以下两点:
(1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
(2)各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

三. 指令寻址

(1)指令寻址

指令寻址:下一条欲执行指令的地址(始终由程序计数器PC给出)。

顺序寻址:(PC)+“1”→PC(1是指令字长,不是存储字长也不是1个字节),先有+1操作(也就是让PC指向下一条指令),然后在执行本条指令。
跳跃寻址:由转移指令指出。每次取指令之后,PC一定会自动+1,指向下一条应该执行的指令,JUMP会把PC的值强制修改。

(2)数据寻址

数据寻址:确定本条指令的地址码指明的真实地址。

例如:左:JMP 7,7就是真实地址;中:7解读为从程序初始地址100的偏移;右:3解读为执行103时PC的偏移量。

求出操作数的真实地址,称为有效地址(EA)。指令中的地址码记为A。为了区别寻址方式,可以在前加几位寻址方式位:

1.直接寻址

直接寻址:指令字中的形式地址A就是操作数的真实地址EA,即EA=A。

一条指令的执行:取指令访存1次,执行指令访存1次,暂不考虑存结果共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。

2.间接寻址

间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址。所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)。

一条指令的执行:取指令访存1次,执行指令访存2次,暂不考虑存结果共访存3次

优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。

3.寄存器寻址

寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在由Ri所指的寄存器内。

一条指令的执行:取指令访存1次,执行指令访存0次(访问寄存器),暂不考虑存结果共访问1次

优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机中寄存器个数有限。

4.寄存器间接寻址

寄存器间接寻址:寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)。

一条指令的执行:取指令访存1次,执行指令访存1次,暂不考虑存结果共访存2次。

特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。

5.隐含寻址

隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。

优点:有利于缩短指令字长。缺点:需增加存储操作数或隐含地址的硬件。

6.立即寻址

立即寻址:形式地址A就是操作数本身(不是操作数在主存的地址,这一点和直接寻址区分开),又称为立即数,一般采用补码形式。#表示立即寻址特征。

一条指令的执行:取指令访存1次,执行指令访存0次,暂不考虑存结果共访存1次

优点:指令执行阶段不访问主存,指令执行时间最短。
缺点:A的位数限制了立即数的范围。

7.基址寻址

基址寻址:以程序的起始存放地址作为“起点”。

左图:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,形成操作数的有效地址,即EA=(BR)+A。

右图:部分计算机没有BR,所以需要借用通用寄存器,在指令中指明要将哪个通用寄存器作为基址寄存器使用。

优点:便于程序“浮动”(修改BR的值即可),方便实现多道程序并发运行。可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)。用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边的浮动)。

注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。

8.变址寻址

变址寻址:程序员自己决定从哪里作为“起点”。有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器。

注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)。而基址寻址中,BR保持不变作为基地址,A作为偏移量。

例如:执行求数组和的操作,如果采用直接寻址,每一次加法对应一条指令,编程就很不灵活:

而如果采用变址寻址方式:

在数组处理过程中,可设定形式地址A为数组的首地址,不断改变变址寄存器lX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。

复合寻址:假如上面的代码存在编号100的起始地址:

9.相对寻址

相对寻址:以程序计数器PC所指地址作为“起点”。把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示。

优点:操作数的地址不是固定的,它随着Pc值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。相对寻址广泛应用于转移指令。

补充:关于汇编语言的比较和跳转:

10.堆栈寻址

堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。

堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP) 。

上面称为硬堆栈,硬堆栈直接使用寄存器,如果在主存中操作,我们称为软堆栈。堆栈可用于函数调用时保存当前函数的相关信息。

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

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

相关文章

Spring 6 资源Resources 相关操作

Java全能学习面试指南:https://javaxiaobear.cn 1、Spring Resources概述 Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletCont…

界面控件DevExpress WPF Splash Screen,让应用启动画面更酷炫!

DevExpress WPF的Splash Screen组件可以为应用程序创建十分酷炫的启动屏幕,提高用户在漫长的启动操作期间的体验! P.S:DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress …

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第二弹)

本次选题都为选择题。涉及到二叉树总结点和叶子结点的计算、二叉树的基本性质、根据二叉树的前序/后序和中序遍历画出二叉树、哈夫曼树等等…希望对你有帮助哦~😝 1.若一颗二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数为() A…

arcgis--二维建筑面的三维显示设置

1、打开ArcScene软件,导入数据,如下: 2、 对建筑面进行拉伸。双击建筑物面图层,打开属性表,选择【拉伸】选项卡,参数设置如下: 显示结果如下:

优化了

v2.0.2版本在 github 发布了。 ## 优化的功能 优化(定时任务): 测试计划与定时任务模块进行了合并,极大的简化了操作步聚。 1、前端页面,测试计划plan,加入1个接口,设置每分钟运行1次。 2、开启定时任务服务,后台日志 …

C#中.NET 6.0 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET 6.0 控制台应用中通过EF访问已有数据库,事实上,在.NET 6.0 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样,数据库EF模型和上下文都是自…

Elastic stack8.10.4搭建、启用安全认证,启用https,TLS,SSL 安全配置详解

ELK大家应该很了解了,废话不多说开始部署 kafka在其中作为消息队列解耦和让logstash高可用 kafka和zk 的安装可以参考这篇文章 深入理解Kafka3.6.0的核心概念,搭建与使用-CSDN博客 第一步、官网下载安装包 需要 elasticsearch-8.10.4 logstash-8.…

HBase学习笔记(3)—— HBase整合Phoenix

目录 Phoenix Shell 操作 Phoenix JDBC 操作 Phoenix 二级索引 HBase整合Phoenix Phoenix 简介 Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据 使用Phoenix的优点 在 Client 和 HBase …

leetcode:138. 随机链表的复制

一、题目: 138. 随机链表的复制 - 力扣(LeetCode) 函数原型: struct Node* copyRandomList(struct Node* head) 二、思路 本题是给出一个单链表,单链表的每个结点还额外有一个随机指针,随机指向其他结点&am…

使用VSCode进行Python模块调试

使用VSCode进行Python模块调试 创建测试文件 创建文件test/a/b.py,且当前工作路径为test/ b.py文件内容: def cal(numa, numb):print(int(numa) int(numb))if __name__ "__main__":import sys# 判断系统参数长度是否为4且判断第2个参数是…

【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!后面的内容会越来越有意思~ 💡往期推荐: 【机器学习基础】机器学习入门(1) 【机器学习基…

【广州华锐互动】VR居家防火逃生模拟演练增强训练的真实性

VR软件开发公司广州华锐互动在消防培训领域已开发了多款VR产品,今天为大家介绍VR居家防火逃生模拟演练系统,这是一种基于虚拟现实技术的消防教育训练设备,通过模拟真实的火灾场景,让使用者身临其境地体验火灾逃生过程,…

Telnet 测试 UDP 端口?

Telnet 并不支持 UDP 端口的测试,可以使用 nc 命令来进行测试。nc 命令两种都支持: TCP # nc -z -v -u [hostname/IP address] [port number] # nc -z -v 192.168.10.12 22 Connection to 192.118.20.95 22 port [tcp/ssh] succeeded! UDP # nc -z -v…

假如我是Langchain专家,你会问什么来测试我的水平

推荐Langchain YouTube 视频排行榜 1. 假如我是Langchain专家,你会问什么来测试我的水平; 作为Langchain专家,您可能需要回答一系列深入和具体的问题,这些问题旨在测试您对Langchain的理解和实际应用能力。以下是一些可能的问题…

浅谈:Flutter现状、与为什么选择Flutter——其实大家都在用只是你不知道罢了

浅谈:谁将会动那些抵制学习还装懂的人的蛋糕 开发环境现状与为什么选择Flutter 我本从不屑于写这种技术外的技术文章,但是今天刷某应用优点上头,想发唯一一篇。这篇文章可能会得罪一些就喜欢地址学新架构的,以及还不了解就开始起哄…

【go】报错整理与解决

文章目录 依赖下载失败checksum mismatch启动报错missing go.sum 依赖下载失败checksum mismatch > go get github.com/hibiken/asynqmon go: downloading github.com/hibiken/asynqmon v0.7.2 go: github.com/hibiken/asynqmonv0.7.2: verifying module: checksum mismatc…

Q learning算法

Q learning算法 代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl Q Learning是强化学习算法中的一个经典算法。在一个决策过程中,我们不知道完整的计算模型,所以需要我们去不停的尝试。 算法流程 整体流程如下: Q-table 初…

XUbuntu22.04之安装pkg-config(一百九十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

自定义GPT已经出现,并将影响人工智能的一切,做好被挑战的准备了吗?

原创 | 文 BFT机器人 OpenAI凭借最新突破:定制GPT站在创新的最前沿。预示着个性化数字协助的新时代到来,ChatGPT以前所未有的精度来满足个人需求和专业需求。 从本质上讲,自定义GPT是之前的ChatGPT的高度专业化版本或代理,但自定…

kafka单节点创建 topic 超时

1.根据之前的知道,安装kafka的时候改了config的server.properies文件中的listeners配置 之前这一行是没有注释掉的,结果创建topic的时候时钟报错连接超时 结果资料,发现就是因为listeners的问题 https://blog.csdn.net/weixin_42133361/art…