指令系统 I(指令的格式、寻址)

一、指令系统

1. 指令集体系结构

指令(机器指令)是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。

指令系统是指令集体系结构(ISA)中最核心的部分, ISA 完整定义了软件和硬件之间的接口(指令集体系结构处于软硬件的交界面上),是机器语言或汇编语言程序员所应熟悉的。ISA 规定的内容主要包括:指令格式,数据类型及格式,操作数的存放方式,程序可访问的寄存器个数、位数和编号,存储空间的大小和编址方式,寻址方式,指令执行过程的控制方式等。

注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。

2. 指令的基本格式和分类

【总结】:

1)指令的构成

  • 操作码指出指令中该指令应该执行什么性质的操作以及具有何种功能。操作码是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法等的关键信息。
    例如,指出是算术加运算还是算术减运算,是程序转移还是返回操作。

  • 地址码给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。

2)按地址码数目分类

根据指令中操作数地址码的数目的不同,可将指令分成:零地址指令、一地址指令、二地址指令、三地址指令和四地址指令。

零地址指令

只给出操作码 OP ,没有显式地址。这种指令有两种可能:

注意:堆栈指令的访存次数,取决于采用的是软堆栈还是硬堆栈。若是软堆栈(堆栈区由内存实现),则对于双目运算需要访问 4 次内存:取指、取源数1 、取源数2 、存结果。若是硬堆栈(堆栈区由寄存器实现), 则只需在取指令时访问一次内存。

一地址指令

这种指令也有两种常见的形态,要根据操作码的含义确定究竟是哪一种。

二地址指令

对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。

三地址指令

四地址指令

3)按指令长度分类

指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。

指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。通常,把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。

在一个指令系统中,若所有指令的长度都是相等的,则称为定长指令字结构。定字长指令的执行速度快,控制简单。若各种指令的长度随指令功能而异,则称为变长指令字结构。然而,因为主存一般是按字节编址的,所以指令字长多为字节的整数倍。

指令长度的不同会导致取指令时间开销的不同,单字长指令只需访存一次就能将指令完整取出;而双字长指令则需访存两次才能完整取出,耗费两个存取周期。

4)按操作码长度分类

5)按操作类型分类

转移指令有条件 / 无条件、直接 / 间接、相对 / 绝对三种属性。

  • 条件转移是指需要先判断条件是否成立,才决定是否转移;无条件转移是指不用判断条件就可以转移,典型的是函数调用和返回。

  • 直接转移是指转移目标地址直接放在指令中,执行时直接将地址码送入 PC;间接转移是指转移目标地址存放在寄存器或内存单元中。

  • 相对转移是指转移目标地址为当前 PC 值加上偏移量,偏移量一般在指令中;绝对转移是指转移目标地址直接由指令或寄存器给出。

3. 定长操作码指令格式

定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般 n 位操作码字段的指令系统最大能够表示 2n 条指令。定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利。当计算机字长为 32 位或更长时,这是常规用法。

4. 扩展操作码指令格式

【总结】:

为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。显然,这将增加指令译码和分析的难度,使控制器的设计复杂化。

最常见的变长操作码方法是扩展操作码,它使操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。

在设计扩展操作码指令格式时,必须注意以下两点:

  • 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。(对比哈夫曼树“前缀编码”)

  • 各指令的操作码一定不能重复。

通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间。

设地址长度为 n ,上一层留出 m 种状态,下一层可扩展出 m×2n 种状态。

设指令字长固定为 16 位,试设计一套指令系统满足:有 15 条三地址指令、有 12 条二地址指令、有 62 条一地址指令、有 32 条零地址指令。

OPA1A2A3
0000~1110A1A2A3
11110000~1011A2A3
11111100~11110000~1101A3
11111100~11111110~11110000~1111

二、指令的寻址方式

1. 指令寻址和数据寻址

【总结】:

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。采用不同寻址方式的目的是为了缩短指令字长,扩大寻址空间,提高编程的灵活性,但这也提高了指令译码的复杂度。

指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址 (A) 。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址 (EA) 。

注意,(A) 表示地址为 A 的数值, A 既可以是寄存器编号,也可以是内存地址。对应的 (A) 就是寄存器中的数值,或相应内存单元的数值。例如, EA = (A) 意思是有效地址是地址 A 中的数值。

寻址方式分为指令寻址和数据寻址两大类。寻找下一条将要执行的指令地址称为指令寻址;寻找本条指令的数据地址称为数据寻址。

1)指令寻址

指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。

顺序寻址

通过程序计数器 PC 加 “1” (1 个指令字长),自动形成下一条指令的地址。

跳跃寻址

通过转移类指令实现。所谓跳跃,是指下条指令的地址不由程序计数器 PC 自动给出,而由本条指令给出下条指令地址的计算方式。而是否跳跃可能受到状态寄存器和操作数的控制,跳跃的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改 PC 值,所以下一条指令仍然通过 PC 给出。

2)数据寻址

数据寻址是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数或怎样计算出操作数的地址。

