MARIE Assembly if else



与MARIE Assembly斗争。需要写一段代码,其中x=3, y=5,是x>y,那么它需要输出1,如果x

LOAD X
SUBT Y
SKIPCOND 800
JUMP ELSE
OUTPUT
HALT

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

例如,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-部分还是else-部分,控制流都会回到一起,运行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;x,y,>=Label作为操作数/参数)。MARIE使用相对于0的减法和分支(SkipCond)。还有其他关于使用它的具体方法的文章,所以我不会在这里深入讨论,尽管你已经有了一个良好的开端。

最新更新