寻址方式:(由硬件)确定本条指令的操作数地址,以及下一条指令地址的方法
- 指令寻址:指令在主存中是按顺序存放的,我们确定下一条指令在主存中的地址
顺序寻址:PC永远指向下一条指令的地址,取完指令后自动自增指向下一条待执行指令地址
跳跃寻址:当前指令将目标指令的地址置入PC中从而实现跳转(本质上也是顺序寻址的结果)
寄存器PC在开机上电后自动初始化为第一条指令地址
- 数据寻址:确定操作数在主存中的地址
形式地址:指令的地址码字段Addr,通常都不是真实的地址值
有效地址:操作数在主存中的真实地址,由地址码字段Addr与寻址方式共同确定,记作EA
- 指令寻址:指令在主存中是按顺序存放的,我们确定下一条指令在主存中的地址
数据寻址方式
立即寻址:Addr即为操作数本身,立即可用。一般用于变量赋初值。
MOV EAX,2008H
直接寻址:操作数存储于主存中,Addr为其在主存中的地址,直接通过Addr访问即可得操作数。
MOV EAX,[2008H]
间接寻址:相对直接寻址而言,但Addr不是其存储地址,而是操作数的地址的地址,需要访问两次主存才可以得到操作数。
MOV EAX,@2008H
解决了直接寻址地址码长度受限的问题,能用较短的地址码访问较大的主存地址
更加灵活,当操作数地址改变时无需改变指令只需改变Addr指向的主存单元即可
寄存器寻址:操作数在CPU的某个通用寄存器中,Addr为其通用寄存器编号(通用寄存器组可以视作数组,编号即为下标),访问相应寄存器即可得操作数。
- 寄存器的访问速度较访问主存更快
- 编号长度较短,有利于缩短指令长度
MOV EAX,ECX
寄存器间接寻址:与间接寻址不同的是,操作数的地址存储于寄存器,Addr为该寄存器编号。
MOV AL,[EBX]
相对寻址:Addr放的是相对PC的偏移量,EA=Addr+PC(为下一条指令的地址)为操作数的有效地址。
- 只需存储指令与操作数之间的相对距离,因此有利于实现程序的浮动
变址寻址:变址寄存器被指定用来存放变化的地址,此时地址码字段Addr会增加一个变址寄存器编号X,X与形式地址D之和即为操作数的有效地址, 。
- X提供修改量,D提供基准量。X的内容一直在变,而D的值一经设定执行过程中将不会变化
- 主要应用于对线性表之类的数组元素进行重复的访问
基址寻址:基址寄存器被指定来存放基地址,与变址寻址类似,多了一段基址寄存器编号B,B与形式地址D之和即为操作数的有效地址。与变址寻址不同的是,基址寄存器的值一经设定运行过程中将不会改变,此时由D来提供修改量。
堆栈寻址:寻找存放在堆栈中的操作数称为堆栈寻址。根据开辟堆栈的位置可以将堆栈分为存储器堆栈和寄存器堆栈。
存储器堆栈
- 堆栈指针寄存器SP指向栈顶单元
- 入栈:SP=SP-1(低地址在上),M[SP]=R
- 出栈:R=M[SP],SP=SP+1
寄存器堆栈
- 寄存器堆栈栈顶固定不动
- 堆栈操作时,寄存器堆栈内数据整体移动
- 寄存器堆栈速度快,但容量有限;存储器堆栈则速度慢,容量大
- 寄存器堆栈必须采用专用的堆栈指令进行控制
「Section 7」寻址方式
最新推荐文章于 2024-07-20 18:38:43 发布