有没有办法使用玛丽汇编语言确定数字是偶数还是奇数?
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。
通常你只会使用模数来确定这一点,但由于这不是一个选项,我尝试使用重复的减法循环并利用 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。