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
将输出表示为变量的函数(例如,输出=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结果的逻辑是正确的,但机制解释是错误的。(). 我决定继续编辑答案以修复它。