0

我必须用 MARIE 汇编语言实现这个伪代码

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

我是否使用正确的跳过指令?

4

1 回答 1

2

Skipcond单独是相当有限的。首先,它只能跳过一条指令,其次,它只能测试必要的 6 个条件中的 3 个。  Skipcond可以跳过 <、= 和 >,但不能跳过 <=、<> 或 >=。(这些也是签名条件,没有未签名的测试,但这是另一回事。)

如果您可以在一条指令中做一些有用的事情,那么这里是如何SkipCond提供帮助的。

首先,我们应该注意,C 中的 if-then 在汇编中需要相反的条件,因为在 C 中我们是在说何时运行 then 部分,但在汇编中我们是在说何时不运行该指令(即何时跳过指令)。因此,如果您可以在一条指令中做一些有用的事情,您可以编写一个 if-then 来测试 >=、<>、<=,但不能测试其他条件。对于那些,请继续阅读以了解如何SkipCond与 Jumps 结合使用。

条件 跳过时
Skipcond 000 交流 < 0
Skipcond 400 交流 = 0
Skipcond 800 交流 > 0

如果您需要的东西 (a) 需要的指令多于 then-part 的指令,或 (b) 需要其他条件测试之一,或 (c) 是更复杂的控制结构,例如 if-then-else,那么我们有时可以SkipCond结合使用Jump(就像你经常做的那样):

Skipcond xxx
Jump Label
条件 跳过时 跳转到Label什么时候
Skipcond 000 交流 < 0 交流 >= 0
Skipcond 400 交流 = 0 交流 <> 0
Skipcond 800 交流 > 0 交流 <= 0

但是,由于 MARIE 只能执行 6 个必要的关系运算符中的 3 个,因此有时我们将不得不引入一个涉及 2 的 3 指令序列Jumps

下面的结构将Around根据上面的表格跳转到——然而,Around这里设置为跳过另一个跳转,并且基本上保持这个当前的代码序列,而第二个跳转JumpLabel(尽管现在在相反的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:
    ....
条件 跳过时间 跳跃“周围” 跳转到Label
Skipcond 000 交流 < 0 交流 >= 0 交流 < 0
Skipcond 400 交流 = 0 交流 <> 0 交流 = 0
Skipcond 800 交流 > 0 交流 <= 0 交流 > 0

如果您的意图是执行 if-then-else,则另一种方法可以反转条件并交换 then-part 和 else-part — 这有时可以允许使用更简单的 2 指令序列。

虽然这些不是 的唯一用途SkipCond,但它们确实涵盖了所有 6 个关系运算符,并提供了一个通用的 if-goto-label,它是汇编语言中控制结构的基石。


对于原始问题帖子:您对跳过Jump指令有正确的想法,但条件错误。

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

..
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 除了与 0 之外不进行比较,让我们应用一些数学运算:从>=表达式的X >= 10两边减去 10X - 10 >= 0

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

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

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

于 2021-03-20T19:24:57.770 回答