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