计算机组成结构—寻址方法

       目录

一、指令寻址

二、数据寻址

1.立即寻址

2.直接寻址

3.间接寻址

4.隐含寻址

5.寄存器寻址

6.寄存器间接寻址

 7.基址寻址

8.变址寻址

9.相对寻址

10. 堆栈寻址


 寻址方式是寻找指令或操作数有效地址的方式,也就是指确定本条指令的数据地址,以及下一条将要执行的指令地址的方法。

        寻址方式分为指令寻址和数据寻址两大类。

一、指令寻址

        指令寻址是指寻找下一条将要执行的指令地址。指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。

  • 顺序寻址:可通过 程序计数器(PC)加1,自动形成下一条指令的地址。

  • 跳跃寻址:通过 转移类指令 实现。跳跃寻址是指下一条指令的地址码不是由 PC 给出的,而是本条指令给出的。

        注意:这里所说的 “ PC 加1 ” 并不是 PC 一定会加 “1” 这个数值,而是要加当前指令占据的地址长度,从而总能得到下一条指令的地址;例如,如果机器按字节编址,当前指令字长是 4 个字节,那么执行这条指令后 PC = PC + 4。

二、数据寻址

        数据寻址是指确定本条指令中所有操作数的地址,即寻找指令要操作的数据的地址。

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

        由于地址字段表达的含义不同,可以有多种不同的寻址方式:比如 直接寻址间接寻址寄存器寻址 等。此外,如果通过将某个寄存器内容与一个形式地址相加而生成有效地址,这种方式称为 偏移寻址。偏移寻址又包括基址寻址变址寻址相对寻址

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

 

 

        操作码的位数决定了指令的条数,寻址特征和形式地址共同决定了可寻址的范围。

  • 若为立即寻址,则形式地址的位数决定了数的范围。

  • 若为直接寻址,则形式地址的位数决定了可寻址的范围。

  • 若为寄存器寻址,则形式地址的位数决定了通用寄存器的最大数量。

  • 若为寄存器间接寻址,则寄存器字长决定了可寻址的范围。

        下面是常见数据寻址方式的详细介绍。

1.立即寻址

        指令的地址字段指出的不是操作数的地址,而是操作数本身,称为 立即寻址,又称为 立即数寻址。 数据采用补码形式存放。

        上面图中 # 表示立即寻址特征,A 就是操作数本身。

  • 优点:指令在执行阶段不访问主存,指令执行速度快。

  • 缺点:A的位数限制了立即数的范围,只适合操作数较小的情况。

2.直接寻址

        指令格式的地址字段中直接指出操作数在内存中的地址,就称为 直接寻址。即

EA = A

  • 优点:指令简单,不需要专门计算操作数的地址,指令在执行阶段仅访问一次主存。

  • 缺点:A 的位数决定了操作数的寻址范围,操作数的地址不易修改。

3.间接寻址

        间接寻址 是相对于直接寻址而言的,是指指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数地址所在的存储单元地址;也就是 “地址的地址”,即

EA = (A)

        这里用(A)来表示地址为 A 的存储单元所存放的数据。

 

        间接寻址也可以分为多次进行,简称 多次间址。对于两次间接寻址,地址 A 存储的内容 A~1~ 还不是有效地址 EA,地址 A~1~ 对应的存储单元所存储的内容才是 EA。这时可以用存储字的首位来标记间接寻址是否结束:存储字首位为 “1” 时,说明还需要继续寻址;为 “0” 时,寻址结束,当前存储字存放的就是 EA。

  • 优点:可扩大寻址范围(有效地址 EA 的位数大于形式地址 A 的位数);便于编制程序。

  • 缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次间址需多次访存)。

4.隐含寻址

        隐含寻址 是指指令字中不直接给出操作数的地址,而是隐含在某个寄存器中(通过操作码表示)。比如,一地址指令中,对于加法操作就可以只给出一个操作数的地址,而把另一个操作数放在 ACC 中;这时 ACC 就是另一个操作数的地址。

        因为隐含寻址可以省去指令字中的一个地址,所以这种方式可以缩短指令字长,在计算机的指令集中被广泛使用。  

5.寄存器寻址

        寄存器寻址 的指令在执行时所需的操作数来自寄存器,运算结果也写回寄存器;地址码字段直接指出了寄存器的编号,即

EA = R_i

        这样,指令执行期间不需要访问主存,减少了执行时间;而且计算机中寄存器数量是有限的,所以地址字段只需要用很少的二进制位指明寄存器编号即可,节省了存储空间。因此寄存器寻址在计算机被广泛应用。

  • 优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快。

  • 缺点:寄存器的价格昂贵,且数量有限。

