【计算机体系结构-03】ISA (Instruction Set Architecture) 指令集架构特性

news2024/10/10 10:30:21

1. 指令的类型

上一篇文章里主要介绍了几种机器模型,有机器模型后需要知道计算机有什么样的基本指令,接下来就来看看指令都有哪些类型。
[注]:以下指令主要为 MIPS 指令。

类型指令
数据传输LD、ST、MFC1、MTC1、MFC0、MTC0
计算ADD、SUB、AND、OR、XOR、MUL、DIV、SLT (Set Less Than)、LUI (Load Upper Immediate)
控制流BEQZ、JR、JAL、TRAP、ERET
浮点型运算ADD.D、SUB.S、MUL.D、C.LT.D (Compare less than for double)、CVT.S.W (Conversion from a single precision floating point number to an integer number or interger word)
多媒体类(单指令多数据)ADD.PS、SUB.PS、MUL.PS、C.LT.PS
字符串REP MOVSB (x86) (Copy one string into another string)

2. 内存访问方式

2.1. 寄存器寻址 (Register-Based Addressing)

寄存器寻址是由寄存器保存操作数本身。

Addressing ModeInstructionFunction
RegisterAdd R4, R3, R2Regs[R4] <- Regs[R3] + Regs[R2]

如上表指令 Add R4, R3, R2,意味着将寄存器 R3 和 寄存器 R2 保存的值加在一起并存入寄存器 R4 中。这期间并没有堆内存的访问,这里虽然在说的是内存访问方式,但实际上不一定会对内存访问,如果有足够的寄存器的话,那么则不需要对内存访问,因为寄存器可以保存需要操作的所有数据,而且使用寄存器的效率要比访问内存快得多。

2.2. 立即寻址 (Immediate Addressing)

指令中在操作码字段后的数字(操作数)表示操作数本身,即为立即寻址。

Addressing ModeInstructionFunction
ImmediateAdd R4, R3, #5Regs[R4] <- Regs[R3] + 5

[注]:立即寻址是最快的寻址方式。

2.3. 位移寻址 (Displacement-Based Addressing)

位移寻址用一个寄存器保存的值加上一个变量值得到一个具体地址,并根据该地址从主存中获取数据作为操作数。

Addressing ModeInstructionFunction
DisplacementAdd R4, R3, 100(R1)Regs[R4] <- Mem[100 + Regs[R1]]

2.4. 寄存器间接寻址 (Register Indirect Addressing)

寄存器间接寻址与位移寻址很类似,区别在于使用寄存器寻址时没有加偏移变量,只能读取存储在寄存器中地址对应的值。

Addressing ModeInstructionFunction
Register IndiectAdd R4, R3, (R1)Regs[R4] <- Mem[Regs[R1]]

2.5. 绝对寻址 (Absolute Addressing)

绝对寻址在现代计算机架构中并不常见,只有在一些古老的架构中使用,它会根据一个具体的值作为地址去主存中获取数据作为操作数。

Addressing ModeInstructionFunction
AbsoluteAdd R4, R3, (0x475)Regs[R4] <- Regs[R3] + Mem[0x475]]

2.6. 内存间接寻址 (Memory Indirect Addressing)

MIPS 中没有这样的寻址方式,这种寻址方式是存在其它架构中的。它的指令中的操作数可以这样获取,首先有一个保存着主存地址的寄存器,接着根据该地址去主存中获取数据,而获取的数据本身也是一个地址,然后继续用获取到的地址再去主存中拿取真正的数据,作为操作数使用。看起来很花哨。

Addressing ModeInstructionFunction
Memory IndirectAdd R4, R3, @(R1)Regs[R4] <- Regs[R3] + Mem[Mem[R1]]]

2.7. 程序计数器相对寻址 (PC Relative Addressing)

程序计数器相对寻址也可以叫做 PC 指针相对寻址,该寻址方式会根据 PC 的值加上一个偏移量得到数据的具体地址,并根据该地址从主存中索引得到操作数。

