本文主要是介绍【计算机组成原理】四、指令系统: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)+′1′→PC
这里的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。
优点:
- 可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
- 用户不必考虑自己的程序存于主存的哪一空间区域,便于程序浮动(整个程序在内存里边的浮动),方便实现多道程序并发运行。
【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.指令的寻址方式(指令寻址、数据寻址)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!