Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 拼图求解器mips组装中的回溯_Assembly_Mips_Backtracking - Fatal编程技术网

Assembly 拼图求解器mips组装中的回溯

Assembly 拼图求解器mips组装中的回溯,assembly,mips,backtracking,Assembly,Mips,Backtracking,我正在MIPS汇编中研究回溯算法,在处理代码的范围和结构时迷失了方向 我们这里有一些移动部件,我只是想弄清楚如何处理它们,这让我自己更加困惑 最终目标是使用回溯的谜题解算器 “运动部件” 我们有一个索引数组的地址,其中包含我们需要更改的谜题的所有索引。董事会的其余部分不能更改 我们有拼图板的地址,只是一个字节数组 我们有电路板的总尺寸,我们将用这个来检查我们是否已经看了整个电路板,知道我们完成了 我们有一个函数是合法的(arg1,arg2)。Arg1是要检查的板(阵列)的地址,arg2是板的大小

我正在MIPS汇编中研究回溯算法,在处理代码的范围和结构时迷失了方向

我们这里有一些移动部件,我只是想弄清楚如何处理它们,这让我自己更加困惑

最终目标是使用回溯的谜题解算器

“运动部件”

我们有一个索引数组的地址,其中包含我们需要更改的谜题的所有索引。董事会的其余部分不能更改

我们有拼图板的地址,只是一个字节数组

我们有电路板的总尺寸,我们将用这个来检查我们是否已经看了整个电路板,知道我们完成了

我们有一个函数是合法的(arg1,arg2)。Arg1是要检查的板(阵列)的地址,arg2是板的大小。如果合法,则返回0,如果不合法,则返回1

所以我们先装上

   initialize_guessing:
               .. # build up stack
               la   $s0, $a0         # s0 = address of board
               la   $s1, $a1         # s1 = address of index array
               la   $s2, $a2         # s2 = size of index array
               la   $s3, $a3         # s3 = size of board 
               li   $t0, 0           # t0 = values to test
               li   $t1, 0           # t1 = index counter
   start_guessing:
               beq  $t1, $s2, done   # if t1 = s2, we've used all indexes
               lb   $t2, 0($s1)      # get first index 
               add  $s0, $s0, $t2    # move to first index
               sb   $t0, 0($s0)      # put t0 into board
               move $a0, $s0         # a0 = board address for if_legal
               move $a1, $s3         # a1 = board size for if_legal
               jal  if_legal         # check if board is legal
               beq  $v0, $zero, continue_guessing   # if board is legal, continue
               j    new_guess        # try a new guess
   new_guess:
               addi $t0, 1           # increment t0 to try a new value
               jal  start_guessing
   continue_guessing:
               addi $s1, 1           # increment index array to next index
               jal  start_guessing
   done:
              # destroy stack
               jr   $ra

这就是我到目前为止得到的,我知道它是不完整的,我相信最终整个猜测函数需要返回一些东西,但我不知道什么时候返回。如有任何提示,将不胜感激

这甚至不会组装
la$s0,$a0
错误(应该是
move$s0,$a0
)。
jal开始猜测
意味着
start\u猜测
是一项功能。除非算法是递归的,否则您可能需要开始猜测。如果它是递归的,你需要在堆栈框架中保存东西(特别是
$ra
)@CraigEstey是的,这只是一个“草稿”。我甚至没有尝试过组装它,但感谢您指出这些。另一个建议:根据算法的[最大]复杂度[以代码行为单位],如果您先用C语言(或其他高级语言)进行编码,可能会更容易。在那里调试算法。然后,创建MIPS版本只是忠实地再现算法的问题[将C代码视为伪代码]。这样,您就不会同时解决这两个问题:(1)算法正确吗?(2) 我只是在MIPS中使用了错误的reg或错误的指令。绝对同意@Craig。如果asm的总体策略与您认为的最佳策略类似,那么优化的编译器输出可以成为asm的良好起点。一旦你开始手工修改它,你仍然可以通过调整C并重新编译回到编译器中寻找想法,但是你只需要手动复制想法,而不是实际的指令。(如果没有别的,寄存器分配可能会改变。)@PeterCordes我主要考虑的是C本身。这里:有C代码在MIPS函数上方的顶部注释块中结束的情况。asm中的侧栏注释指的是C代码。第二个链接还有很多关于如何编写好asm的建议[我自己的经验]。此外,在考虑算法时,可以编写样板代码。这甚至不会进行汇编
la$s0,$a0
错误(应该是
move$s0,$a0
)。
jal开始猜测
意味着
start\u猜测
是一项功能。除非算法是递归的,否则您可能需要开始猜测。如果它是递归的,你需要在堆栈框架中保存东西(特别是
$ra
)@CraigEstey是的,这只是一个“草稿”。我甚至没有尝试过组装它,但感谢您指出这些。另一个建议:根据算法的[最大]复杂度[以代码行为单位],如果您先用C语言(或其他高级语言)进行编码,可能会更容易。在那里调试算法。然后,创建MIPS版本只是忠实地再现算法的问题[将C代码视为伪代码]。这样,您就不会同时解决这两个问题:(1)算法正确吗?(2) 我只是在MIPS中使用了错误的reg或错误的指令。绝对同意@Craig。如果asm的总体策略与您认为的最佳策略类似,那么优化的编译器输出可以成为asm的良好起点。一旦你开始手工修改它,你仍然可以通过调整C并重新编译回到编译器中寻找想法,但是你只需要手动复制想法,而不是实际的指令。(如果没有别的,寄存器分配可能会改变。)@PeterCordes我主要考虑的是C本身。这里:有C代码在MIPS函数上方的顶部注释块中结束的情况。asm中的侧栏注释指的是C代码。第二个链接还有很多关于如何编写好asm的建议[我自己的经验]。此外,在考虑算法时,还可以编写样板代码。