【重铸基础】CPU绝对寻址

993 阅读4分钟

往期文章

寻找IOS相册中相似图片
NSNotification与类对象,实例对象
iCloud-Documents存储
CocoaPods私有源搭建
CPU取译码执行

开始

上一期我们讲了简单的一条简单的汇编语言命令是怎样转换成CPU指令,以及CPU如何在内存中的获取指定的指令并加载到控制单元中,从而完成一次取译码操作。上期内容请点这里

同样我们还是通过一个简单的CPU架构图来解释什么是CPU绝对寻址

image.png

关于这张图里面的各种元件名称可以参考我的上一篇文章

汇编指令

LD A,(EC00H)

上面这条汇编指令的意思是让寄存器A加载一个特别内存地址(nn)的八位二进制数据。这个特别之处就在于这个八位二进制数的地址也是指令的一部分。

EC00就代表八位二进制在内存中的地址。LD A的意思是用寄存器A装载

绝对寻址过程

LD A,(EC00H)这条指令在图中的表示如下

image.png

3A表示LD A这条指令的十六进制形式

EC00表示要操作的数据在内存中的地址

4B表示要操作的数据的十六进制形式

操作码

其中LD A表示操作码也就是需要执行的CPU指令,通常称为opcode

操作数

(EC00H) 同样也是一条指令需要CPU执行,叫做操作数,通常称为operand。

通过观察操作数与需要操作的数据(4B)之间的关系,我们可以发现这个操作数就是需要操作的数据(4B)在内存中的地址EC00,

在内存中地址EC00被存放在了两块连续的内存中。分别是地址AE01中的00,以及AE02中的EC。

通常地我们称存放在AE01中的00是数据地址的低字节(low byte)

而在AE02中的EC是数据地址的高字节(high byte)

执行3A指令

首先我们的CPU中的PC(程序计数器)会读取指令3A的地址AE00。然后通过地址总线选中AE00中的3A指令,接着控制单元发出读取指令控制,通过控制总线将读取指令传递到内存,这时候内存就将3A指令通过数据总线,传递到BR(缓存寄存器中),再冲缓冲寄存器中拷贝到IR(指令寄存中),经过解码器解码之后,放入控制单元,让CPU知道下一步该执行十秒操作。具体实现可以参考我们的上一篇文章

流程如下图所示

CPUAAD.gif

获取数据地址

获取00低字节地址

当CPU将3A指令载入CU(控制单元)之后,就代表着CPU已经获取到了操作码,接下来就要获取操作数,也就是需要获取的4B数据在内存中的地址。

在完成上面的3A指令读取之后,PC(程序控制器)增长一次,以便指向下一个内存地址AE01,接着MAR(地址寄存器)通过控制总线选中内存中的AE01地址,然后CU(控制单元)将读取指令通过控制总线发送到内存中。接着内存将地址AE01的内容00通过数据总线放入BR缓冲寄存器中暂存。

流程如下图所示

CPUcopy.gif

获取EC高字节地址

现在4B的低字节地址00我们已经成功获取到并放入BR(缓冲寄存器)中了,距离我们获取4B的完整地址EC00就差高字节地址EC了,所以我们的PC(程序计数器)还得继续干活,指向下一个存放着高字节EC的地址AE02,将地址AE02的内容通过数据总线放入BR(缓冲寄存器)中。将之前放入BR(缓冲寄存器)中的低字节00和刚获取的高字节EC拼接起来。这样一来我们就得到了完整的数据4B的地址。

流程图如下所示

CPUAPPEND.gif

加载数据

经过上面的寻址操作我们已经能够拿到了数据4B的完整地址(EC00)了,我们将BR(缓冲寄存器)中的拼接好的4B完整地址EC00拷贝进MAR(地址寄存器)中,进而选中内存中的保存着4B数据的地址EC00。接着控制单元将读取指令通过控制总线发送到内存中,内存将EC00地址中的数据4B通过数据总线发送到缓存寄存器中。接着将数据4B从缓冲寄存器中拷贝到寄存器A中,从而完成了一次数据的绝对寻址。

流程图如下

CPUFinal.gif

结语

做图有点粗糙,请各位多多包涵,以上文章有什么错误之处,可以在下面评论,我会及时改正