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
这里设置为跳过另一个跳转,并且基本上保持这个当前的代码序列,而第二个跳转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:
....
条件 |
跳过时间 |
跳跃“周围” |
跳转到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:
....
现在您可以从与零的比较和上表中看到您应该在这里使用什么条件。
或者,我们可以使用调试器来帮助我们查看它是否工作(如果不工作,则使用不同的条件)。