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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分