0

与 MARIE 大会作斗争。需要写一个 x=3 和 y=5 的代码,如果 x>y 则需要输出 1,如果 x<y 需要输出 1,我有开始但不知道该怎么做 if else玛丽的陈述

LOAD X SUBT Y SKIPCOND 800 JUMP ELSE OUTPUT HALT

4

1 回答 1

0

结构化语句有一个模式,每个语句在汇编语言中都有一个等效的模式。

例如,if-then-else 语句具有以下模式:

if ( <condition> )
    <then-part>
else
    <else-part>
// some statement after if-then-else

汇编语言使用 if-goto-label 样式。if-goto 是条件测试和分支;goto 单独是一个无条件分支。这些形式改变了控制流程,并且可以组合成与结构语句相同的工作。

汇编中 if-then-else 的等效模式(但用伪代码编写)如下:

    if ( <condition> is false ) goto if1Else;
    <then-part>
    goto if1Done;
if1Else:
    <else-part>
if1Done:
    // some statement after if-then-else

您会注意到第一个条件分支(if-goto)需要在条件为 false 时进行分支。例如,假设条件是x < 10,那么 if-goto 应该读取if ( x >= 10 ) goto if1Else;,它的分支x < 10是假的。条件分支的要点是在条件为假时跳过 then 部分(向前跳到 else 部分)——当条件为真时,简单地允许处理器运行 then 部分,而不是向前分支。

对于同一个 if 语句的执行,我们不能同时允许 then 部分和 else 部分执行。then 部分一旦完成,应该使处理器继续执行 if-then-else 之后的下一条语句,特别是要避免 else 部分,因为 then 部分刚刚触发。这是使用无条件分支(没有 if 的 goto)来完成的,以跳过 else 部分——如果 then 部分刚刚触发,那么我们希望处理器无条件地跳过 else 部分。

if-then-else 语句的汇编模式以标签结尾,这里if1Done:是 if-goto-label 样式中 if-then-else 模式的逻辑结束。许多人喜欢在接下来发生的事情之后命名标签,但这些标签在逻辑上是 if-then-else 的一部分,所以我选择在结构化语句模式之后命名它们而不是后续代码。希望您遵循汇编模式,并看到 if-then-else 运行 then-part 或 else-part,控制流回到一起运行 if-then-else 之后的下一行代码,不管是什么(在 if-then-else 之后必须有一个语句,因为单个语句只是一个片段:需要完成才能实际运行的不完整代码片段)。

当有多个结构化语句(如 if 语句)时,每个模式转换必须使用自己的一组标签,因此标签的编号。

(有一些优化可以在两个结构化语句之间共享标签,但这样做不会以任何方式优化代码,并且更难更改。有时嵌套语句会导致分支到无条件分支——因为这些实际的机器代码和有运行时成本,它们可以被优化,但这样的优化使代码更难返工,所以应该推迟到代码工作为止。)

当两个或多个 if 语句嵌套时,该模式会简单地应用多次。我们可以先转换外部 if 语句,或者先转换内部 if 语句,只要正确应用该模式,控制流在汇编中的工作方式与在结构化语句中相同。

总之,首先编写一个更大的 if-then-else 语句:

if ( x < y ) 
    Output(1)
else
    Output(one)

(我不确定这是你需要的,但它就是你所说的。)

然后将模式转换应用到 if-goto-label 中:因为,在抽象中,这是第一个 if-then-else,我们称它为 if #1,所以我们将有两个标签if1Doneif1Else。将在结构化模式中找到的代码放入 if-goto-label 模式的等效位置,它的工作方式相同。

MARIE 用于SkipCond形成 if-goto 语句。机器代码通常具有单独的比较和分支指令(对于许多指令集架构,有太多操作数无法在单个指令中编码 if goto (if x >= y goto Label;has xy>=Labelas 操作数/参数)。MARIE 使用相对于 0 (the) 的减法和分支SkipCond。还有其他关于使用它的具体方法的文章,所以我不会在这里讨论,尽管你已经有了一个好的开始。

于 2021-09-18T13:46:43.003 回答