常见的几种寻址方式


定义:寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。


引入:在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式和堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。寻址方式分为两类,即指令寻址方式和数据寻址方式,前者比较简单,后者比较复杂。值得注意的是,在传统方式设计的计算机中,内存中指令的寻址与数据的寻址是交替进行的。


指令寻址

  1. 顺序寻址方式
    指令在内存中是按照顺序一条一条排列的,因此程序执行时默认为顺序执行。举个例子:
    - 汇编语言MOV EAX,1 MOV EBX,2 ADD EAX,EBX
    - C++`代码
	 int a = 1;
	 int b = 2;
	 a = a + b;

程序默认从上到下依次执行。
程序顺序执行的过程称为指令的顺序寻址。为此需要设置一个指令计数器PC来指示指令所在的地址。每次指令执行完成后,指令技术器会相应地加上当前指令字的长度。

  1. 跳跃寻址方式
    在某些情况,顺序执行已经无法满足算法需要,或者为了简化算法,我们需要用到“选择结构”、“循环结构”等使指令不是按照顺序依次执行的指令组织方式。比如汇编语言中的JMP、loop、jcxz等等,又比如高级语言中的"if"、“if-else”、“switch”、“while”、"for"等等。
    在此种情况下,指令的地址不是由程序计数器给出,而是由当前指令给出。再完成跳跃后,指令技术器需要刷新以指向新的当前指定的地址。

操作数寻址

  1. 立即寻址
    比如:MOV EAX,1314H 其中源操作数是一个立即数,而不是操作数的地址。立即寻址方式很快,因为它不需要访存。注意立即数只能作为源操作数。
  2. 直接寻址
    指令格式的地址字段中直接给出地址,因为直接给出的地址不需要经过变换所以称为直接寻址。
    比如:MOV AX,[2020] 源操作数的地址直接给出采用直接寻址,目的操作数采用寄存器寻址。
  3. 间接寻址
    间接寻址是相对直接寻址来说的,在间接寻址的情况下,指令地址字段中的形式地址不是操作数的真正地址,而是操作数地址的指示器,或者说此形式地址单元的内容才是操作数的有效地址。
  4. 寄存器寻址
    寄存器寻址就是说操作数放在CPU的通用寄存器中,比如MOV EAX,EBX
    MOV [1234H],AX也是寄存器寻址,源操作数在AX中,目的操作数在段寄存器中1234H所指的地方。
  5. 寄存器间接寻址
    寄存器间接寻址与寄存器殉职的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。
    通俗的来讲:操作数的偏移地址存放在指定的寄存器中,寄存器作为指针指向内存单元,而操作数在存储器中,这样的寄存器称为间址寄存器。
    比如:mov ax,[bx] bx中存的是操作数的地址,[bx]指向源操作数所在的内存单元。
  6. 基址寻址方式
    在基址寻址方式中将CPU中的基址寄存器的内容,加上变址寄存器的内容而形成操作数的有效地址。基址寻址的优点是可以扩大寻址能力,因为与形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。
  7. 变址寻址方式
    变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址。
    但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律变化。为此,必须使变址寄存器的内容实现有规律的变化(如自增1、自减1、乘比例系数)而不改变指令本身,从而使有效地址按变址寄存器的内容实现有规律的变化。
  8. 寄存器相对寻址
    与寄存器间接寻址方式类似,但不同的是,指令中还需要指定一个位移量,对于16位系统来说,位移量是8位或16位,对于32系统来说,位移量是8位或32位的位移量,位移量是一个带符号的整数。
    mov ax,10h[si] ;等值与mov ax,[si+10h]。
  9. 基址变址寻址方式
    操作数的偏移地址一部分在基址寄存器,一部分在变址寄存器,基址寄存器的内容加上变址寄存器的内容就是操作数的偏移地址。如:mov ax,[bx][si] 等价于mov ax,[bx+si]。
  10. 隐含寻址
    这种类型的指令,不是明显地给出操作数的地址。而是在指令中隐含着操作数的地址。例如,单地址的指令格式,就不明显地在地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址。指令格式明显指出的仅是第1操作数的地址D。因此,累加寄存器AC对单地址指令格式来说是隐含地址。如:DAA 。
    欢迎各位提出意见,如果有错,请大家私聊我,我会立即修改以免影响读者。
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值