这样看起来多此一举,为何不直接使用寄存器保存基地址而是使用一直在变化的 PC 寄存器呢?这可以让访问数据时不必知道代码被加载的具体位置,当不确定代码的具体的位置时,但却知道程序执行的位置或者清楚当前正在执行的指令是什么,就可以根据 PC 指针来计算数据的存储地址。

Addressing ModeInstructionFunction
PC relativeAdd R4, R3, 100(PC)Regs[R4] <- Regs[R3] + Mem[100 + PC]

2.8. 放缩寻址 (Scaled Addressing)

x86 架构中放缩寻址也称为放缩索引基本模式 Scaled Index and Base Mode——SIB,该寻址方式可以让给寄存器值乘以一定的倍数,按照这样的计算结果在主存中寻址。

Addressing ModeInstructionFunction
ScaledAdd R4, R3, 100(R1)[R5]Regs[R4] <- Regs[R3] + Mem[100 + Regs[R1] + Regs[R5] * 4]

3. 数据类型和大小

数据类型:

  • 二进制整型
  • 二进制编码的十进制
    每个十进制数使用 4 为二进制表示。
  • 浮点型
    浮点类型有很多种,目前标准化的被称为 IEEE 754
  • 打包矢量数据 (Packed Vector Data)
  • 地址型 (Addresses)
    在一些古老的计算机中还会有地址寄存器,当这些寄存器被装入数据时,计算机会肯定的认为它是一个地址。

大小:

目前常用的机器数据大小(位宽)有八位、十六位、三十二位、六十四位。

4. 指令编码 (ISA Encoding)

当具备了上述内容后,接下来的就需要考虑设计出不同指令的编码,设计编码有个基本需要确定的就是要设计成固定长度的指令还是可变长度的指令。而大多数精简指令集架构的指令都是固定长度的。

4.1. 定长指令 (Fixed Width)

定长指令每条指令的长度是一样的,这样容易编码。

精简指令集架构中常见的有这些的指令都是固定长度的,如 MIPSPowerPCSPARCARM 等。
[注]:MIPS 中每条指令都是 4 字节长度。

4.2. 可变长指令 (Variable Length)

指令的长度可以变化,最大化的利用内存和 Cache,指令不必为了凑齐固定的长度而占用无效的位。

复杂指令集中常见的有这些指令都是可变长的,如 IBM 360x86Motorola 68kVAX 等。

[注]:x86 指令长度可以在 1 字节到 17 字节。

4.3. 大部分指令固定或压缩的 (Mostly Fixed or Compressed)

现在的指令集架构逐渐在不同类型上产生一些交点,人们可以构建出主要是固定的或压缩的指令集架构。固定长度指令我们已经很清楚了,就是指令长度不变,而压缩指令则是指编码的长度比较小,存储在存储器中,当 CPU 加载指令到内存中时开始解压这些压缩指令,指令长度将会增加。

如,MIPS16 实际上是 MIPS 指令集,其中有 32 位指令和 16 位长度指令两种。THUMB 指令集是 ARM 指令集架构,同样是大部分指令长度固定或压缩的。

另外还有 PowerPC 和一些 VLIW (Very Long Instruction Word),他们会有一个压缩的指令格式,代码在存储器中会占用很小的空间,但到了内存或者加载到 Cache 后将会解压指令,将会占用较大的空间。

4.4. 超长指令 (Very Long Instruction Word)

超长指令可以将多个固定长度指令放进一个固定长度的捆绑指令中。如 MultiflowHP/STMicro Lx 指令集架构,如今 HP/STMicro 的技术主要应用于打印机中。

5. 指令编码(实例)

5.1. x86 指令集

Intel 64IA-32 指令集架构的指令编码由指令前缀、主要操作码 (最多三个字节)、寻址方式(寻址描述符由 ModeR/M 字节(8 bit) 构成,有时候由 SIB (Scale-Index-Base) 表示寻址方式)、偏移(如有的话)和立即数字段(如有的话)组成。

