与MARIE Assembly斗争。我需要写一个有x=3和y=5的代码,如果是x>y,那么它需要输出1,如果是x
LOAD X SUBT Y SKIPCOND 800跳跃否则输出停止
发布于 2021-09-18 05:46:43
结构化语句有一个模式,每个语句在汇编语言中都有一个等价的模式。
例如,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
为false时进行分支。条件分支的要点是当条件为false时跳过then部分(跳到else部分)-当条件为true时,简单地允许处理器运行then部分,而不是向前分支。
我们不能允许then-part和else-part为同一个if -语句的执行同时执行。then-part,一旦完成,应该使处理器移动到if- then -else之后的下一条语句,尤其是避免else-part,因为then-part刚刚触发。这是使用一个无条件分支(goto without if)来完成的,跳过else-part -如果then-part刚刚触发,那么我们希望处理器无条件地跳过else-part。
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,所以我们将有两个标签if1Done
和if1Else
. 将在结构化模式中找到的代码放置在if-goto-label模式的等效位置中,它将起到相同的作用。
MARIE使用SkipCond
来形成if-goto语句。这是典型的机器代码,有单独的比较和分支指令(对于许多指令集体系结构,有太多的操作数来在一条指令中编码if goto (if x >= y goto Label;
有x
,y
,>=
和Label
作为操作数/参数)),MARIE使用相对于0(. SkipCond
)的减法和分支. 有其他write-ups的具体使用方法,所以我不在这里讨论,尽管你已经有了一个很好的开始。
https://stackoverflow.com/questions/69230779
复制相似问题