1

我需要编写一个 LMC 程序来解决 a+bx+x 2。进一步,如果结果大于999,则需要输出999;如果小于 999,则输出结果。

我已经完成了 a+bx+x 2部分,但不知道溢出时如何输出 999。

这是我的代码:

          IN
          STO a
          IN
          STO b
          IN 
          STO x
          LDA x
          STO x2
bx        LDA x
          BRZ end
          SUB one
          STO x
          LDA ans
          ADD b
          STO ans
          BR   bx
end       LDA ans
          LDA x2
          STO y
xx        LDA y
          BRZ END
          SUB ONE
          STO y
          LDA ANS
          ADD x2
          STO ANS
          BR   xx
END       LDA ANS
          ADD a
          STO ANS
          LDA ANS
          ADD ans
          SUB z
          BRP postive
          LDA ANS
          OUT
          HLT
postive   LDA z
          OUT
          HLT
a         DAT 000
b         DAT 000
x         DAT 000
x2        DAT 000
y         DAT 000
z         DAT 999
one       DAT 001
ONE       DAT 001
ans       DAT 000
ANS       DAT 000
4

1 回答 1

0

您在计算上做得很好,确实很难检测到溢出(超过 999),因为通常 LMC 累加器不能存储更大的值,并且当发生这种溢出时,累加器的值没有定义(在规范中),也没有指定是否设置“否定”标志。所以我们真的没有什么可以用来检测这种在所有 LMC 仿真器上兼容的溢出。

诀窍是将表达式计算为 999 - ( - - ²) 并检测负溢出(低于 0),我们有相应的BRP指令。如果没有负溢出,我们可以再次反转该结果,因为 999 - (999 - ( - - ²)) 与 - - ² 相同。所以这意味着您将 999 加载到ans然后而不是ADD使用SUB,并且在每次之后SUB您将检查是否存在负溢出,如果是,则转到将输出 999 的块。

其他一些备注

  • 不要使用除大写外相同的标签。并非所有 LMC 仿真器都区分大小写。
  • 您不需要两个ONE或两个ANS数据字段。
  • 最佳做法是ans在代码开头显式初始化,而不是依赖于您拥有ans DAT 0. 这是因为 LMC 具有重置功能,不会重置数据,而只会将程序计数器设置回顶部。这会导致错误的结果。
  • 您的乘法逻辑是正确的,但是您可以重用相同的代码来计算和 ²:意识到这个表达式等价于 ( + ),因此您可以在每次迭代中添加(减去)和结果循环,所以执行一次乘法!

这是更正和简化的代码:

#input:1 2 3
         INP
         STA a
         INP
         STA b
         INP
         STA x
         STA x2
         LDA z # "inverse" ans
         SUB a # do this first
loop     STA ans
         LDA x
         BRZ output
         SUB one
         STA x
         LDA ans
         SUB x2  # subtract both x...
         BRP continue
         BRA overflow
continue SUB b   # ... and b
         BRP loop

overflow LDA zero  # prepare for outputing 999 (overflow)
         STA ans
output   LDA z
         SUB ans # 999 - (999 - (a + bx + x^2))
         OUT
         HLT

a        DAT 0
b        DAT 0
x        DAT 0
x2       DAT 0
z        DAT 999
ans      DAT 0

zero     DAT 0
one      DAT 1




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

您可以运行此代码段中的代码。默认输入已设置为 1 2 3,但您可以交互更改输入。

于 2021-11-04T12:07:33.400 回答