[408计算机组成原理] 第四章 指令系统4.2

在这里插入图片描述

🚀 【考纲要求】指令的格式、寻址方式、数据的对齐和大小端存储方式
🚀 第四章的第一节内容请查看此链接 指令系统4.1

二、指令和数据的寻址方式

1)指令的寻址方式

在4.1节了解了指令系统,指令的基本结构,同时知道了指令系统将我们的软硬件结合了起来,指令是可以直接被计算机硬件直接运行的;那存放在主存中的指令是如何被计算机找到并有序的被执行的呢? 其实在计算中有一个程序计数器PC,它可以记录计算机每一次即将要执行的指令的地址,每一次指令被取走之后,程序计数器中的内容就会自动加“1”,即找到下一条指令的地址。而接下去指令寻址方式的学习,就是了解PC计数器中的内容如何自动加“1”从而找到下一条指令

①🎄指令的顺序寻址

(以指令字长等于存储字长,编址方式按着字编址)
假设现在CPU从PC中取走PC中的内容,即为0,CPU中的数据被CPU取走之后,PC计数器自动的加1,即找到下一个即将要执行的指令;而此时的CPU是在执行地址0处存储的指令,直到该条指令执行结束之后又会再次取PC中的内容,PC的值又会自动加1,依次的执行下去,这就是指令的顺序寻址。
在这里插入图片描述

②🎄指令的跳跃寻址

还是如上图所示,假设此时CPU执行到了指令地址为2处的地址,PC的值应该为3,CPU执行指令DEC结束后,会取出PC的值3,PC的值加1,CPU接着执行JMP指令,由于此时是一个跳转指令,其会将程序计数器PC的内容修改为7,在JMP指令结束后,CPU在从PC中取出数据,此时取到的就是7了,CPU就会去执行指令地址为7处的STA指令;从而实现了指令的跳跃寻址。

🎄思考一个问题:

PC的值加1就可以找到下一个地址的原理是什么?其实是因为前面的假设:指令字长等于存储字长,编址方式按着字编址。由于该假设,PC的值加1就正好是下一条指令的地址,所以若机器按着字节编址,一个指令字长是2个字节,那么PC的值就得加2才能找到下一条指令!!!

2)数据的寻址方式

现在了解了指令如何被计算机找到,而一条指令由操作码和地址码组成,在4.1节我们知道对于操作码是表明此次操作的具体内容,而地址码表表明此次要操作的数据或者数据的地址,而接下去学习的数据的寻址方式就是学习如何找到此次指令要操作的数据。

①📖直接寻址

首先由于寻址方式特别多,所以需要在指令中特别的标出此次的数据寻址方式是啥,所以增加寻址特征字段来指示此次的寻址方式。

直接寻址是地址码部分给出的直接就是此次要操作数据的地址,通过这个地址我们就可以找到此次要操作的数据。
在这里插入图片描述

②📖间接寻址

间接寻址是地址码部分给出的直是此次要操作数据的地址的地址,通过这个地址码部分先找到EA(数据的真实地址),再有EA地址找到真实的数据。

如下图还有两次间址,其实就是套娃操作了,哈哈哈哈,应该很好理解。

在这里插入图片描述③📖寄存器寻址

寄存器寻址是地址码部分给出的寄存器的编号,通过寄存器编号找到对应的寄存器,从寄存器中读出来的内容就是此次要操作的数据。

在这里插入图片描述

④📖寄存器间接寻址

寄存器间接寻址是地址码部分给出的寄存器的编号,通过寄存器编号找到对应的寄存器,从寄存器中读出来的内容是此次要操作的数据的地址EA,在根据EA找到此次要操作的数据。

在这里插入图片描述
⑤📖立即寻址

指令中给出的地址码部分就直接是此次要操作的数据,不要再有任何寻址操作。

在这里插入图片描述

⑥📖隐含寻址

