我上了一堂汇编编程课,这学期刚开始,所以我对这方面还很陌生。他给了我们一个一元(ex:3=111(的虚构语言来编码2^r1
。假设r1=111,那么它应该返回11111111,因为2^3是8。
我们有3个寄存器(r1、r2、r3(和以下指令:
-
push r
(寄存器r加1( -
pop r
(将1移到寄存器r,如果r为空则不执行任何操作( -
empty r, lineX
(如果r为空,则转到第X行,否则不执行任何操作( -
goto lineX
(去X线( -
concat r, s
(将寄存器s中的数字1加到寄存器r中( -
ret r
(返回r值并结束程序(
假设r2和r3在开始时为空。这是一个额外的问题,你不能使用concat函数来增加难度。有人能帮忙吗?我可以用concat来做,但不能没有concat。
以下是我对concat的处理方法:
//Start:
Push r1
Push r3
//L3:
Empty r1, end
//L4:
Empty r3, L8
Push r2
Pop r3
Goto L4
//L8:
Concat r3, r2
Pop r1
Goto L3
//End:
Ret r2
我的问题是,我不能用另一个循环来模拟concat,因为我的另外两个寄存器是其他东西所需要的。我有什么东西不见了吗?
基本解决方案是:
r2 = 1
r1 loop: double r2
(伪代码,想象"rx循环"是指示例代码中已经使用的空rx、循环体、pop-rx、goto组合(
您可以使用concat将r2加倍。我想知道是否允许concat r2,r2…:(我们可以用其他运算和r3来加倍r2吗?
类似:
r3 = 0
r2 loop: {
push r3
push r3
}
然后将其复制回r2:
r3 loop: push r2
从课程开始,所有内容都包含在r1循环中。我将把伪代码翻译成真正的指令留给你。