在这里插入图片描述

因此,前面看到的 ADDMOV 等这些都只是一条指令中的前缀(这下了解了梅)。

5.2. MIPS 指令集

MIPS 的每条指令长度都是 4 个字节,必须在着 4 个字节里把所有需要的内容都放进去。
在这里插入图片描述
下面是现实存在的几种指令架构的指令类型和基本信息以及主要应用场景。

在这里插入图片描述

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

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

相关文章

Vue3和Vue2的slot-scope插槽用法

目录 &#x1f9e8;&#x1f9e8;&#x1f9e8;第一种插槽&#xff08;匿名插槽&#xff09; &#x1f9e8;&#x1f9e8;&#x1f9e8;第二种插槽&#xff08;具名插槽&#xff09;以及插槽简写 具名插槽的使用 &#x1f9e8;&#x1f9e8;&#x1f9e8;第三种插槽(作用域插…

使用HTTP代理后,网速反而变慢是什么原因?

如今越来越多的人利用HTTP代理开展业务&#xff0c;但在实际使用时&#xff0c;经常会有用户发现使用了HTTP代理后&#xff0c;网速非但没有变快&#xff0c;反而还更慢了。我们今天就来说说&#xff0c;这是什么原因造成的&#xff0c;从根本入手对于我们能更有利的解决问题。…

2.Spring IOC

目录 一.如何进行注册 二、如何进行注入 三、扫描注解的原理 反射文件操作 四、什么是IOC/DI&#xff1f; 五、演示使用Spring开发的案例&#xff1a;用户管理|登陆、注册 五、常见错误总结 1、注解使用Repository 2、UserController的构造方法注入&#xff1a; 3、…

【FreeRTOS】第一章:介绍

FreeRTOS是什么&#xff1f; Free和RTOS,Free就是免费的、自由的意思&#xff0c;RTOS 全称是 Real Time Operating System。中文名就是实时操作系统。可以看出FreeROTS 就是一个免费的 RTOS 类系统。这里要注意&#xff0c;RTOS 不是指某一个确定的系统&#xff0c;而是指一类…

联想电脑安装ubuntu18.04双系统超详细教程(23年最新教程,99%成功率)

文章目录前言电脑配置制作系统盘安装ubuntu系统更新显卡驱动安装wifi驱动完成前言 ubtuntu的长期支持版本现在应该已经出道21.04版本了&#xff0c;如果你对于版本没有要求的话&#xff0c;建议直接安装最新版ubuntu&#xff0c;因为新版的系统驱动都会进行更新&#xff0c;也…

自学 Java 怎么入门?

玩Java多年的老司机带你上车全面系统学习Java&#xff0c;并且还能教你如何学习才能在今年拿到一份不错的offer。 说到系统全面&#xff0c;就是以目前绝大部分公司招聘要求的知识内容为基准&#xff0c;毕竟我们学习Java都是为了高薪工作&#xff0c;《史记》中说”天下熙熙皆…

2.【SpringBoot源码】SpringBoot核心启动流程

目录 一、简介 二、创建SpringApplication对象 1)、推导出当前启动的项目的类型 2)、设置Initializer初始化器 3)、初始化Listener监听器 4)、反推出main方法所在的Class对象 三、运行SpringApplication#run(java.lang.String...)方法 1)、获取运行监听器 2)、发布…

unity使用对象池实现冲锋留下的残影效果

目录 效果展示 实现思路 残影代码 对象池代码 控制冲刺产生残影 CD冷却图标 效果展示 实现思路 对象池&#xff0c;有想要用的物体时可以从池子里取&#xff0c;用完再放回去。 因为在生成残影再销毁&#xff0c;这个过程中创建和销毁都需要耗费大量资源&#xff0c;因此…

shell 条件测试详解

目录 shell条件测试 一&#xff0c;条件测试的基本语法 1&#xff0c;test 2&#xff0c;[ ] 3&#xff0c;[[ ]] 二&#xff0c;文件测试表达式 1&#xff0c;判断目录是否存在&#xff1a; 2&#xff0c;判断文件file1是否有写的权限&#xff0c;结果为有 3&#xf…

