Nand2Tetris Hack .asm 汇编代码的时钟和 DFF 示例
Posted
技术标签:
【中文标题】Nand2Tetris Hack .asm 汇编代码的时钟和 DFF 示例【英文标题】:Example of Clock and DFF for Nand2Tetris Hack .asm Assembly Code 【发布时间】:2020-11-04 23:10:04 【问题描述】:我是一个巨大的例子学习的人,这意味着描述它是典型的让我不知所措,对于我的学习方式,因为我需要先看到,然后任何解释都可以实现。我一直在玩 Nand2Tetris 程序的 Hack 汇编语言 .asm 文件,并创建 sn-ps 来学习、使用和学习。
我的问题是,如果我想计时,例如,我如何计时或标记运行函数所需的时间?我正在将 DFF 门视为一种可能的解决方案,但我对如何使用它来完成这项任务感到非常困惑,并且需要查看可靠的示例代码。我希望有人能给我一个代码示例,说明如何以 ASM 格式对此进行编码。
例如:
Store TimeStart
如何将时间或刻度存储到变量中?
Count 1-100000
这部分我已经完成了。
Store TimeEnd
如何将时间或刻度存储到变量中?
如何将TimeEnd - TimeStart
翻译成易读的东西?
这可能吗?
【问题讨论】:
我没有意识到在 asm 中可以做到这一点;我会为此考虑测试/脚本系统。 【参考方案1】:无法以编程方式读取时钟/滴答时间; Hack 机器无法获取该信息。
同样,CPU Emulator 不具备执行此操作的能力,但可以选择转储指令跟踪(也许可以为未来提供一些建议)。
您当然可以手动跟踪您的代码并计算出执行了多少条指令。由于每条指令需要一个周期,因此相对简单。
如果您绝对绝望,我编写了一个 Python 版本的 CPU 模拟器,它在功能单元级别模拟机器,作为在中继逻辑中实现 Hack CPU 的项目的一部分。它可以追踪指令,并且可能会被修改为您执行此操作。你可以在这里找到它:https://github.com/RJWoodhead/Relay2Tetris/blob/master/Simulator.md
【讨论】:
【参考方案2】:正如@MadOverlord 正确指出的那样:
...Hack 机器无法获取该信息。
但是,我注意到您正在尝试使用 DFF 等低级门提出解决方案。大概您正在查看 DFF 是因为读取诸如 “... DFF 有一个时钟输入,该时钟输入会根据主时钟的信号不断变化”,Chapter 3, page 42 .我认为您可能误解了此处引用的时钟的性质,消除这种误解会很有用。
在较高的层次上,这个时钟代表一个离散的时间单位,它控制 CPU 何时执行操作,但它不以人类单位跟踪时间的流逝时间>。以下是Chapter 3, page 42的相关摘录:
“从一个“tick”开始到下一个“tock”结束所经过的时间称为周期,每个时钟周期被用来模拟一个离散的时间单位。”
“当前时钟相位(滴答声或滴答声)用二进制信号表示”
“使用硬件电路,此信号同时广播到整个计算机平台的每个顺序芯片。”
需要这个时钟是为了让计算机的内部硬件有足够的时间让机器的内存在执行下一个操作之前进入适当的状态。例如,如果将两个数字相加,则需要等待内存中的所有位都翻转到适当的位置,然后才能继续并在另一个操作中使用该相加的结果。硬件操作虽然很快,但需要不同长度的时间来完成各种任务,因此计算机必须在操作之间等待一小段时间。这少量的时间是时钟周期之间经过的离散时间单位。
另一方面,以人类为单位跟踪时间流逝通常由另一个称为real-time clock 的硬件提供。这与 CPU 是分开的,因为 CPU 不需要它的行为,因此只会降低 CPU 实现的效率。据我所知,nand2tetris 没有以任何有意义的方式为用户建模实时时钟(如果我有这个错误,请纠正我)。
我跳过了很多细节,但我觉得这种思路,在这个层面上,可能足以帮助你思考为什么你的想法行不通。或者也许你的想法会奏效,但我遗漏了一些东西,请告诉我!
祝你好运。
【讨论】:
以上是关于Nand2Tetris Hack .asm 汇编代码的时钟和 DFF 示例的主要内容,如果未能解决你的问题,请参考以下文章
在第 0 行,表达式预期错误(Nand2tetris CPU-emulator)