仅使用+1/-1运算(一元追加/删除位)对2^x进行编码



我上了一堂汇编编程课,这学期刚开始,所以我对这方面还很陌生。他给了我们一个一元(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循环中。我将把伪代码翻译成真正的指令留给你。

最新更新