寻址方式:
下一条要执行指令的指令地址
确定本指令的操作数地址
一、指令寻址
1.顺序:
(PC)+1=PC
其中这个1很复杂,如果内存单元编制单位为字节,若指令长度为32位,则寻址就要加4;
若
指令长度为64位,则寻址就要加8;若指令为可变长度,则更复杂。
2.跳跃:
由转移指令指出
二、数据寻址
以单地址指令为例:
操作码
|
寻址特征
|
形式地址A
|
形式地址A:指令字中的地址
有效地址EA:操作数的真实地址(利用寻址方式和形式地址进行一定的运算或者转换)
当指令字长=存储字长=机器字长
1.立即(数)寻址:
形式地址A就是操作数
-
指令执行阶段不访存
-
A的位数限制了立即数的范围
2.直接寻址
有效地址有形式地址直接给出EA=A
直接给出内存单元的物理地址
其中累加器ACC是专用于存储(操作数或运算结果)的8位寄存器
-
指令执行阶段访问一次存储器
-
A的位数决定了操作数的寻址范围
-
操作数的地址不易修改(必须修改A)
3.隐含寻址
把参与运算的某个数据(地址)隐含在操作码(寄存器)中
如8086
MUL指令 被乘数隐含在AX(16位)或AL(8位)中
MOVS指令 源操作数的地址隐含在SI中,目的操作数的地址隐含在DI中
-
指令字中少了一个地址字段,可缩短指令字长
4.间接寻址(一次寻址和多次寻址)
操作数的地址保存在某内存单元中,指令单元(形式地址)出现的是内存单元的地址,
有效地址由形式地址间接提供 EA=(A)
5.寄存器(直接)寻址
有效地址即为寄存器编号 EA=Ri
-
执行阶段不访存,只访问寄存器(寄存器在CPU内部),执行速度快
-
寄存器个数有限(只有16个),可缩短指令字长
6.寄存器间接寻址
有效地址在寄存器中 EA=(Ri)
-
有效地址在寄存器中,操作数是在存储器中,执行阶段需要访存
-
便于编制循环程序(可通过修改寄存器中的内容访问不同操作数)
7.基址寻址(主要用于多道程序设计)
7.1采用专用寄存器做基址寄存器
EA=(BR)+A BR是基址寄存器
-
可扩大寻址范围
-
有利于多道程序(当它分时执行时,程序的起始地址放在BR中,在执行过程中动态形成操作数的地址),这叫做程序的动态定位
-
BR内容由操作系统或管理程序确定
-
在程序执行过程中BR内容不变,形式地址A可变
7.2采用通用寄存器做基址寄存器
-
由用户指定哪个通用寄存器作为基址寄存器
-
基址寄存器的内容有写操作系统确定
-
在程序的执行过程中R0内容不变,形式地址A可变
8.变址寻址
EA=(IX)+A 其中IX为变址寄存器(专用、通用)
-
可扩大寻址范围
-
IX的内容由用户给定
-
在程序执行过程中IX内容可变,形式地址A不变
-
便于处理数组问题(当对数组循环操作时,A可表示数组的起始地址,IX作为数组的下标)
9.相对寻址
EA=(PC)+A A是相对于当前指令的位移量(可正可负,补码)
-
A的位数决定操作数的寻址范围
-
程序浮动
-
广泛用于转移指令
10.堆栈寻址
硬堆栈: 多个寄存器
软堆栈: 指定的存储空间
先进后出(一个入出口)
栈顶地址由SP指出
进栈(SP)-1——>SP 出栈(SP)+1——>SP (其中1表示压入堆栈的长度是内存单元当中一个编制单位)