有没有办法使用玛丽汇编语言确定数字是偶数还是奇数?

Is there a way to determine whether or not a number is even or odd using marie assembly language?

通常你只会使用模数来确定这一点,但由于这不是一个选项,我尝试使用重复的减法循环并利用 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

MARIE 上没有 AND 指令,在其他机器上可以使用该指令轻松隔离最低位。

您可以使用多种技巧。组合 Skipcond 非常令人困惑,但可以使其工作。但是,您应该知道 Skipcond 实际上不能满足我们希望它这样做的所有条件,我们最终会像您建议的那样采用巧妙的序列。

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

我相信你想要做的是仅当值 > 0 时才继续模数循环。请参阅此答案(table 接近尾声)以确定序列:

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


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

进行测试

原始代码使用有效的方法来解决任务。下面的伪代码是为了展示如何在 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。