1

我是一个巨大的实例学习的人,这意味着描述它是典型的让我不知所措,对于我的学习方式,因为我需要先看到,然后任何解释都可以实现。我一直在玩Nand2Tetris程序的 Hack 汇编语言 .asm 文件,并创建片段来学习、使用和学习。

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

例如:

  • Store TimeStart 如何存储时间或刻度到变量?

  • Count 1-100000 我已经完成了这部分。

  • Store TimeEnd 如何存储时间或刻度到变量?

如何翻译TimeEnd - TimeStart成易读的东西?

这可能吗?

4

2 回答 2

1

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

类似地,CPU 模拟器没有能力做到这一点,尽管可以选择转储指令跟踪会很好(也许对未来有一些建议)。

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

如果您绝对绝望,我编写了一个 Python 版本的 CPU 模拟器,它在功能单元级别模拟机器,作为在中继逻辑中实现 Hack CPU 的项目的一部分。它可以追踪指令,并且可能会被修改为您执行此操作。你可以在这里找到它:https ://github.com/RJWoodhead/Relay2Tetris/blob/master/Simulator.md

于 2020-11-04T23:35:15.773 回答
0

正如@MadOverlord正确指出的那样:

... Hack 机器无法获取该信息。

但是,我注意到您正在尝试使用 DFF 等低级门提出解决方案。大概您正在查看 DFF,因为阅读了诸如“... DFF 具有根据主时钟信号不断变化的时钟输入”第 3 章,第 42 页之类的内容。我想也许你误解了这里引用的时钟的性质,消除这种误解会很有用。

在较高的层次上,这个时钟代表了一个离散的时间单位,它控制 CPU 何时执行操作,但它不跟踪以人类为单位的时间流逝以下是第 3 章第 42 页的相关摘录:

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

  • “当前时钟相位(滴答声或滴答声)由二进制信号表示”

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

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

另一方面,以人类为单位跟踪时间流逝通常是由另一个称为实时时钟的硬件提供的。这与 CPU 是分开的,因为 CPU 不需要它的行为,因此只会降低 CPU 实现的效率。据我所知,nand2tetris没有以任何有意义的方式为用户建模实时时钟(如果我有这个错误,请纠正我)。

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

祝你好运。

于 2020-11-23T20:55:26.420 回答