1

通常你只会使用模数来确定这一点,但由于这不是一个选项,我尝试使用重复的减法循环并使用 skipcond400 来确定该值是否等于 0。如果每次我要输入一个数字,这很好它是均匀的。我遇到的问题是,如果数字是奇数,则永远不会满足该条件,从而导致无限循环。我可以使用 skipcond000 作为替代方案,但它无法告诉我一个数字是否是偶数,因为奇数永远不会等于 0,因为它们不能精确地分成对。我坚持如何确定这一点,因为我的最终目标是使用它来添加所有偶数,直到某个值。为了做到这一点,我首先需要确定用户输入是偶数还是奇数,这样我就可以有一组不同的指令去做。到目前为止,我有这样的想法,但我完全不知道从这里去哪里。我接近这个完全错误吗?

ORG 100

Input
Store y //store input in a variable thats not messed with

Load y

Store x //store a duplicate of the input so i can mess with it 


loop, Load x  // loop that does repeated subtraction  

Subt two

Store x

Skipcond 400

Skipcond 000

Jump loop


x, DEC 0

counter, DEC 0

two, DEC 2
4

2 回答 2

0

原始代码使用有效的方法来解决任务。下面的伪代码用于展示如何使用 MARIE 中的有限跳转分支。使用标签名称和注释可以帮助说明对各种语句的期望。

  load X into accumulator
detect_even:
  substract 2 from accumulator
  skip if accumulator is positive
    goto zero_or_neg
  # 'accumulator is positive'
  goto detect_even
zero_or_neg:
  # accumulator is -1 or 0
  skip if accumulator is zero
    goto not_even
  # 'accumulator is zero'
  # no op, goto even, or omitted instruction
even:
  # here X is even as accumulator is 0
  # use X, perhaps add to running total?
not_even:

请注意,累加器被重新用于主要检测循环,就像X - Y - Y - Y - ... 带负数的 YMMV。

于 2021-04-14T01:00:11.817 回答
0

没有AND关于 MARIE 的指令,在其他机器上将用于轻松隔离最低位。

您可以使用多种技术。合并Skipcond非常令人困惑,但可以使其工作。但是,您应该知道,Skipcond实际上无法做到我们希望它这样做的所有条件,我们最终会采用您所建议的聪明序列。

当当前值为零时,您的序列将继续,我认为这是一个错误。

我相信您要做的是仅在值大于 0 时继续模数循环。请参阅此答案(接近末尾的表格)以识别序列:https ://stackoverflow.com/a/66725608/471129 。

您还应该能够Skipcond在一个序列中使用多个 s,但要重复,虽然应该是可行的,但超级混乱。


另一种方法是转移感兴趣的位。每次将数字加倍时,可以通过添加自身来完成,这将执行左移。其中 15 个会将 LSB(告诉我们数字是偶数/奇数)移动到 MSB 位置,可以使用Skipcond.

于 2021-04-14T00:40:22.277 回答