如何使用 MARIE 查找偶数?

How can I find even numbers using MARIE?

我正在做一个项目,但我被卡住了。我正在尝试编写一段代码,通过将给定数字减去 2(给定数字不能超过 6)来检查给定数字是否为偶数。如果是偶数,则打印 0,如果是奇数,则打印 1。

    int count=input.nextInt()
    int parity=0

    while (count>0)
        count=count-2;
        if (count<0) {
            parity=parity+1;
            System.out.print(parity);
        }
        else if (count==0) {
            System.out.println(parity);
        }

^^ 这是我的 java 代码,我尝试将其翻译成 MARIE 语言,但没有任何效果。

我会 post 我的 MARIE 代码,但我觉得它太混乱了 :/

只需要检查低位为0/non-zero。普通架构有一个 AND 指令可以使它变得简单,但是 MARIE only has add/sub(并比较更大或 less-than)。

但是,是的,你的循环会工作,对一个数字 n 进行 O(n) 次迭代。如果你把它写成一个 do{}while() 循环,在 asm 中实现会容易得多,比如

n = input;
do {
    n-=2;      // sub
}while(n>=0);  // skipcond
// n==0 or -1 for even or odd

您可以在 O(log(n)) 操作中使用 add 作为左移:AC+ACAC << 1 相同。这样做 15 次以将低位移到顶部,并将其他位移出。 (累加器,AC, is 16 bits wide)。

不幸的是,这对 MARIE 来说真的很不方便,因为 ADD only works with a memory source operand,而不是 AC。所以你必须 store AC 某处,这样你就可以将它用作 ADD 的内存源操作数。

(当您知道您的输入在 0..6[=43= 范围内时,这 绝对不值得。在这种情况下,它最多只需要 [ 的 3 次迭代=19=] 循环得到结果,与此相比总是 15。但是对于不受限制的输入,n-=2 版本可能需要 32768 次迭代!如果我们将其限制为正符号整数,则为 16384;n-=2 版本甚至不适用于负整数)

例如:

/ Assuming input in AC

Store tmp
Add   tmp

Store tmp
Add   tmp
/ repeat this 13 more times, for a total of 15 ADDs
/ inconvenient to make a loop because Marie only has 1 register
/ but would be smaller for this many shifts

/ AC = input << 15

/ AC is non-zero for odd, zero for even.  You could just store that directly if you want.

/ If you want to branch on it here, or in some code that reloads that 0 / non-zero result
SkipCond  400     / jump over next insn if AC==0
jump     odd_input     / or this can be a store instruction
/ else fall through when input was even: input&1 == 0


tmp, dec 0

一个循环是有意义的,特别是如果你将它展开 2 或其他东西。如果 AC 只有 8 位,完全展开只需要 7 STORE/ADD 条指令,但是 15 条指令有点多。