我迫切需要帮助将此伪代码(乘以 n*m,通过循环使用重复加法)转换为汇编代码

问题描述 投票:0回答:1

我一直在试图弄清楚如何将这个伪代码转换为汇编代码,以便使用 Nand2Tetris 项目中的 CPUEmulator.sh 成功运行。

过去 6 个小时我一直盯着它,但无法让它运行,我怀疑我没有将变量正确声明到内存中。

我将包含我尝试使用的示例作为屏幕截图,以及我迄今为止所做的事情,.asm 代码、.cmp 代码、.tst 代码以及在 CPUEmulator 中尝试运行的屏幕截图.sh.

Psuedo -> 汇编程序的屏幕截图示例 我的汇编代码,需要翻译成汇编的所需伪代码+CPUEmulator错误。 .CMP 和 .TST 文件我必须用来运行我的程序集。

我的理解是我需要初始化'@n','@m','@result','@i'。

  1. n 乘数,'m' 寄存器 R0 和 R1 中的被乘数。

进入循环:

  • 如果我< n, exit the loop

  • 否则,将“m”添加到“结果”

  • i++,将 i 加 1

  • 重复

  • 将结果存储在寄存器R2中

我不确定我是否遗漏了某些内容或误解了如何初始化结果和i。我很茫然。

assembly pseudocode
1个回答
0
投票

你的代码看起来没问题;然而,看起来 0×0 的计算将需要 22 个以上的 ticktock,而 Mult.cmp 比较文件在第一次测试中只允许 20 个 ticktock。

如果是这种情况,那么 R2=结果的最后部分将不会被执行,因此 R2 仍将保持 -1。

尝试将 Mult.cmp 中第一个项目的重复次数设置为 25(而不是 20)。

后续测试的重复次数为 50 次及以上似乎足以满足您的实施。


标准乘法 Mult.asm 根本不使用数据变量:

  • 将 R0 乘以 R1,将结果累加到 R2
  • 它倒计时 R0 递减至 0

这是伪代码:

R2=0
while(R1 != 0)
   R2=R2+R0
   R1--

它要短得多,因为它放弃了变量初始化,因此第一个测试的 20 个刻度足以满足该实现。


关于变量与编号寄存器,我想说它更难阅读。  变量的使用仅代表很小的开销,因为一旦它们在初始化中建立,那么循环就与使用 Rx 的“寄存器”一样高效。

向下计数到 0 是一种算法选择,当循环计数器的实际值未使用时,通常会为了效率而做出选择,因为与 0 比较比与

n
比较更容易。

© www.soinside.com 2019 - 2024. All rights reserved.