微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

鉴于伪代码,我必须编写玛丽的汇编语言

如何解决鉴于伪代码,我必须编写玛丽的汇编语言

Input a number and store it in X;
Input a number and store it in Y;
while X < 10 do
X = X + 1;
Output the value of X;
endwhile;
Output the value of Y*2;

到目前为止,我已经写了这个:

Input
Store X
Input
Store Y

Loop,Load X
Subt TEN
Skipcond 400
Jump Endloop
Load X
Add ONE
Store X
Output

(然后我不知道如何将 Y 乘以 2)

X,Dec 0
Y,Dec 0
ONE. Dec 1
TEN,Dec 10

我是否使用了正确的 skipcond 指令?

解决方法

您跳过 Jump 指令的想法是正确的,但条件错误。

cond 跳过
Skipcond 000 AC
Skipcond 400 AC = 0
Skipcond 800 AC > 0

好的,那么,让我们将 SkipcondJump 结合起来(就像你经常做的那样):

Skipcond xxx
Jump Label
跳转到Label
cond 跳过
Skipcond 000 AC AC >= 0
Skipcond 400 AC = 0 AC 0
Skipcond 800 AC > 0 AC

好的,现在你正在做的是这个伪代码:

..
while X < 10 do
    X = X + 1;
    Output the value of X;
endwhile;
....

我们先把这段伪代码翻译成汇编语言的if-goto-label风格。 (这是有效的 C 代码,仅供参考,因此您可以使用实际语言编写、测试和调试 if-goto-label 伪代码。)

..
Loop:
    if ( X >= 10 ) goto Endloop;
    X++;
    output(x);
    goto Loop;
Endloop:
....

让我们注意,C 中的 while 条件表示何时继续循环,而使用 if-goto-label,我们在这里表示何时退出。因此,循环条件的含义是相反的(C while vs. if-goto-label)。从逻辑上讲,在 if-goto-label 中,当 C-while 条件为假时,我们分支(退出)——而且由于条件是一个关系运算符,我们可以通过翻转关系运算符来否定条件。 (注意:意义的不一致并不总是如此;C 的 do-while 和循环末尾的 if-goto-label 反向分支在意义上是一致的:两者都在条件为真时继续循环,在条件为假时退出.)

接下来,b/c MARIE 除了与零不做比较,让我们应用一些数学:从 >=X >= 10X - 10 >= 0 表达式的两边减去 10>

..
Loop:
    if ( X - 10 >= 0 ) goto Endloop;
    X++;
    output(x);
    goto Loop;
Endloop:
....

现在你可以从与零的比较和上表看出你应该在这里使用什么条件。

或者,我们可以使用调试器来帮助我们查看它是否有效(如果无效,则使用不同的条件)。


然而,由于 MARIE 只能执行 6 个必要的关系运算符中的 3 个,有时我们将不得不引入包含 2 个 Jumps 的 3 指令序列。

根据上表,以下构造将跳转到 Around — 然而,此处设置 Around 是为了跳过另一个跳转,并且基本上保持这个当前代码序列,而第二个 Jump 转到 Label(尽管现在在相反的 Skipcond 情况下,它选择了其他 3 个关系运算符)。

    ..
    Skipcond xxx
    Jump Around     # this Jump is executed if AC >= 0,AC <> 0,AC <=0,respectively
    Jump Label      # this Jump is executed if AC < 0,AC = 0,AC > 0,respectively
Around:
    ....
cond 跳过时间 跳转“周围” 跳转到Label
Skipcond 000 AC AC >= 0 AC
Skipcond 400 AC = 0 AC 0 AC = 0
Skipcond 800 AC > 0 AC AC > 0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。