我一直在试图弄清楚如何将这个伪代码转换为汇编代码,以便使用 Nand2Tetris 项目中的 CPUEmulator.sh 成功运行。
过去 6 个小时我一直盯着它,但无法让它运行,我怀疑我没有将变量正确声明到内存中。
我将包含我尝试使用的示例作为屏幕截图,以及我迄今为止所做的事情,.asm 代码、.cmp 代码、.tst 代码以及在 CPUEmulator 中尝试运行的屏幕截图.sh.
Psuedo -> 汇编程序的屏幕截图示例 我的汇编代码,需要翻译成汇编的所需伪代码+CPUEmulator错误。 .CMP 和 .TST 文件我必须用来运行我的程序集。
我的理解是我需要初始化'@n','@m','@result','@i'。
进入循环:
如果我< n, exit the loop
否则,将“m”添加到“结果”
i++,将 i 加 1
重复
将结果存储在寄存器R2中
我不确定我是否遗漏了某些内容或误解了如何初始化结果和i。我很茫然。
你的代码看起来没问题;然而,看起来 0×0 的计算将需要 22 个以上的 ticktock,而 Mult.cmp 比较文件在第一次测试中只允许 20 个 ticktock。
如果是这种情况,那么 R2=结果的最后部分将不会被执行,因此 R2 仍将保持 -1。
尝试将 Mult.cmp 中第一个项目的重复次数设置为 25(而不是 20)。
后续测试的重复次数为 50 次及以上似乎足以满足您的实施。
标准乘法 Mult.asm 根本不使用数据变量:
这是伪代码:
R2=0
while(R1 != 0)
R2=R2+R0
R1--
它要短得多,因为它放弃了变量初始化,因此第一个测试的 20 个刻度足以满足该实现。
关于变量与编号寄存器,我想说它更难阅读。 变量的使用仅代表很小的开销,因为一旦它们在初始化中建立,那么循环就与使用 Rx 的“寄存器”一样高效。
向下计数到 0 是一种算法选择,当循环计数器的实际值未使用时,通常会为了效率而做出选择,因为与 0 比较比与
n
比较更容易。