6.寄存器间接寻址

        如果寄存器中不是直接给出操作数,而是操作数的内存地址,那么就称为 寄存器间接寻址。即EA = (R_i)

        这是寄存器寻址和间接寻址的结合。跟寄存器寻址相比,指令的执行阶段还需要访问主存;跟间接寻址相比,则可以少一次对主存的访问。

  • 优点:获得操作数地址的速度较快;寄存器编号较短,可有效减少操作数字段的位数。

  • 缺点:寄存器数量有限;指令的执行阶段需要访问主存(因为操作数在主存中)。

 7.基址寻址

        基址寻址 是一种偏移寻址的方式,需要设有基址寄存器 BR ;将基址寄存器 BR 的内容(基地址)加上指令中的形式地址,就可以形成操作数的有效地址。即EA = (BR) + A

        其中基址寄存器既可采用专用寄存器,也可采用通用寄存器。采用专用基址寄存器 BR ,使用时不用明确指出,只需要指令中的寻址特征反映出是基址寻址即可,这是 隐式 基址寄存器;对应地,如果采用通用寄存器,则需要用户明确指出用哪个寄存器作为基址寄存器,这是 显式 基址寄存器。

  • 优点:可扩大寻址范围;有利于多道程序设计和浮动程序编制。

  • 缺点:偏移量(形式地址 A)的位数较短。

8.变址寻址

        变址寻址 和基址寻址极为相似,需要设有变址寄存器 IX;将变址寄存器 IX 的内容加上指令中的形式地址,就可以形成操作数的有效地址。即  EA = (IX) + A

        只要变址寄存器的位数足够,也可以扩大操作数的寻址范围。变址寄存器同样可以采用隐式和显式两种方式。

        不过从本质上讲,变址寻址和基址寻址还是有较大区别的。

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

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

        例如,某个数组 a 内有 N 个数据元素,在主存中存放的首地址为 D。那么如果要对数组所有元素求和,可以通过直接寻址的方式依次叠加得到结果,写成汇编语言程序如下:

        随着 N 的增大,程序的指令条数会越来越多,占据的存储空间也越来越大。

        而如果使用变址寻址,只需要将数组元素的索引下标放入变址寄存器中,每次改变变址寄存器的内容(加 1),就能用同样的指令 “ ADD X, D ” 处理所有所有数的相加了。

        利用一个条件转移指令(BNE),当变址寄存器 X 中内容还没有增大到 N 时,就跳转回 M 处再次执行相同的指令;当增大到 N 时就结束,得到最后结果。这样,不论 N 取多大,这段程序都只需用 7 条指令,所占存储单元大大减少。这其实就是 “循环” 的实现思路。

  • 优点:可扩大寻址范围;在循环体中将 A 设为数组初始地址,可实现数组功能;适合编制循环程序。

9.相对寻址

        相对寻址 也是偏移寻址的一种,它所基于的是 程序计数器 PC 。将 PC 的内容加上指令中的形式地址,就形成操作数的有效地址,即EA = (PC) + A

        相对寻址通常用于转移类指令,转移后的的目标地址与当前指令有一段距离,称为 相对位移量;这里就是形式地址 A ,所以 A 也称为 位移量。A 的位数决定了操作数的寻址范围,可正可负,用补码表示。

 

        相对寻址的最大特点是转移的目标地址不固定,可以随 PC 的值变化;这样,无论程序加载到主存的哪段区域,都以正确运行,对于编写浮动程序非常有利。例如,之前计算数据和的程序,跳转的目标地址固定为 M;如果程序的首地址发生了改变,M 也会变化。可以将条件转移指令改为相对寻址:    

        这样,无论程序浮动到哪一地址空间,都可以正常运行了。另外,相对寻址也可以和间接寻址结合使用。

  • 优点:便于程序浮动,广泛应用于转移指令。

10. 堆栈寻址

        堆栈寻址 要求计算机中设有堆栈。堆栈既可以用寄存器组来实现,称为 硬堆栈;也可以利用主存的一部分空间作为堆栈,称为 软堆栈

        以软堆栈为例,可以用一个 堆栈指针 SP (Stack Pointer)指出栈顶地址,也可以用 CPU 中的寄存器作为 SP。根据栈数据结构的特点,操作数只能在栈顶指针指向的存储单元里存取。

 

        可以看出,堆栈寻址也是一种 隐含寻址,操作数的地址被隐含在了 SP 中。而从本质上看,把 SP 看作存放有效地址的寄存器,堆栈寻址就是一种 寄存器间接寻址

        堆栈有 进栈(PUSH)出栈(POP)两种操作:

  • 进栈(PUSH A):(SP)- 1 → SP;(ACC)→ M [ (SP) ]

  • 出栈(POP A): (M [ (SP) ])→ ACC;(SP)+ 1 → SP

        上面讨论的,都是主存按字编址的情况。如果主存按字节编址,则每次进出栈时 SP 的变化 Δ 会受到存储字长的影响;如果存储字长为 2 字节(16 位)则 Δ = 2,为 4 字节则 Δ = 4。


        下表列出了所有寻址方式、有效地址及访存次数的简单总结(不含取本条指令的访存)。

寻址方式有效地址 EA访存次数
立即寻址不需要0
直接寻址EA = A1
间接寻址EA = (A)2(一次间址)
隐含寻址隐含在寄存器中0
寄存器寻址EA = Ri0
寄存器间接寻址EA = (Ri)1
基址寻址EA = (BR) + A1
变址寻址EA = (IX) + A1
相对寻址EA = (PC) + A1
堆栈寻址EA = (SP) - 1 (入栈) 或 EA = (SP) (出栈)0(硬堆栈)或 1(软堆栈)

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

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

相关文章

mysql 行转列 case when 和 聚合函数实现

一、原始数据## 二、行转列 第一步 SELECTCASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 100 THEN aaa.budget_cost_budget ELSE 0 END b1,CASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 300 THEN aaa.budget_cost_budget ELSE 0 END b2,CASE WHEN SUBSTRING( aaa.cost_cod…

STM32的FLASH学习笔记

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。大容量产品的闪存模块组织如图所示: STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 ​ ①主…

二三维战场仿真系统

收费工具,白嫖党勿扰 收费金额1万元 1 概述 给某个公司做了一个战场仿真系统,该公司给了5W的辛苦费。现在把相关功能部分提取出来,给需要的同学。 2 功能说明 战场仿真系统,分为三个部分: 服务器,用来发…

信息流中的混排与流控

待完成. 一. 背景 问题特点: 无法事先拿到所有请求, 离线统一求解. 因此叫 online-matching.应用于在线服务, 求解rt不能高于50ms 二. CIKM 22’, 阿里广告动态定坑 见参考[1]. 2.1 问题建模,动态背包 略, 详见论文 2.2 求解, pidbeam search 思考: beam search 有用的…

RocketMQ-Dashboard 控制台使用详解

1 安装部署 具体部署启动请参考:RocketMQ从安装、压测到运维一站式文档_rocketmq benchmark压测-CSDN博客 RocketMq的dashboard,有运维页面,驾驶舱,集群页面,主题页面,消费者页面,生产者页面&…

【Chapter4】互斥、同步与通信,计算机操作系统教程,第四版,左万利,王英

文章目录 一、并发进程1.1 前驱图的定义1.2 顺序程序及其特性1.2.1 程序的顺序执行1.2.2 顺序程序的特性 1.3 并发程序及其特性1.3.1 程序的并发执行1.3.2 并发程序的特性 1.4 程序并发执行的条件1.5 与时间有关的错误 二、进程互斥2.1 什么是进程互斥2.2 进程互斥原则2.3 进程…

从零入门激光SLAM(十六)——卡尔曼滤波基础

一、卡尔曼滤波简介KF 卡尔曼滤波器(Kalman Filter)是一种用于估计动态系统状态的递归算法。它通过结合系统的动态模型和噪声观测数据,提供对系统状态的最优估计。卡尔曼滤波器广泛应用于信号处理、控制系统、导航、计算机视觉等领域。 卡尔…

华为Pura独立?或将成立全新子品牌

近日,华为官方公布了P系列将正式升级为“Pura”系列的消息,并且有可能演变成为一个全新的子品牌。多年以来,P系列一直以影像功能与颇具时尚感的设计而闻名。而这次品牌升级似乎并不局限于智能手机,经营范围似乎覆盖了手表、珠宝等…

语言模型测试系列【8】

语言模型 文心一言星火认知大模型通义千问豆包360智脑百川大模型腾讯混元助手Kimi Chat商量C知道 这次的测试比较有针对性,是在使用钉钉新推出的AI助理功能之后发现的问题,即创建AI助理绑定自己钉钉的知识库进行问答,其中对于表结构的文档学…

C++ STL概念之 迭代器

什么是迭代器 迭代器(Iterator)是一个在容器中访问元素的对象,提供了一种方法来顺序访问容器中的元素,而无需暴露容器的底层表示。 或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针,不关注容器底层细…

探索软件测试中的创新测试方法:测试左移

软件测试中的测试左移方法 在当今竞争激烈的市场中,满足客户的期望和需求是所有公司在竞争中成为市场领导者的关键。这就是为什么越来越多的公司现在转向测试左移,并将其应用于产品开发过程。 在本文中,我们将从初学者的角度来介绍测试左移…

python中cv2,等等如何修改为中文字体显示,这里以人脸表情识别中文标签为例

中文字体显示 首先下载字体包部署字体包代码实现部分 想必大家在使用python过程中都会遇到,想要显示中文的时候,但是py基本上都是英文字体,下面我将给大家提供一个比较好的解决方案: 首先下载字体包 方法: 我使用的是…