往期文章
寻找IOS相册中相似图片
NSNotification与类对象,实例对象
iCloud-Documents存储
CocoaPods私有源搭建
CPU取译码执行
开始
上一期我们讲了简单的一条简单的汇编语言命令是怎样转换成CPU指令,以及CPU如何在内存中的获取指定的指令并加载到控制单元中,从而完成一次取译码操作。上期内容请点这里
同样我们还是通过一个简单的CPU架构图来解释什么是CPU绝对寻址
关于这张图里面的各种元件名称可以参考我的上一篇文章
汇编指令
LD A,(EC00H)
上面这条汇编指令的意思是让寄存器A加载一个特别内存地址(nn)的八位二进制数据。这个特别之处就在于这个八位二进制数的地址也是指令的一部分。
EC00就代表八位二进制在内存中的地址。LD A的意思是用寄存器A装载
绝对寻址过程
LD A,(EC00H)这条指令在图中的表示如下
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知道下一步该执行十秒操作。具体实现可以参考我们的上一篇文章
流程如下图所示
获取数据地址
获取00低字节地址
当CPU将3A指令载入CU(控制单元)之后,就代表着CPU已经获取到了操作码,接下来就要获取操作数,也就是需要获取的4B数据在内存中的地址。
在完成上面的3A指令读取之后,PC(程序控制器)增长一次,以便指向下一个内存地址AE01,接着MAR(地址寄存器)通过控制总线选中内存中的AE01地址,然后CU(控制单元)将读取指令通过控制总线发送到内存中。接着内存将地址AE01的内容00通过数据总线放入BR缓冲寄存器中暂存。
流程如下图所示
获取EC高字节地址
现在4B的低字节地址00我们已经成功获取到并放入BR(缓冲寄存器)中了,距离我们获取4B的完整地址EC00就差高字节地址EC了,所以我们的PC(程序计数器)还得继续干活,指向下一个存放着高字节EC的地址AE02,将地址AE02的内容通过数据总线放入BR(缓冲寄存器)中。将之前放入BR(缓冲寄存器)中的低字节00和刚获取的高字节EC拼接起来。这样一来我们就得到了完整的数据4B的地址。
流程图如下所示
加载数据
经过上面的寻址操作我们已经能够拿到了数据4B的完整地址(EC00)了,我们将BR(缓冲寄存器)中的拼接好的4B完整地址EC00拷贝进MAR(地址寄存器)中,进而选中内存中的保存着4B数据的地址EC00。接着控制单元将读取指令通过控制总线发送到内存中,内存将EC00地址中的数据4B通过数据总线发送到缓存寄存器中。接着将数据4B从缓冲寄存器中拷贝到寄存器A中,从而完成了一次数据的绝对寻址。
流程图如下
结语
做图有点粗糙,请各位多多包涵,以上文章有什么错误之处,可以在下面评论,我会及时改正