If statement 玛丽:那么

If statement 玛丽:那么,if-statement,assembly,marie,If Statement,Assembly,Marie,伪代码: if x > 1 then y = x + x; x = 0; endif; y = y + 1; ORG 100 IF, LOAD X SUBT ONE / What is this for? SKIPCOND 800 JUMP ENDIF THEN, LOAD X ADD X STORE Y LOAD ZERO STORE X END

伪代码:

if x > 1 then
   y = x + x;
   x = 0;
endif;
   y = y + 1;
ORG 100
IF,     LOAD X
        SUBT ONE / What is this for?
        SKIPCOND 800
        JUMP ENDIF
THEN,   LOAD X
        ADD X
        STORE Y
        LOAD ZERO
        STORE X
ENDIF,  LOAD Y
        ADD ONE
        STORE Y
        HALT
X,      DEC ?
Y,      DEC ?
ONE,    DEC 1
ZERO,   DEC 0
我根据伪代码跟踪下面的MARIE代码:

if x > 1 then
   y = x + x;
   x = 0;
endif;
   y = y + 1;
ORG 100
IF,     LOAD X
        SUBT ONE / What is this for?
        SKIPCOND 800
        JUMP ENDIF
THEN,   LOAD X
        ADD X
        STORE Y
        LOAD ZERO
        STORE X
ENDIF,  LOAD Y
        ADD ONE
        STORE Y
        HALT
X,      DEC ?
Y,      DEC ?
ONE,    DEC 1
ZERO,   DEC 0

为什么这里需要SUBT ONE?

它通过从
x
中减去
1
进行比较,将结果保留在累加器中。然后,我们可以根据AC中的结果值是零、正还是负使用条件分支

查找SKIPCOND 800的功能:


与大多数体系结构不同,在这些体系结构中,加法/减法指令设置标志,条件分支对其进行测试,而MARIE的条件分支指令是一种测试和分支,如使用MARIE Simulator进入并运行以下程序:

输入

存储测试值

如果是,请输入Skipcond 800

跳转

然后,商店

加Y

跳转结束

否则,加载Y

EndIf,添加X

加X

商店Z

输出

停止

十、 12月5日

Y、 12月2日

Z、 12月0日

12月1日,特斯瓦尔

说明:

  • 使用“组织”指令在地址100处启动您的程序

  • 当要求您输入号码时,请使用您最后的大学ID号。 例如,如果您的ID是1415161678532,那么您将使用数字2

b) 假设输入了值,例如a。有什么说明 将要执行的上述程序?你的回答应该能解释流程 a0的执行时间

c) 根据你在第二部分中的回答,通过
将输出表示为变量的函数(例如,输出=3x-2a+y)

我认为它们添加的原因

SUBT ONE 
因为对于x>1我们没有跳过条件,但是对于x>0我们有跳过条件,这是

skipcond 800 / meaning X > 0
既然是这样,我想他们只是从两边减去了一,使它们相等。(x-1)>(1-1)/与(x-1)>0相同。从这里,我们可以使用skipcond


这是我最有根据的猜测。希望这能在五年后有所帮助。

是的,这是正确的,比@starblue的答案更准确。Skipcond在AC中测试值,并且不关心前面减法的结果()。与许多其他汇编语言/ISA不同,MARIE没有标志。它更像MIPS,其中SKIPCOND是AC上的一个测试和分支。因为我们在SUBT结果上使用它,所以测试SUBT结果的逻辑是正确的,但机制解释是错误的。(). 我决定继续编辑答案以修复它。