assembly “小人计算机”的困惑简单除法程序

9gm1akwq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(117)
INP
        STA A
        INP
        STA B
        LDA 99
        STA C
loop    LDA A
        SUB B
        STA A
        LDA C
        ADD Y
        STA C
        LDA A
        BRP loop
        LDA C
        OUT
        HLT
A       DAT
B       DAT
C       DAT 
Y       DAT 1

你好,我是一个新手,这个数字除法程序应该返回6,当A输入为24,B输入为4时,但是当我运行它时,它输出7,这是没有意义的。我知道它在while循环的开始和结束时将A加载到累加器中,所以我没有将它包括在跟踪表中。I'm not a credible user yet it makes me use links for pictures

yjghlzjz

yjghlzjz1#

以下是一些问题:

  • 当累加器为零时,BRP也将分支,这解释了为什么您的测试用例得到7而不是6。
  • 将零加载到累加器中最好是从带标签的邮箱中完成,而不是从硬编码的99中完成。由于HLT为零,因此可以给予该行标记为zero,并使用LDA zero而不是LDA 99
  • 使用一些更具描述性的名称,如numeratordivisorquotientone,来代替A、B、C和Y。
  • BRP的工作方式在不同的LMC仿真器上可能会有所不同。为了确保您有最大的兼容性,请在SUB之后立即执行BRP,因为在SUB-溢出之后留在累加器中的值在不同的仿真器上可能会不同,其次,一些仿真器在执行LDA时可能会重置negative-flag,使BRP总是在LDA之后分支。通过将BRP放在SUB之后,您也解决了第一个问题。

下面是一个可运行的修正版本。它加载了示例输入,但小GUI允许您使用其他输入进行测试:

#input: 24 4
          INP
          STA numerator
          INP
          STA divisor
          LDA zero
loop      STA quotient
          LDA numerator
          SUB divisor
          BRP continue
          LDA quotient
          OUT
zero      HLT
continue  STA numerator
          LDA quotient
          ADD one
          BRA loop
numerator DAT
divisor   DAT
quotient  DAT
one       DAT 1

<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>

相关问题