数据寻址的方式较多,为区别各种方式,通常在指令字中设一个字段,用来指明属于哪种寻址方式,由此可得指令的格式为:

操作码寻址特征形式地址A

2. 常见的数据寻址方式

【总结】:

1)直接寻址(0010)

指令字中的形式地址为操作数的有效地址,这种方式为直接寻址。

2)间接寻址(0011)

间接寻址可以是一次间接寻址,还可以是多次间接寻址。

由于访问速度过慢,这种寻址方式并不常用。一般问到扩大寻址范围时,通常指的是寄存器间接寻址。

3)寄存器寻址(0100)

CPU 中寄存器的数量都不会太多,用很短的编码就可以指定寄存器,寄存器寻址需要的地址段位数为 ⌈log2(通用寄存器个数)⌉,因此能有效地缩短地址段的位数。

4)寄存器间接寻址(0101)

5)隐含寻址(0000)

例如,单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址,指令格式明显指出的仅是第一操作数的地址。因此,累加器(ACC)对单地址指令格式来说是隐含寻址。

隐含寻址不明显给出操作数地址,而在指令中隐含操作数的地址,因此可以简化地址结构。

6)立即寻址(0001)

7)基址寻址(0111)

基址寻址、变址寻址、相对寻址都属于偏移寻址,区别在于偏移的“起点”不一样。
基址寻址:以程序的起始存放地址作为“起点”;EA = (BR) + A
变址寻址:程序员自己决定从哪里作为“起点”;EA = (IX) + A
相对寻址:以程序计数器PC所指地址作为“起点”。EA = (PC) + A

基址寄存器既可采用专用寄存器,又可采用通用寄存器。

8)变址寻址(1000)

显然,变址寻址与基址寻址的有效地址形成过程极为相似。但从本质上讲,两者有较大区别。

  • 基址寻址面向系统,主要用于为多道程序或数据分配存储空间,因此基址寄存器的内容通常由操作系统或管理程序确定,在程序的执行过程中其值不可变,而指令字中的 A 是可变的;

  • 变址寻址立足于用户,主要用于处理数组问题,在变址寻址中,变址寄存器的内容由用户设定,在程序执行过程中其值可变,而指令字中的 A 是不可变的。

9)基址&变址复合寻址

10)相对寻址(0110)

注意:取出当前指令后, PC 会指向下一条指令,相对寻址是相对于下一条指令的偏移

【拓展】:

11)堆栈寻址(1001)

堆栈可分为硬堆栈与软堆栈两种。

寄存器堆栈又称硬堆栈,寄存器堆栈的成本较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了 SP。通常情况下,在读/写堆栈中的一个单元的前后都伴有自动完成对 SP 内容的增量或减量操作。

三、小结

1、什么是指令?什么是指令系统?为什么要引入指令系统?

指令就是要计算机执行某种操作的命令。

一台计算机中所有机器指令的集合,称为这台计算机的指令系统。

引入指令系统后,避免了用户与二进制代码直接接触,使得用户编写程序更为方便。另外,指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。

2、一般来说,指令分为哪些部分?每部分有什么用处?

一条指令通常包括操作码字段和地址码字段两部分。

其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,它是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。

地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址等。

3、对于一个指令系统来说, 寻址方式多和少有什么影响?

寻址方式的多样化能让用户编程更为方便,但多重寻址方式会造成 CPU 结构的复杂化(详见下章),也不利于指令流水线的运行。

而寻址方式太少虽然能够提高 CPU 的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户的需求。

4、简述各常见指令寻址方式的特点和适用情况。

  • 立即寻址操作数获取便捷,通常用于给寄存器赋初值。

  • 直接寻址相对于立即寻址,缩短了指令长度。

  • 间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回。

  • 寄存器寻址的指令字较短,指令执行速度较快。

  • 寄存器间接寻址扩大了寻址范围。

  • 基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间。

  • 变址寻址主要用于处理数组问题,适合编制循环程序。

  • 相对寻址编制程序时,无须指定绝对地址,只需确定程序内部的相对距离,从而可以使用浮动地址,给程序的重定位带来了方便,便于实现多道程序,常用于控制程序的执行顺序、转移等。

基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。

5、一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址?

现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息。一个操作数(如 char 、int、float、double) 可能是 8 位、16 位、32 位或 64 位等,因此可能占用 1 个、2 个、4 个或 8 个内存单元。也就是说,一个操作数可能有多个内存地址对应。

有两种不同的地址指定方式:大端方式和小端方式。

  • 大端方式:指令中给出的地址是操作数最高有效字节(MSB)所在的地址。

  • 小端方式:指令中给出的地址是操作数最低有效字节(LSB)所在的地址。

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

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

相关文章

如何精准选择Yandex关键词

Hey小伙伴们👋,今天来聊聊如何精准选择Yandex关键词,让你的广告投放效果最大化!🔍 1.使用Yandex关键词工具:Yandex提供了关键词工具,如Yandex Keyword Planner和Yandex Wordstat&#xff0…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐: 随着 AI 技术的不断发展,视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中,图像与文字的交互需求愈发旺盛,很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

