assembly 使用nand2tetris时遇到asm逻辑问题

bhmjp9jg  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(106)

所以我一直在尝试nand 2 tetris,并且读到了关于汇编语言以及如何使用和实现它的章节。我成功地完成了mult.asm,并且想挑战自己,尝试创建一个代码,它可以找到用户任何输入的数字的阶乘输出,到目前为止,这是我所有的代码

// ================================= Factorial ==================================
// This program calculates the Factorial F of a given number n 
//  At run time:
//      - The user should enter the value of n into R0. R0.e. RAM[0]
//      - The program then calculate the factorial of n    R0.e. F(n)=n!
//           F(n) = n*(n-1)*(n-2)*......*2*1
//      - The result F(n) should be saved in RAM[1]
//          -- You should also consider the F(0) case.
// ==============================================================================

// put your code here

    //set tracker for current loop
    @R1
    M=0
    @R2
    M=1
    @R3
    M=0
    @R4
    M=0
    @R5
    M=0
    @R6
    M=0

(LOOP)
    @R6
    D=M     //D=R6
    @R1
    M=M+D
    @R2
    D=M     //D = R2
    @R4
    M=D     //R4 = R2
    @R0
    D=D-M   //D = R2 - R0
    @END
    D;JGE   //If (R2-R0) > 0 goto END
    @STEP
    D;JLT   //If (R2-R0) < 0 goto STEP

(STEP)
    //Multiplication begins
    // Gets R4 from R6.
    @R6
    D=M // wrting data of r6 into d register

    // Add R1 to it.
    @R1
    D=D+M

    // And write the result back to R6.
    @R6
    M=D

    // Reduce R4 by 1.
    @R4
    D=M-1
    M=D

    // If R4 is still > 0 then loop.
    @STEP
    D;JGT
    //Multiplication ends

    @R2
    M=M+1   //R2++

    @LOOP
    0;JMP   //Got LOOP
(END)
    @END
    0;JMP   //Infinite loop

我现在遇到的问题是,循环工作正常,我的循环执行乘法循环的计数器在正确的时间停止,但输出的值不知何故比预期的高出了几个值。也就是说,当我输入3时,输出的是8而不是6。任何建议都是很好的,谢谢!
我试图得到我输入的任何数字的阶乘输出,计数器工作正常并在正确的时间停止,但最终输出是错误的

sh7euo9m

sh7euo9m1#

一些一般性意见:

  • 花些时间改进代码注解。这不仅可以帮助人们阅读代码,还可以让您思考代码,从而找到问题所在。例如,R 0-R6代表什么?目前,您只记录了其中的几个注解,并且不清楚您是否正确地使用了它们。您当前的代码中注解实际上没有帮助--“并将结果写回R6”不是一个有用的注解。代码本身通常记录它正在做什么(除非你很狡猾);好的注解解释了你为什么要做某件事。当编写汇编语言时,我总是发现先用高级语言(比如python)编写代码是很有用的。这不仅可以让你验证算法是正确的(你可以运行代码!),而且代码随后会成为汇编语言代码的通用代码注解,以及创建代码的 backbone 。
  • 用几个不同的R 0值运行程序,并将结果制成一个表格。误差是否有规律可循?它是常数还是以某种方式与R 0相关?这可能会给予你一个关于误差是什么的线索。
  • 尝试单步执行程序,以找出错误所在。CPU仿真器有一个断点功能,可以让您在代码中的任何一点停止并检查状态,这对于每次执行循环时检查状态非常方便。文档在仿真器教程的末尾:https://www.nand2tetris.org/_files/ugd/44046b_f63aba2611944e82974c9c5d5a3821fe.pdf
  • 作为一个总的旁注,您可能会发现我写的这篇文档分析了在感兴趣的HACK机器上执行乘法的最佳方法;它演示了一些有用的机器语言编程技术:https://drive.google.com/file/d/1jrDe3tru_IWzLpZjbXFmdKU7E0fy77e6/view?usp=share_link(虽然我承认,我可能应该采纳我自己的建议,改进评论!)

相关问题