前言导读:指令的存储与执行初探、从零开始构造一台二进制加法器.net
一个微处理器一般有多个用来寻址存储器的输出信号。code
例如因特尔公司生产的8080处理器,是一个具备重大历史意义的芯片,本篇主要以8080为例作叙述。
blog
8080是一个8位的微处理器,能够一次从存储器读取或写入8位数据。看上图,A0~A15表示16个可用于寻址的输出信号,因此8080处理器可寻址的空间大小为65536*8bit。如今假设8080处理器与一个65536字节大小的存储器相连,当处理器复位后,经过在A0~A15输出16个0,把锁存在存储器0000h处的字节(该字节必须是8080指令)读入处理器,这个过程称为取指令。图片
为了方便使用指令,咱们为处理器的每一条指令的操做码都指派了一个助记符,这种助记符只是在咱们使用操做码时方便一些,它对于处理器而言是没有帮助的,由于处理器只能识别字节,对于助记符组成的文本一无所知。get
好比Load指令,每条Load指令占3字节,第一个字节是操做码,其后的两个字节是要Load处处理器的操做数的16位地址。it
若是咱们用助记符能够把指令转换成下面的形式:class
LDA A,[aaaa]二进制
这里的A表示处理器中的累加器,aaaa表示存储器中的一个16位地址,若是该存储器是8位,则取到的是一个字节。im
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
orMVI [HL],37h
当即寻址就是指令当中自带数据,直接读取,最快,当当即数寻址时,只容许源操做数为当即数,目标操做数必须是寄存器或存储器,其做用是给寄存器或存储单元赋值。
直接寻址就是操做数通常存放在存储器的中,而操做数的地址在指令中给出,即指令中存放的是操做数的地址,直接解析这个地址。
间接寻址的指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。