jmeter附件上传

可以采用录制的方式获取附件上传的http请求 普通参数 附件参数 文件名称: 方式一:如果只添项目名称,默认充jmeter的bin目录下获取 方式二:点击文件名称,再点击浏览,可以自己选择文件信息

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

如何用Python同时抓取多个网页:深入ThreadPoolExecutor

背景介绍 在信息化时代,数据的实时性和获取速度是其核心价值所在。对于体育赛事爱好者、数据分析师和投注行业而言,能否快速、稳定地抓取到实时比赛信息显得尤为重要。特别是在五大足球联赛中,能够在比赛进行时获得比分、控球率等实时数据&a…

【UBuntu20 配置usb网卡】 记录Ubuntu20配置usb网卡(特别是建立热点)

【UBuntu20 配置usb网卡】 Ubuntu20配置usb网卡(特别是建立热点) 一、 闲言碎语的前言 usb的外置网卡,相比Windows即插即用,Linux买回来一顿折腾,准备把过程梳理一下记录起来。 网卡的方案其实就那几家,…

前端开发模块VUE-Element UI学习笔记

前端开发模块VUE-Element UI学习笔记 文章目录 前端开发模块VUE-Element UI学习笔记 1、Element UI 简介2、Element UI 安装3、Icon 图标4、Button 按钮5、Link 超链接6、Radio 单选框7、Checkbox 多选框8、Input 输入框9、Select 下拉框10、Switch 开关 1、Element UI 简介 基…

Java面试经典 150 题.P169. 多数元素(005)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int majorityElement(int[] nums) …

如何在Python爬虫等程序中设置和调用http代理

在Python爬虫中为了更好地绕过反爬机制,获取网页信息,有时可能需要在Python中应用代理服务,这样做的目的就是防止自己的ip被服务器封禁,造成程序运行时中断连接,那么如何在python中设置代理呢? 我们通过几个…

海思MPP音视频总结

基础篇 1.常用图像格式介绍 常用图像像素格式 RGB 和 YUV。 1.1RGB RGB分类通常指的是将图像或颜色按照RGB(红、绿、蓝)颜色空间进行分组或分类。RGB图像格式通常包括RGB24(RGB888)、RGB32、RGBA、RGB565等。 RGB24是一种常用…

预览 PDF 文档

引言 在现代Web应用中,文件预览功能是非常常见的需求之一。特别是在企业级应用中,用户经常需要查看各种类型的文件,如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…

Pycharm,2024最新版Pycharm现在安装环境配置汉化详细教程!

码(文末附带精品籽料): K384HW36OBeyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsIm…

【论文分享】TensorTEE 24‘ASPLOS

目录 AbstractIntroductionContribution BackgroundCollaborative ComputingLLM CPU-NPU collaborative computing Memory ProtectionMemory encryption Integrity verificationHeterogeneous NPU TEEIntegrated NPU TEEDiscrete NPU TEE Threat Model MotivationInefficient C…

力扣每日一题合集

3211. 生成不含相邻零的二进制字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<string> validStrings(int n) {vector<string> ans;ans.emplace_back("0");ans.emplace_back("1");for(int i 1; i < n; i)…

Vue3 中实现过渡动画的几种方式?

前言 首先抛开 vue 本身&#xff0c;假设需要给某个 Dom 元素实现一些过渡动画&#xff0c;那么下面这些事是必须的&#xff1a; 实现目标元素不同时刻下的样式&#xff0c;常见做法就是抽取在不同的 css 选择器中根据不同时刻切换不同的 css 选择器以达到样式的变化设置样式…

Linux 中,flock 对文件加锁

在Linux中&#xff0c;flock是一个用于对文件加锁的实用程序&#xff0c;它可以帮助协调多个进程对同一个文件的访问&#xff0c;避免出现数据不一致或冲突等问题。以下是对flock的详细介绍&#xff1a; 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

【华为HCIP实战课程二十七】中间到中间系统协议IS-IS Hello报文,网络工程师

一、IS-IS术语 1、IIH: ISIS hello 报文,相当于OSPF的Hello报文,hello-interval 10s, hold-time 30s 2、LSP:链路状态数据单元,类似OSPF的LSA,携带路由信息(L1和L2的LSP) 3、SNP:系列号PDU (1)、PSNP:部分序列号协议数据单元,类似OSPF的ACK,Request (2)、CSNP:…

python-opencv给图片或视频去水印

文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法&#xff0c;通过对缺陷区域周围像素的分析和插值&#xff0c;生成合适的像素值来填充缺…

渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇

目录 day10-渗透测试文件上传篇&绕过&特征&截断&渲染 一、黑名单大小写绕过代码分析 1、获取文件后缀名进行判断&#xff0c;如果后缀在这个字典里就禁止上传。 2、黑名单大小写绕过攻击 二、利用 windows 系统特征绕过上传 1、windows 系统特征绕过漏洞…