0

This is what I have so far but I can't get it to work. I need to have it input a dividend and a divisor and output the result along with the remainder. Example: if the input is 33 followed by 6 the output will be 5 followed by 3 since 33/6 is 5 remainder 3.

00          INP                      //ask the user
01          BRZ     QUIT            // halt the execution if input zero
02          STA     DIVIDEND        // store in dividend variable
03          INP                     // input dividor
04          BRZ     QUIT            // halt the execution if input zero
05          STA     DIVISOR         // store in divider variable
06          LDA  DIVIDEND          // load into acc
07  LOOP    STA  RESULT            // store the temp result
08          LDA  RESULT             // load the result
09          SUB  DIVISOR            // subtract the dividor to acc BRP
10          BRP  LOOP                //loop if acc is positive or zero
11          LDA  RESULT             // load the result into acc
12          OUT                     // display the result
13  QUIT    HLT                     // halt if zero
14          HLT                     // halt the execution
15  DIVIDEND    DAT                 //declare variable
16  DIVISOR     DAT 
17  RESULT      DAT
4

1 回答 1

1

目前您正确获取输入,计算余数并输出。您只是错过了计算商并将其输出的部分。商实际上是您跳回循环开头的次数。因此,在循环的每次迭代中增加一个计数器。然后,当您退出循环时,您将计数太多,因此对于商,您将输出比该值少一。

其他备注:

  • LDA RESULT如果它紧随其后,则无需执行STA RESULT,因为该值仍在累加器中-无需重新加载。

  • 没有必要HLT跟着HLT. 第二个永远不会被执行。

  • 在注释中说明 LMC 指令的作用是没有用的……例如,“询问用户”不是INP. 评论应该解释更多的东西——特定于这个程序的东西。您的大多数评论只是说某人可以在 LMC 语言规范中查找什么。这不是评论的目的。

因此,这是您的代码,其中包含用于获取商的额外计数器,并考虑了上述说明。你可以在这里运行它。

#input: 19 9
          INP // Input the dividend
          BRZ QUIT // Zero is not considered a valid input
          STA DIVIDEND
          INP // Input divisor
          BRZ QUIT // Division by zero is not allowed
          STA DIVISOR
          LDA ZERO // Initialise quotient
          STA QUOTIENT
          LDA DIVIDEND // Let dividend be the initial value of the remainder
// Repeat as long as remainder would be non-negative:
LOOP      STA REMAINDER
          LDA QUOTIENT // Increment quotient
          ADD ONE
          STA QUOTIENT
          LDA REMAINDER // Reduce remainder
          SUB DIVISOR
          BRP LOOP
// Output the results
          LDA QUOTIENT // quotient is one too great now
          SUB ONE
          OUT
          LDA REMAINDER
          OUT
QUIT      HLT

// constants:
ZERO      DAT 0
ONE       DAT 1

// variables:
DIVIDEND  DAT
DIVISOR   DAT
QUOTIENT  DAT
REMAINDER DAT


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

于 2020-11-29T17:43:27.160 回答