1.指令寻址
什么是指令寻址?
1.确定下一条要执行的指令的存放地址;
2.由程序计数器 PC 指明 。
指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。
顺序寻址
通过程序计数器PC加“1”(1个指令字长),自动形成下一条指令的地址。
注意加的“1”是指令的字长:
这个是定长指令,那要是变长指令怎么办呢?
注意:每一条指令的执行都分为“取指令”以及“执行”两个阶段
PC里永远存的都是下一条指令的地址,所以在执行当前指令时的取指令结束阶段会根据操作码判断这条指令的总字节数n,来决定下一条指令的起始地址,也就是将pc+n赋给pc。
这就是计算机如何实现变长指令的寻址。
跳跃寻址
执行转移类指令导致的 PC 值改变。
JMP:无条件将PC种的值修改
2.数据寻址
什么是数据寻址?
就是确定本条指令的地址码指明的真实物理地址。
1.隐含寻址
不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址。
例如加法指令。
优点: 有利于缩短指令字长。
缺点: 需要增加存储操作数或隐含地址的硬件。
2.立即寻址
形式地址A就是操作数本身,又称为立即数,一般采用补码形式。
一条指令的执行:取指令访存1次
执行指令访存0次
暂不考虑存结果
共访存1次
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:
A的位数限制了立即数的范围。
如A的位数为n,且立即数采用补码时可表示的数据范围为 -2^n-1 ~ 2^n-1 -1
3.直接寻址
指令字中的形式地址A是操作数的真实地址EA,即EA=A。
一条指令的执行:
取指令 访存1次
执行指令 访存1次暂不考虑存结果
共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。
4.间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)。
一条指令的执行:
取指令 访存1次
执行指令访存2次暂不考虑存结果
共访存3次
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。
5.寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即EA=R,其操作数在由R所指的寄存器内。
一条指令的执行:
取指令访存1次
执行指令访存0次暂不考虑存结果
共访存1次
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机中寄存器个数有限。
6.寄存器间接一次寻址
寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(R)。
一条指令的执行:
取指令访存1次
执行指令访存1次
暂不考虑存结果
共访存2次
特点:与一般间按寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
7.相对寻址
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示。
注:A是相当于下一条指令的位移量。
优点:一段代码在程序内位置调整时可以不用修改跳转指令的地址码。 操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是段代码在程序内部的浮动)相差一个固定值,因此便于程序浮动相对寻址广泛应用于转移指令。
8.基址寻址
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A。
BR:base regesiter
注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器但其内容仍由操作系统确定。
拓展:程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统的PCB当中)
优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边的浮动)
9.变址寻址
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA= (IX)+A,其中可为变址寄存器(专用),也可用通用寄存器作为变址寄存器。
lX- index register
注: 变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址),这与基址寻址刚好相反。
在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
实际运用中往往需要多种寻址方式复合使用。
例如:
基址寻址:EA=(BR)+A
变址寻址:EA=(IX)+A
先基址后变址寻址:EA=(IX)+((BR)+A)
10.堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
堆栈可以用于保存函数返回值的信息。
总结: