如何解决鉴于伪代码,我必须编写玛丽的汇编语言
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 |
好的,那么,让我们将 Skipcond
与 Jump
结合起来(就像你经常做的那样):
Skipcond xxx
Jump 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 >= 10
的 X - 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 举报,一经查实,本站将立刻删除。