问题标签 [nand2tetris]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hdl - 如何在“Nand to Tetris”课程中为 ALU 设置输出标志?
虽然我标记了这个作业,但它实际上是我自己免费完成的一门课程。无论如何,这门课程叫做“从 Nand 到俄罗斯方块”,我希望这里有人看过或上过这门课程,以便我能得到一些帮助。我正处于使用提供的 hdl 语言构建 ALU 的阶段。我的问题是我的芯片无法正确编译。当我尝试为 ALU 设置输出标志时出现错误。我相信问题是我不能下标任何中间变量,因为当我尝试根据一些随机变量(比如输入标志)将标志设置为真或假时,我没有得到错误。我知道问题不在于我尝试使用的芯片,因为我使用的是所有内置芯片。
到目前为止,这是我的 ALU 芯片:
因此,当我尝试将“out”的下标版本发送到 Or8Way 芯片时,问题就出现了。我尝试使用与“out”不同的变量,但遇到了同样的问题。然后我读到你不能下标中间变量。我想也许如果我将中间变量发送到其他芯片,并且该芯片下标它,它会解决问题,但它有同样的错误。不幸的是,我只是想不出一种方法来设置 zr 和 ng 标志而不下标一些中间变量,所以我真的被卡住了!
请注意,如果我用以下内容替换有问题的行,它将编译(但不会给出正确的结果,因为我只是使用一些随机输入):
有人有想法么?
编辑:这是本书的附录,该附录指定了 hdl 的工作原理。具体看第 5 节,它讨论了总线并说:“内部引脚(如上面的 v)可能没有下标”。
编辑:这是我得到的确切错误:“第 68 行,无法将门的输出引脚连接到部件”。不过,错误消息有点令人困惑,因为这似乎不是真正的问题。如果我只是替换“Or8way(in=out[0..7], out=zr1);” 用“Or8way(in=false,out=zr1);” 它不会产生这个错误,这导致我在附录中查找并发现 out 变量,因为它是作为中间派生的,所以不能下标。
assembly - 在装配中实现 eq, lt gt 没有跳转
是否可以仅使用 AND、OR 和 NOT 运算符编写逻辑来比较 2 个操作数并在不使用跳转的情况下返回 true/false (-1, 0)?如果是这样,您能否给我一些提示,因为这对我来说似乎是不可能的。我正在尝试用“计算系统的元素”一书的汇编语言来实现 eq、lt 和 gt 。
assembly - nand 2俄罗斯方块ASM“预期表达”
我目前正在尝试完成Nand 到俄罗斯方块课程 ( Fill.asm
) 第 4 章中的项目。但是,Assembler 给了我以下错误:
“在第 3 行,预期表达式”
我不确定我做错了什么......但下面是我拥有的代码片段:
谁能告诉我为什么我在第 3 行 ( @sum
) 上收到此错误?
hdl - 我的 DMux 4 方式有什么问题?
它似乎接近工作,显然只是在第 7 行搞砸了?
我已经按如下方式实现了我的 DMux,我只是把它当作一棵树来使用:
assembly - 尝试为 nand2tetris 书构建 PC(计数器),但我在逻辑上遇到了一些问题
这是我的代码:
基本上,来自寄存器的值是递增的,仅当 inc 为 1(通过 Mux 检查)时才被接受,然后通过另一个可能重置它的 Mux,然后是另一个可能会或可能不会写入它的 Mux,具体取决于负载值。然后从中产生的任何值(无论是更改的值还是来自旧寄存器的值)都被放入寄存器中。
我究竟做错了什么?
assembly - 实现逻辑右移
所以我正在研究 nand2tetris 项目,我想在软件级别实现右移逻辑,因为硬件不支持它。
我知道右移逻辑是除以二。所以我第一次实现它时会计算在值变为 0 或负数之前我能够从初始值中减去 2 的次数。如果数字为负,则类似。
但是,我发现了一个不起作用的场景。我想右移-27139。那么移位后的二进制值是19199。应该是19198。因此我正在寻找一种新的方法来实现移位。
我可以and
重视、or
重视add
和subtract
,这就是我可以支配的一切。
OSFTW
这是我在 Hack 实现的汇编语言中的代码:
nand2tetris - 如何比较 Jack 中的两个数组(来自 Nand2Tetris 的课程)?
我需要比较 cours Nand2Tetris 中的两个数组
但是退货不好!!!
vim - 如何将当前行的整数加 1
我正在研究 nand2tetris,我最终得到了很多看起来像这样的文件:
所以我一直在拉第一行,然后使用 15p,然后做了:s/0/i/g
15 次(i
我需要的索引在哪里)。我注意到我可以用 替换它,但即使在这里,我每次运行命令时都:s/\[\d\]/\[i\]/g
手动设置值。i
是否有我可以运行的命令,以便i
自动计算为\d+1
,我可以为每一行重复该命令,而无需手动指定值?
algorithm - 如何为 Hack 汇编语言的 'eq' 编写解释器?
我正在阅读和研究计算系统的元素,但我被困在某一点上。示例章节跳过接下来的 5 条指令可以在这里找到。
无论如何,我正在尝试实现一个虚拟机(或一个字节码到汇编翻译器),但我被困在跳过接下来的 5 条指令。
您可以在此处找到汇编符号。
目标是实现一个翻译器,将特定的字节码翻译成这个汇编代码。
我成功完成的一个例子是字节码
翻译为:
正如我所说,Hack 的汇编语言可以在我提供的链接中找到,但基本上是:
嗯,这很简单。根据定义,存储器位置 256 是堆栈的顶部。所以
将被翻译成:
这都很好..
我还想再举一个例子:
被翻译成:
我认为这很清楚。
但是我不知道如何翻译字节码
到大会。eq 的定义如下:
其中三个命令(eq、gt、lt)返回布尔值。VM 将真假分别表示为 -1(减一,0xFFFF)和 0(零,0x0000)。
所以我需要分别向寄存器 A 和 D 弹出两个值,这很容易。但是我应该如何创建一个汇编代码来检查值并在结果为真时压入 1,如果结果为假则压入 0?
Hack Computer 支持的汇编代码如下:
我可以做类似的事情:
如果推入堆栈的 2 个值相等,它将保持值 0 或 !0 如果不相等,但这有什么帮助?我尝试使用 D&A 或 D&M,但这也无济于事..
我也可以引入条件跳转,但我怎么知道要跳转到哪条指令?哈克汇编代码没有“跳过接下来的 5 条指令”之类的东西。
[由 Spektre 编辑] 我看到的目标平台摘要
- 16 位冯诺依曼架构(地址为 15 位,16 位字访问)
- 数据存储器 32KW(读/写)
- 指令(程序)内存 32KW(只读)
- 本机 16 位寄存器 A,D
- 通用 16 位寄存器 R0-R15 映射到数据存储器的 0x0000 - 0x000F
- 这些很可能也用于:
SP(R0),LCL(R1),ARG(R2),This(R3),That(R4)
- 屏幕映射到 0x4000-0x5FFF 的数据存储器(512x256 B/W 像素 8KW)
- 键盘在 0x6000 处映射到数据存储器(如果最后一次按键,则为 ASCII 码?)
hdl - 逻辑门 XOR HDL 不适用于 Nand2Tetris
我不太清楚为什么我的 Nand2tetris 模拟器一直告诉我第 3 行错误。谁能告诉我以下代码的任何问题: