Nand2Tetris Hack .asm 汇编代码的时钟和 DFF 示例

Example of Clock and DFF for Nand2Tetris Hack .asm Assembly Code

我是一个学习实例的人,这意味着描述它是典型的让我很茫然,因为我的学习风格,因为我需要先看,然后才能实现任何解释。我一直在玩 Nand2Tetris 程序的 Hack 汇编语言 .asm 文件,并创建片段以供研究、使用和学习。

我的问题是,如果我想计时,例如,我如何计时或滴答 运行 一个函数所花费的时间?我正在将 DFF 门视为一种可能的解决方案,但我对如何将它用于此任务感到非常困惑,需要查看可靠的示例代码。我希望有人能给我一个代码示例,说明如何以 ASM 格式对此进行编码。

例如:

如何将 TimeEnd - TimeStart 翻译成清晰易读的内容?

这可能吗?

无法以编程方式读取时钟/滴答时间; Hack 机器无法获取该信息。

类似地,CPU 仿真器没有执行此操作的能力,尽管可以选择转储指令跟踪会很好(也许是对未来的建议)。

您当然可以手动跟踪您的代码并计算出执行了多少条指令。由于每条指令都需要一个周期,因此相对简单。

如果你绝对绝望,我写了一个 python 版本的 CPU 模拟器,它在 functional-unit 级别模拟机器,作为实施 Hack CPU 在继电器逻辑中。它可以追踪指令,并可能被修改为您执行此操作。您可以在这里找到它:https://github.com/RJWoodhead/Relay2Tetris/blob/master/Simulator.md

正如 正确指出的:

... the Hack machine has no way to get that info.

但是,我注意到您正在尝试使用像 DFF 这样的低级门来提出解决方案。大概你正在看 DFF 是因为阅读了 "之类的东西......DFF 有一个时钟输入,它根据主时钟的信号不断变化"Chapter 3, page 42。我认为您可能误解了此处引用的时钟的性质,消除这种误解将很有用。

在高层次上,这个时钟 代表一个离散的时间单位,它控制 CPU 何时执行操作 ,但它不 保持以人类为单位的时间流逝轨迹。以下是 Chapter 3, page 42 的相关摘录:

  • "从一个“tick”开始到下一个“tock”结束所经过的时间称为周期,每个时钟周期被用来模拟一个离散时间单位。

  • "当前时钟相位(tick或tock)用二进制信号表示"

  • “使用硬件电路,该信号同时广播到整个计算机平台的每个顺序芯片。”

需要这个时钟是为了让计算机的内部硬件有足够的时间让机器的内存在执行下一个操作之前进入适当的状态。例如,如果将两个数字相加,则需要等待内存中的所有位都翻转到适当的位置,然后才能继续并在另一个运算中使用该加法的结果。硬件操作虽然速度很快,但完成各种任务所需的时间长短不同,因此计算机必须在操作之间等待一小段时间。这一小段时间是时钟周期之间流逝的离散时间单位

另一方面,以人类为单位跟踪时间的流逝通常由另一块称为 real-time clock. This is separate from the CPU because its behavior is not needed by the CPU and would therefore only make the CPU implementation less efficient. As far as I know, nand2tetris 的硬件提供,它不会以任何有意义的方式为实时时钟建模用户(如果我有错请纠正我)。

我跳过了很多细节,但我觉得在这个层面上,这种思路可能足以帮助您思考为什么您的想法行不通。或者,也许您的想法可行,但我遗漏了什么,请告诉我!

祝你好运。