重学MySQL基础(一)

文章目录重学MySQL基础&#xff08;一&#xff09;MySQL 连接管理MySQL字符编码InnoDB 记录存储结构InnoDB 表的主键生成策略&#xff1a;InnoDB 数据页结构页目录页的效验和索引事务报错记录在MySQL中创建函数时出现这种错误恶补SQL语句SQL中的条件语句SQL中的字符串函数SQL中…

python调用go语言踩坑记录

目录 基本操作 1 在go文件中加注释&#xff0c;设置为导出方法,导出C依赖 2 导出so文件&#xff08;mac或者linux下只需要so&#xff09; 3 进行调用 报错记录 踩坑1 关于结构体 2 cannot use (_Cfunc_CString)("12345") (value of type *_Ctype_char) as ty…

spring中事务失效场景

文章目录spring中事务失效场景一、权限访问问题二、方法用final修饰三、无事务嵌套有事务的方法四、没有被spring管理五、设计的表不支持事务六、没有开启事务七、错误的事务传播八、自己捕获了异常九、手动抛出别的异常十、自定义回滚异常spring中事务失效场景 一、权限访问问…

软件研发管理经验总结 - 事务管理

软件研发管理经验总结 - 事务管理 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 目录软件研发管理经验总结 - 事务管理一、概述二、事务管理过程1、制定开发计划2、启动会议3、阅读前一天的日报4、例会/早会5、调整计划6、协调资源7、日报…

LeetCode——2325. 解密消息

一、题目 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。 按照对照表…

vue全家桶(三)前端路由

vue全家桶&#xff08;三&#xff09;前端路由1.路由的概念1.1路由1.2vue Router2.vue-router的基本使用步骤2.1基本使用步骤2.2路由重定向3.vue-router的嵌套路由用法3.1嵌套路由的用法4.vue-router动态路由匹配用法5.vue-router命名路由用法6.vue-router编程式导航用法6.1 页…

06 Sentinel控制台规则配置讲解 (2)

1、实时监控 监控接口的通过的QPS和拒绝的QPS 2、簇点链路 用来显示微服务的所监控的API 3、流控规则 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对流量进行控制&#xff0c;以…

源于《C陷阱与缺陷》----研究程序死循环问题

本题来源于《C陷阱与缺陷》这本书&#xff0c;从本质上讲解程序死循环的原因&#xff0c;关键在于栈的空间使用方式。研究程序死循环的原因死循环的原因是什么呢&#xff1f;解决方法总结研究程序死循环的原因 题目1&#xff1a; 在VS2019 X86环境下测试&#xff1a; int mai…

Linux服务器怎么设置iptables防火墙?

当今&#xff0c;为避免香港服务器及其端口受到恶意入侵&#xff0c;保障香港服务器的安全&#xff0c;配置Linux服务器防火墙的重要性不言而喻。恒创科技将向您介绍如何在 CentOS、Ubuntu 和 Debian 服务器中安装和配置 iptables防火墙。iptables是一个简单的防火墙&#xff0…

测试工程师必备技能之编写测试用例

1. 必要性 &#x1f449; 指导测试工作&#xff0c;用例通过率是评估质量的基准 &#x1f449; 完善测试人员测试的整体思路&#xff0c;不出现漏测 ❗️ 避免背锅&#xff0c;线上出了问题防止开发甩锅给测试 2. 模板 企业中用例往往是每个人负责不同模块&#xff0c;再根据…

Verilog实现超前进位加法器

在CPU等对性能要求较高的电路中&#xff0c;一般都会采用超前进位加法器&#xff0c;因为超前进位加法器的延时相对来说比较小。下面讲述超前进位加法器的原理&#xff1a; 我们知道&#xff0c;一个三输入&#xff0c;二输出的全加器&#xff0c;其逻辑关系为 SA⊕B⊕CinSA\op…