计算机组成原理alu功能实现代码_(3)计算机是如何读懂0和1的?- CODE

2fab0afa1a41bf98e35e0bd9fda5ed0b.png

本文为《BUT HOW DO IT KNOW – The Basic Principles of Computer for everyone 》笔记,文章绝大部分图片来自于这本书,用visio重新绘制,并增加不同的颜色,更便于阅读。


在前面三篇文章中,我们已经介绍了RAM组成以及CPU的实现,文章链接如下:

J Pan:(1)计算机是如何读懂0和1的?- RAM

J Pan:(2)计算机是如何读懂0和1的?- CPU (上)

J Pan:(2)计算机是如何读懂0和1的?- CPU (下)

接下来用一段代码来看看计算机到底是如何读懂0和1的。


一、计算机组装

根据前面所述,计算机有两大部分组成:CPU和RAM。CPU又包含Control section和ALU以及若干个寄存器等。其中Control section负责调度,ALU负责干活。我们已经介绍了RAM,(详见J Pan:(1)计算机是如何读懂0和1的?- RAM)以及CPU中的ALU(详见J Pan:(2)计算机是如何读懂0和1的?- CPU (上))及Control Section(详见J Pan:(2)计算机是如何读懂0和1的?- CPU (下)),这样就可以组成一个计算机了,如下图所示。

c3c0544ff5c5d948dc37d8e8c2f07589.png

但是还存在一个BUG。前面说了,指令顺序执行的时候,地址存在IAR里面,IAR+1表示RAM中下一条指令,IAR+1实现靠ALU中的加法器,而加法器除了两个输入A和B之外,还有有个进位标志carry in。这个数据来自Flag寄存器,而在计算IAR+1的时候是不需要这个进位标志的,当然我们可以通过清除标志位来实现,但是如果每条指令都干这个事的话就效率太低了。

怎么办呢?——我们知道,利用ALU实现地址增加的操作都是在step 1或Step 4完成,那我们是不是只要保证在这两个阶段carry in标志位为零即可。一个简单的解决方案就是加一个与门,并且只让carry in标志位只在step 5有效。同时要在Step 5将ALU计算的标志位写入Flag寄存器。如下图所示:

8cc4ca642a3876f86c174533c7db8bba.png

这样整个计算机就变成如下样式:

a4d378066003099a76a42b8631dfc44e.png

如果我们搭个模型仿真一下,还是会出问题,原因何在呢?——前面我们在Step 5增加一个标志位carry“写”使能,一个Flag的“写”使能。问题就在这个Flag的“写”使能上,请见下图。

6c008f8aaf12cd28bbdf4a191e5d34d3.png

在Carry out标志位写入Flag寄存器以后,会立即又传入carry in,导致ALU的输入产生非预期更新,因此出现错误结果。

18eef9c3556162ef0dfd50f516ee4fb3.png

解决办法就是增加一个进位寄存器,在Step 4进行 “写”使能(即TMP写入时)。这样就可以得到完成的一个8位计算机模型,如下图所示:

c735289a524a4f11988f248c80b9eee6.png

二、二进制代码

前面我们已经介绍了如何通过与非门等搭建一个CPU,主要基于原理性介绍,下面我们将用更直接的方式验证一下。《BUT HOW DO IT KNOW – The Basic Principles of Computer for everyone 》作者为方便大家的学习,专门搭建了一个网站But How Do It Know,里面提供了较为丰富的资料,而且还提供了一个在线的CPU,大家可以观察CPU代码运行时内部的变化情况。

我们用一段代码来演示一下,该代码来自But How Do It Know 网站。

假设我们的程序由如下指令组成:

b6ad678dcf4fc8464fd55649b8a4231b.png

我们现在需要把它翻译成二进制代码,具体过程如下:

第一条:DATA R0, 5

cba575db7b233dfe0abdd0eb764bcc1c.png

所以翻译成二进制代码为:0010 0000。由于DATA为双字节指令,数值存在紧邻之后的位置,所以后一条指令为数值5的二进制代码:0000 0101。

第二条:DATA R1, 5

与第一条类似,二进制码为:0010 0001,0000 0101。

第三条:DATA R3, 1

与前两条类似,二进制码为:0010 0011,0000 0001。

第四条:XOR R2

4fc3444016fd25c14d43d3cf7edc676b.png

二进制代码为:1110 1010。

XOR操作码为1110,其中1表示该条指令为ALU指令,110表示XOR。1010表示将寄存器R2(Reg A)的数据与寄存器R2(Reg B)的数据异或处理,结果存储至R2(Reg B)。

第五条:CLF

38591088e7aa9726dfad366ef3737c38.png

二进制码为:0110 0000。

第六条:SHR R0

0837cd5230436a4efb66f1856b175297.png

二进制代码为:1001 0000。将R0(Reg A)右移一位,结果存储至R0(Reg B)。

后面诸如此类,这里就不一一翻译,总的二进制代码如下:

c1383f61c07c8228b315ac37b1e5c263.png

三、代码运行仿真

打开网站But How Do It Know ,就可以以看到如下页面:

edae210b70741189f78ee7d009472a52.png

选择CPU Model Online,上图左下角,在下图提示位置点击CPU模型图片:

91940ca3d2e9c63836d62628ad414dd0.png

此时就可以看到完整CPU模型如下:

e3d8e7c510e31dd2f5e9693980107f9e.png

在模型底部点击:Details

0d444082df98c06d4d568b2c7b7e5748.png

就可以看到作者准备好的一段代码,和我们上一节所示的代码是一致的,点击:Load sample multiplying 5x5,将代码装载入在线的CPU。

4c6eec8847a85a11a9016d31237d849e.png

此时可以发现,CPU的RAM中已经有二进制代码了。

e16065c6c2c42439805095a6c5a392b9.png

在页面的右上角,有控制CPU运行的控制项,可以选择观察按步执行结果或者按周期执行结果,当然还可以选择自动运行或者复位等。

6149369d0457bcbb909ed283e29850b1.png

运行CPU就可以观察CPU内部的变化情况了。

b051dd9110d44a1f4cd8b5666bb695af.png

以上为作者John Clark Scott搭建的在线CPU,如果感兴趣,还可以自己搭建一个,如下图所示:

ba8eda9e377ce60788b692b4c83e4aa5.png

所用的软件为开源软件Logsim,在But How Do It Know首页点击CPU Model for Logsim即可以看到相关介绍。

5c505793bbf621d3a91070a23d480785.png

如对本文感兴趣,可继续阅读本系列其他文章:

J Pan:(1)计算机是如何读懂0和1的?- RAM

J Pan:(2)计算机是如何读懂0和1的?- CPU (上)

(2)计算机是如何读懂0和1的?- CPU (下)

对原版书感兴趣的,可以去支持一下作者,购书链接如下:

【预订】But How Do It Know? - The Bas​item.m.jd.com
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值