寻址方式啊

7.3 寻址方式
寻址方式是指:确定本条指令的操作数地址或者是下一条要执行指令的指令地址。所以寻址方式就是如何找到操作数地址和指令地址。
一,指令寻址主要有两种方式
顺序寻址
指令执行完以后顺序的去取下一条指令即PC+1。这个1不是简单的1。根据不同机器的不同机器字长和可变指令长度,这个1不只是1.
跳跃
由转移指令指出

二,数据寻址
数据寻址方式比较多也比较复杂
操作码+寻址特征+形式地址
比如我们给出如上的指令格式是单地址指令,中间的寻址特征表示应该用怎么样的寻址方式找到数据的地址。这个地址字段给出的名称我们叫做形式地址,所谓的形式地址是在指令当中使用到的地址,那么形式地址并不是哪个我们要找到的数据所在的存储单元或者寄存器它的真实地址,所以我们要利用形式地址和寻址方式进行一定的运算或者是转换才能得到真实的有效的地址。为了讲解的方便,我们做如下约定,假设指令字长=存储字长=机器字长,这样的话可以简化我们的例子,是我们的讲解可以更容易理解。第一种寻址方式
1.立即数寻址,那么形式地址部分给出来的就直接是操作数,这个数据直接参数操作码指定的运算。那么如果我们采用立即数寻址方式的话,那么指令格式就变成OP+#+立即数这种格式格式。在译码的过程中,如果发现寻址特征标识是#号的好,它表示后面的数据是立即数。
如果采用立即数寻址的话,操作数在去指令的过程当中实际上已经被取到了CPU当中,所以在指令的执行过程当中,CPU不需要再一次的进行访存。
2.直接寻址
就是指有效地址就等于形式地址,直接寻址给出的就是直接的物理内存地址,这样的话我们利用内存单元地址,去访问内存,从这个单元当中把操作数取出,完成操作码部分给定的操作,把操作数送去到ACC这个寄存器当中去。那我们就完成了直接寻址指令的操作。这样的指令在操作过程当中需要访问一次存储器。当然这是我们对指令格式的假设,我们假设在指令当中只有一个地址码字段。形式地址的位数就决定了,这条指令它的操作数寻址范围,如果形式地址的位数过短的话,那么它的寻址范围会非常小。这种方式地址码字段非常难已修改,编程非常的难,比如说我们要对一个数组里的每一个数据进行加一操作,用循环的方式来做,那么这条指令就很难去实现,除非我们有另外一条指令,那条指令能够把我们这条LOAD指令从内存当中取出,并且能够修改地址码部分,那么我们才可以用循环程序的方式来完成我们需要的操作。
3.隐含寻址
我们把寻址方式隐藏到操作码当中,或者是参与运算的某一个数据,或者是它所在的位置由操作码直接给出。比如ADD操作码+寻址特征+形式地址这种格式。那么隐含寻址当中的一个数就表明在ACC这个寄存器当中,而形式地址部分的寻址方式还是由寻址特征给出。这种方式可以减少地址码位数增加指令长度。

4.间接寻址
就是C语言里面的指针的指针。

5.寄存器寻址
速度快

6.寄存器间接寻址
数据在内存,但是数据在内存的地址是保存在寄存器中的。

7.基址寻址
(1)采用专用寄存器作为基址寄存器
有效地址=基地址+偏移量
这种方式的好处是可以扩大寻址范围
非常有利于多道程序设计,为什么这么说呢?多道程序分时进行执行的时候,可以将程序的首地址放入基地址寄存器当中,然后动态的形成操作数地址。在计算机领域当中,把它称为程序的动态定位。一般来说,基地址寄存器的内容是由操作系统或者管理程序来确定的。用户不能修改基地址寄存器,只能修改形式地址寄存器。通常情况下,基寻址主要用于多道程序的设计,来动态的生成形式地址,来动态的装入。

(2)通用寄存器作为基址寄存器
那么指令格式就变成了OP+寻址特征+R0+地址部分
R0是可以由用户指定的,但是基址寄存器的内容由操作系统确定,在程序的执行过程的R0内容不变,地址部分可变。

8.变址寻址
采用专用寄存器或者在通用寄存器中选指定一个寄存器,做为变址寄存器这就看CPU是如何设计的或者指令集是如何设计的。这个可以由用户来指定。那么这个寄存器的内容可以改变,但是在程序运行过程中只能由操作系统改变。地址部分内容不能改变。指令格式还是OP+寻址特征+形式地址。和基址寻址非常类似,在形成有效地址的过程当中我们要利用一个加法器,把A的内容和变址寄存器的内容向加,得到的结果就是我们操作数所在的内存单元的地址,我们用这个单元的地址去访问内存的单元,就可以获得那个操作数。这种方式也可以扩大寻址范围。变址寄存器的内容是可以改变的,形式地址的部分不能改变,这个特征非常适合处理数组的问题,如果我们队数组进行循环操作的话,那么形式地址部分的内容表示数组的起始地址,变址寄存器的内容可以作为数组的下标。下面我们看一个例子 :
设数据块首地址为D,求N个数的平均值
如果是直接寻址方式的话
LDA D 将D中的数据取到ACC当中
ADD D+1 将D+1中的数据和ACC中的数据进行相加
ADD D+2 将D+2中的数据和ACC中的数据进行相加
ADD D+3将D+3中的数据和ACC中的数据进行相加

ADD D+(N-1) 将D+(N-1)中的数据和ACC中的数据进行相加
DIV #N 然后利用立即数寻址的方式,进行除法运算得出平均值,保存在ACC中
STA ANS 将ACC中的值写入到指定的内存中。
我们需要执行指令的条数是N+2条

如果采用变址寻址那么就简单多了,可以减少程序指令在内存当中所占的资源。
LDA #0 立即数寻址的方式对ACC进行清0
LDX #0 将变址寄存器的内容清0
ADD X,D 用变址寻址方式做加法
INX 变址寄存器+1——>变址寄存器
CPX #N 变址寄存器的内容和N进行比较
BNE M 如果不满足条件就跳转回到ADD X,D这条指令处,
DIV #N
STA ANS
这种方式只需要 8条指令

9.相对寻址
指令格式依然是OP+特征部分+地址部分
(1)相对寻址是相对于当前PC的值进行偏移来寻址的,那么该偏移值可正可负可补码。这种方式寻址适用于浮动的程序,比较广泛的被用来进行指令的转移。在多道程序分时系统的环境下,指令的实际地址是在变化的。应用程序没法准确的知道指令的所在内存的实际地址值,所以就通过当前PC值+相对PC值来进行指令的跳转。
(2)按字节寻址的相对寻址举例
当代的CPU都是在指令还未取之前PC的值就自动的加上指令的长度了。所以在进行相对寻址的时候,要考虑到偏移量是否准确。

10.堆栈寻址

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值