有些数据被隐含再指令类型当中,假设我们要进行一个加法操作,此时可能只需要给出加数,对于被加数数据可能就会被隐含在累加寄存器ACC当中,从而不要指令特别给出此次需要操作的被加数。
在这里插入图片描述
⑦📖相对寻址

在地址码部分给出偏移量A,由寻址特征字段给出此次的寻址方式,相对寻址的方式就是将A(偏移量)的内容+当前程序计数器PC中的内容从而得到真实地址EA(effective address)。该寻址方式有利于程序的内部代码的浮动

在这里插入图片描述

⑧📖基址寻址

在地址码部分给出偏移量A,由寻址特征字段给出此次的寻址方式,基址寻址的方式就是将A(偏移量)的内容+基址寄存器BA(Base address register)中的内容得到真实地址EA(effective address)。该寻址方式有利于程序的整体浮动,同时可以扩大寻址的范围;还需要注意基址寄存器是面向操作系统的,由操作系统给出此段程序的开始地址存入BA寄存器中。

下图(b)中指出其可以不用专门设置基址寄存器,直接采用通用寄存器作为存放基地址的寄存器,只要在指令字中相应字段中给出通用寄存器的编号即可。
在这里插入图片描述
⑨📖变址寻址

地址寄存器的内容为A,A的内容为此次寻址的基地址,由寻址特征字段给出此次的寻址方式,EA真实地址由A(基地址)+IX(偏移地址)得到,变址寄存器IX的内容面向用户,其内容可以改变,该寻址方式适用于循环程序的执行。
在这里插入图片描述

基址寻址和变址寻址的区别:

  • 基址寻址中基址寄存器是面向操作系统的,其EA(effective address 有效地址)是由BA(Base address register)+A(偏移地址)得到的,仍然还需要注意对于基址寄存器BA中的内容不可以由用户更改,只能由操作系统来完成该寄存器的赋值,其寄存器中的内容作为基地址,A中的内容作为偏移地址;该寻址方式便于程序的整体浮动,让BA寄存器中内容设置为程序的起始地址。
  • 变址寻址中变址寄存器是面向用户的,其EA(effective address 有效地址)是由IX(Index address register)+A(基地址)得到的,**变址寄存器IX中的内容可以由用户更改,其寄存器中内容作为偏移地址,A中的内容作为基地址。**该寻址方式便于循环语句的实现,还有数组元素的依次访问,将基地址A设为数组的首元素地址,IX内容为此次的偏移地址。

⑦相对寻址、⑧基址寻址和⑨变址寻址都叫做偏移寻址,其都是由一个基地址加上偏移量从而得到此次指令要操作数据的有效的地址,要着重了解这三个不同的偏移寻址的方式以及这三种寻址方式适用情况。

在这里插入图片描述

⑩📖堆栈寻址

当数据被存放在堆栈取的时候,就得需要堆栈寻址,堆栈寻址不要给出寻址地址,直接默认寻址地址就是堆栈指针(SP),通过POP出栈操作得到要操作的数据。
在这里插入图片描述
对于栈来说还有硬堆栈和软堆栈的区别,硬堆栈是由寄存器组成的堆栈去,实现的成本就较高,软堆栈是直接的在内存中划分一块区域作为堆栈使用,实现成本低。
在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 18:32:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 18:32:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 18:32:01       82 阅读
  4. Python语言-面向对象

    2024-04-22 18:32:01       91 阅读

热门阅读

  1. mysql 删除数据的四种方法

    2024-04-22 18:32:01       42 阅读
  2. tomcat热部署热加载原理剖析

    2024-04-22 18:32:01       38 阅读
  3. [leetcode] 796. 旋转字符串

    2024-04-22 18:32:01       37 阅读
  4. Vue3 Reactive和Ref

    2024-04-22 18:32:01       35 阅读
  5. QApplication 手动加载QT插件

    2024-04-22 18:32:01       36 阅读
  6. 海洋叶绿素的长期变换分布

    2024-04-22 18:32:01       34 阅读