【计算机组成原理】四、指令系统: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

相关文章

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查