指寻找指令或操作数的有效地址的方式。
Ps
并非操作数真实地址的地址,称为形式地址,用A表示。
操作数在存储器中的真实地址,称为有效地址,用EA表示。
(A)表示A的数值,A可以是寄存器编号、内存地址。则(A)就可以表示为寄存器中的数值或相应内存单元的数值。
寻找下一条将要执行的指令的地址。
通过程序计数器(PC)+1(指1个指令字长),来自动形成下一条指令的地址。
寻址操作数的有效地址。
注意:由于数据寻址的方式比较多,因此我们通常在指令字中增设一个字段(寻址特征),用于指明操作数的寻址方式。
此类型的指令不显式的指定操作数的地址,而是在指令中隐含操作数的地址。
单地址指令就只给出第一操作数的地址,而不不显式的指出第二操作数的地址,并往往以ACC作为第二操作数地址。
优点:有利于缩短指令字长。
缺点:需要增加存储操作数或隐含地址的硬件。
该类型的指令中的地址码字段给出的不是操作数的地址,而是操作数本身(立即数),采用补码表示。
优点:指令执行阶段不会访问主存,提高了指令的执行速度。
缺点:地址段的位数限制了立即数的范围。
指令字中的形式地址A同样是操作数的真实地址EA( A = EA )。
优点:指令执行阶段仅访问一次主存,且无需计算操作数的地址。
缺点:A的位数限制了指令操作数的寻址范围,且操作数的地址不易修改。
指令的地址字段并非操作数的真实地址,而是 操作数的真实地址 所在存储单元 的 地址( (A) = EA )。
间接寻址可以是一次间接寻址,也可以是多次间接寻址。
优点:
缺点
指令执行阶段需要多次访存。(一次间接寻址就需要两次访存)
Ps
由于访问速度过慢,这种寻址方式并不常用。因此一般问到扩大寻址范围时,往往考虑寄存器间接寻址的方式。
指令字中直接给出操作数所在的寄存器的编号( EA = Ri ),即操作数存放在Ri所指向的寄存器中。
优点:指令执行阶段不访问主存,只访存寄存器。由于寄存器数量少,因此地址码字段长度短,因而使得指令字短,从而使得指令执行速度快。
缺点:寄存器造价高且数量有限。
在上面寄存器寻址的基础上,寄存器Ri存储的不是操作数本身,而是操作数所在主存单元的地址( Ri = EA )。
优点:相比于一般的间接寻址,其速度较快。
缺点:指令执行阶段仍需访问主存。
栗子
比如指令字长为2B,当执行指令 JMP A(其地址为X)时,此时PC会加“1”(1个指令字长),变成 X + 2,完成该指令后,则PC的值会继续+A(偏移量),因此,最终跳转地址为 X + 2 + A。
优点:
BR是面向操作系统的,其内容手操作系统或管理程序的控制。
程序执行的过程中,BR中的内容保持不变(作为基地址),但形式地址可变(作为偏移量)。
用户可决定采用哪个通用寄存器作为基址寄存器,但内容仍旧操作系统决定。
优点:
缺点:偏移量(形式地址A)的位数较少。
IX是面向用户的,在程序执行过程中,其内容(偏移量)可由用户改变,但形式地址A(基地址)保持不变。
优点:
项目 | 基址寻址 | 变址寻址 |
---|---|---|
面向群体 | 操作系统 | 用户 |
寄存器可编程性 | BR的内容由操作系统或管理程序确定 | IX 的内容可自由地被用户改写 |
寻址过程中值的变化 | BR内容保持不变,A自由变化 | IX内容自由变换,A保持不变 |
用途 | 解决程序逻辑空间与存储器物理空间的无关性 | 编址循环程序,比如数组遍历 |
采用堆栈结构的计算机系统中,大部分指令表面上表现为无操作数指令的形式,其实,它们都隐含使用了SP。
堆栈是存储器/专用寄存器组中的一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址由一个特定的寄存器给出,该寄存器称为堆栈指针(SP)。
堆栈可分为硬堆栈与软堆栈。
寻址方式 | 有效地址 | 访存次数 |
---|---|---|
隐含寻址 | 程序指定 | 0 |
立即寻址 | A即是操作数 | 0 |
直接寻址 | A = EA | 1 |
一次间接寻址 | (A) = EA | 2 |
寄存器寻址 | A = Ri | 0 |
寄存器一次间接寻址 | (Ri) = EA | 1 |
相对寻址 | (PC) + A = EA | 1 |
基址寻址 | (BR) + A = EA | 1 |
变址寻址 | (IX) + A = EA | 1 |
堆栈寻址 | 由SP指出 | 0 |