简述处理器中的三种寻址方式

前言导读:指令的存储与执行初探从零开始构造一台二进制加法器

一个微处理器通常有多个用来寻址存储器的输出信号。

例如因特尔公司生产的8080处理器,是一个具有重大历史意义的芯片,本篇主要以8080为例做叙述。
这里写图片描述

8080是一个8位的微处理器,可以一次从存储器读取或写入8位数据。看上图,A0~A15表示16个可用于寻址的输出信号,所以8080处理器可寻址的空间大小为65536*8bit。现在假设8080处理器与一个65536字节大小的存储器相连,当处理器复位后,通过在A0~A15输出16个0,把锁存在存储器0000h处的字节(该字节必须是8080指令)读入处理器,这个过程称为取指令

为了方便使用指令,我们为处理器的每一条指令的操作码都指派了一个助记符,这种助记符只是在我们使用操作码时方便一些,它对于处理器而言是没有帮助的,因为处理器只能识别字节,对于助记符组成的文本一无所知。

比如Load指令,每条Load指令占3字节,第一个字节是操作码,其后的两个字节是要Load到处理器的操作数的16位地址。

如果我们用助记符可以把指令转换成下面的形式:

LDA A,[aaaa]

这里的A表示处理器中的累加器,aaaa表示存储器中的一个16位地址,如果该存储器是8位,则取到的是一个字节。

8080处理器内部除了累加器外还设置了6个寄存器,寄存器其实就是一个锁存器,可以存放一个字节的数。处理器可以把数据从存储器读入寄存器,也可以把数据从寄存器存回存储器。在8080处理器中用B、C、D、E、H和L来表示新增的6个寄存器。通常把H和L合起来构成一个16位的寄存器对,H用来保存高字节而L用来保存低字节。这个16位值通常用来对存储器寻址

那么寄存器内的数据可不可以互相转移呢?答案是可以的,使用MOV指令就可以把一个寄存器的内容转移到另一个寄存器。

来看这条指令:MOV B,[ HL ],这条MOV指令把存储器中的一个字节转移到B寄存器,这个字节的地址存放在寄存器对HL里面,这种方式叫做间接寻址

有了间接寻址,那么直接寻址是什么样的呢?

LAD A,[aaaa][aaaa]是一个16位地址,这个地址不需要存储在寄存器中,而是通过处理器的A0~A15管脚信号得到,这种寻址方式就叫做直接寻址

由于处理器中的寄存器众多,所以MOV指令在8080处理器中多达32条。

这里写图片描述

上面说了,处理器只认识操作码字节,一个操作码字节是一个单字节指令。8080处理器中还有另外一种双字节MOVE指令,称为MVI(传送立即数指令)。第一个字节为操作码,第二个字节是数据。这个数据从存储器转移到寄存器,或者从存储器的一个单元转移到另一个单元。

例如,当指令MVI E,37h执行后,寄存器E存放的字节是37h;又如指令MVI [HL],37h执行后,会将37h这个数存储到储存器的某个地址,这个地址存储在寄存器[HL]中。这是要介绍的第三种寻址方式:立即数寻址

总结下来三种寻址方式就是:

  • 直接寻址:LAD A,[aaaa]
  • 间接寻址:MOV B,[HL]
  • 立即数寻址:MVI E,37h or MVI [HL],37h

立即寻址就是指令当中自带数据,直接读取,最快,当立即数寻址时,只允许源操作数为立即数,目标操作数必须是寄存器存储器,其作用是给寄存器或存储单元赋值。

直接寻址就是操作数一般存放在存储器的中,而操作数的地址在指令中给出,即指令中存放的是操作数的地址,直接解析这个地址。

间接寻址的指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。

原文地址:https://www.cnblogs.com/KKSJS/p/9622809.html