【计算机组成原理】四、指令系统:2.指令的寻址方式(指令寻址、数据寻址)

2024-08-26 16:20

本文主要是介绍【计算机组成原理】四、指令系统:2.指令的寻址方式(指令寻址、数据寻址),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

指令的寻址方式

文章目录

  • 指令的寻址方式
    • 3.指令寻址
      • 3.1顺序寻址
      • 3.2跳跃寻址
    • 4.数据寻址
      • 4.1直接寻址
      • 4.2间接寻址
      • 4.3寄存器寻址
      • 4.4寄存器间接寻址
      • 4.5隐含寻址
      • 4.6立即寻址
      • 4.7偏移寻址
        • 4.7.1基址寻址
        • 4.7.2变址寻址
        • 4.7.3相对寻址
      • 4.8堆栈寻址

3.指令寻址

指令寻址:确定下一条指令存放的地址。

程序计数器PC:指明一条指令的存放地址。

【注意】Intel x86处理器中,程序计数器PC ( Program Counter)通常被称为IP(Instruction Pointer)。

通常顺序存储的指令,下一条指令的地址:(PC)+1→PC

但是如果按字节编址采用变长指令字结构则不行。

3.1顺序寻址

( P C ) + ′ 1 ′ → P C (PC) + '1' →PC (PC)+1PC

这里的1理解为1个指令字长,实际加的值会因指令长度、编址方式而不同。

  • 该系统采用**定长指令字结构**
  • 指令字长 = 存储字长 = 16bt = 2B(2字节)
  • 主存编址

则:

(PC) + 1 →PC


  • 该系统采用**定长指令字结构**
  • 指令字长 = 存储字长 = 16bt = 2B(2字节)
  • 主存字节编址

则:

(PC) + 2 →PC

因为是2字节


  • 该系统采用**变长指令字结构**
  • 指令字长 != 存储字长 = 16bt = 2B(2字节)
  • 主存字节编址

则:

在这里插入图片描述

读入一个字,根据操作码判断这条指令的总字节数n,修改PC的值。

根据指令的类型,CPU可能还要进行多次访存,每次读入一个字。

(PC) + n →PC

3.2跳跃寻址

转移指令指出。

取到#0指令之后,PC就加一了,#0执行完直接执行新的PC。

在这里插入图片描述

4.数据寻址

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

因为指令存储不一定都是可以从0开始存储的,所以进行跳跃寻址,会跳到其他程序的指令。所以需要对地址码进行解读

在这里插入图片描述

所以需要添加一个寻址方式(寻址特征)

在这里插入图片描述

而且是每一个形式地址前都有一个寻址特征:

在这里插入图片描述

下面在 指令字长 = 机器字长 = 存储字长,操作数为3的情况下讨论:

EA一一effective address

4.1直接寻址

EA = A

访存次数(排除取指令):1

在这里插入图片描述

4.2间接寻址

EA = (A)

多次间接寻址,开始为0则表示EA = (An)

访存次数(排除取指令):2(一次间接寻址)…n

在这里插入图片描述

4.3寄存器寻址

EA = R

寄存器数量不会很多,所以字长较短且很快.

访存次数(排除取指令):0

在这里插入图片描述

4.4寄存器间接寻址

EA = ®

访存次数(排除取指令):1…n-1

在这里插入图片描述

4.5隐含寻址

访存次数(排除取指令):0

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

在这里插入图片描述

4.6立即寻址

访存次数(排除取指令):0

立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。

#表示立即寻址特征。

在这里插入图片描述

4.7偏移寻址

  • 基址寻址

EA=(BR)+A

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

在程序执行过程中,基址寄存器的内容BR不变(BR作为基地址),形式地址可变(A作为偏移量)。

  • 变址寻址

EA=(IX)+A

程序员自己决定从哪里作为“起点”。

在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(A作为基地址)。

  • 相对寻址

EA=(PC)+A

以程序计数器PC所指地址作为“起点”。

其中A是偏移量,可正可负(前后都可以偏移),补码表示。

4.7.1基址寻址

EA=(BR)+A

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

BR:base address register

【注意】基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。程序员无法更改其内容,当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。

在程序执行过程中,基址寄存器的内容BR不变(BR作为基地址),形式地址可变(A作为偏移量)。

在这里插入图片描述

如果有8个通用寄存器,那么R的大小就是3bit

优点

  1. 可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
  2. 用户不必考虑自己的程序存于主存的哪一空间区域,便于程序浮动(整个程序在内存里边的浮动),方便实现多道程序并发运行。

【Tips】可对比操作系统第三章第一节学习,OS课中的“重定位寄存器”就是“基址寄存器”。

4.7.2变址寻址

EA=A+(IX)

变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器。

IX:index register

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

(刚好和基址寻址相反)

在这里插入图片描述

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


【注意】实际使用中往往需要多种寻址方式复合使用(可理解为复合函数)

如先基址寻址,再变址寻址。

4.7.3相对寻址

EA=(PC)+A

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

在这里插入图片描述

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

相对寻址广泛应用于转移指令

4.8堆栈寻址

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

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

在这里插入图片描述

上图是硬堆栈。

  • 硬堆栈:专门用寄存器来实现堆栈存贮。

    因为堆栈不在内存,在寄存器。所以压入、弹出不需要访存,速度快,同时成本高。

  • 软堆栈:不使用专门的硬件,而是在内存之中划分出一片区域来作为“堆栈”使用。

    堆栈在内存,所以压入、弹出需要访存,速度慢,但是成本低。

实际一般用软堆栈更多

堆栈可用函数调用时保存当前函数的相关信息。

这篇关于【计算机组成原理】四、指令系统:2.指令的寻址方式(指令寻址、数据寻址)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109071

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo