「Section 7」寻址方式

  1. 寻址方式:(由硬件)确定本条指令的操作数地址,以及下一条指令地址的方法

    • 指令寻址:指令在主存中是按顺序存放的,我们确定下一条指令在主存中的地址
      • 顺序寻址:PC永远指向下一条指令的地址,取完指令后自动自增指向下一条待执行指令地址

      • 跳跃寻址:当前指令将目标指令的地址置入PC中从而实现跳转(本质上也是顺序寻址的结果)

      • 寄存器PC在开机上电后自动初始化为第一条指令地址

    • 数据寻址:确定操作数在主存中的地址
      • 形式地址:指令的地址码字段Addr,通常都不是真实的地址值

      • 有效地址:操作数在主存中的真实地址,由地址码字段Addr与寻址方式共同确定,记作EA

  2. 数据寻址方式

    • 立即寻址: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
      • 寄存器堆栈

        • 寄存器堆栈栈顶固定不动
        • 堆栈操作时,寄存器堆栈内数据整体移动
        • 寄存器堆栈速度快,但容量有限;存储器堆栈则速度慢,容量大
        • 寄存器堆栈必须采用专用的堆栈指令进行控制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值