MIPS河内塔
尝试将其转换为一个程序,在该程序中我可以输入它的磁盘数/环数。我得到了计算机看到的工作环数,但输出不正确。如果我只输入3,效果很好,但如果我输入的少于3,它仍然会加载所有3的图形,但只会移动我告诉计算机的数量。如果我输入了更多的数据,比如6,它会从乞讨开始,两次处理未使用数据中的数字(实际使用的数据,但我可以说它们只是图形)。只要我输入的数字与未使用中的项目数完全相同(认真地说,我可以在那里输入w、g、f、t、n、u,然后输入6,它就可以正常工作),它就可以正常工作 我想我需要做的是找到一种方法,用数字1-n填充notused are,其中n是我输入的数字,但我不知道怎么做。以下是我目前的代码:MIPS河内塔,mips,Mips,尝试将其转换为一个程序,在该程序中我可以输入它的磁盘数/环数。我得到了计算机看到的工作环数,但输出不正确。如果我只输入3,效果很好,但如果我输入的少于3,它仍然会加载所有3的图形,但只会移动我告诉计算机的数量。如果我输入了更多的数据,比如6,它会从乞讨开始,两次处理未使用数据中的数字(实际使用的数据,但我可以说它们只是图形)。只要我输入的数字与未使用中的项目数完全相同(认真地说,我可以在那里输入w、g、f、t、n、u,然后输入6,它就可以正常工作),它就可以正常工作 我想我需要做的是找到一种方法
.text
.globl __start
__start:
li $v0,4 # System call code for print string
la $4,input # Argument string as input
syscall
# Read an integer
li $v0,5
syscall
# Move the integer to register $t0
move $t9,$v0
la $a0, tower1
la $a1, tower2
la $a2, tower3
la $a3,($t9)
jal moveStack
jal PrintTowers
li $v0, 10
syscall
moveStack:
sub $sp, $sp, 32
sw $a0, 0($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
sw $a3, 12($sp)
sw $s0, 16($sp)
sw $s1, 20($sp)
sw $s2, 24($sp)
sw $ra, 28($sp)
beq $a3,1,moveOne
move $s0, $a0
move $s1, $a1
move $s2, $a2
move $a0, $s0
move $a1, $s2
move $a2, $s1
sub $a3, $a3, 1
jal moveStack
move $a0, $s0
move $a1, $s1
jal moveRing
move $a0, $s2
move $a1, $s1
move $a2, $s0
jal moveStack
j end
moveOne:
jal moveRing
end:
lw $a0, 0($sp)
lw $a1, 4($sp)
lw $a2, 8($sp)
lw $a3, 12($sp)
lw $s0, 16($sp)
lw $s1, 20($sp)
lw $s2, 24($sp)
lw $ra, 28($sp)
add $sp,$sp,32
jr $ra
moveRing:
sub $sp,$sp,12
sw $a0, 0($sp)
sw $a1, 4($sp)
sw $ra, 8($sp)
jal PrintTowers
finds: sub $a0, $a0,4
lw $t0,($a0)
beqz $t0 founds
j finds
founds: add $a0, $a0, 4
lw $t0,($a0)
sw $0,($a0)
findd: sub $a1, $a1, 4
lw $t1,($a1)
beqz $t1 foundd
j findd
foundd: sw $t0($a1)
lw $a0, 0($sp)
lw $a1, 4($sp)
lw $ra, 8($sp)
add $sp, $sp, 12
jr $ra
PrintTowers:
sub $sp, $sp, 28
sw $v0, 0($sp)
sw $a0, 4($sp)
sw $s0, 8($sp)
sw $s1, 12($sp)
sw $s2, 16($sp)
sw $s3, 20($sp)
sw $ra, 24($sp)
la $s1, tower1
la $s2, tower2
la $s3, tower3
la $s0, ($t9)
mul $s0, $s0, 4
sub $s1, $s1, $s0
sub $s2, $s2, $s0
sub $s3, $s3, $s0
Loop: beqz $s0, exit
la $a0,Blanks
li $v0, 4
syscall
lw $a0,($s1)
jal printOne
lw $a0,($s2)
jal printOne
lw $a0,($s3)
jal printOne
la $a0, endl
li $v0, 4
syscall
sub $s0, $s0, 4
add $s1, $s1, 4
add $s2, $s2, 4
add $s3, $s3, 4
j Loop
exit: la $a0, Base
li $v0, 4
syscall
lw $v0, 0($sp)
lw $a0, 4($sp)
lw $s0, 8($sp)
lw $s1, 12($sp)
lw $s2, 16($sp)
lw $s3, 20($sp)
lw $ra, 24($sp)
add $sp, $sp, 28
jr $ra
printOne:
sub $sp, $sp, 12
sw $a0, 0($sp)
sw $v0, 4($sp)
sw $ra, 8($sp)
bnez $a0, ring
la $a0, Blank
li $v0, 4
syscall
j spaces
ring: li $v0, 1
syscall
spaces: la $a0, Blanks
li $v0, 4
syscall
lw $a0, 0($sp)
lw $v0, 4($sp)
lw $ra, 8($sp)
add $sp, $sp, 12
jr $ra
.data
Blanks: .asciiz " "
Blank: .asciiz " "
endl: .asciiz "\n"
Base: .ascii " ____ ____ ____\n"
.asciiz " T1 T2 T3\n\n\n"
.align 2
notused: .word 1,2,3 # .word1,2,3,4,5,6,7,8,9,10,11,12,13
tower1: .word 0,0,0,0,0,0,0,0,0,0,0,0,0
tower2: .word 0,0,0,0,0,0,0,0,0,0,0,0,0
tower3: .word 0
input: .asciiz "\nEnter number of disks:"
有人知道如何使未使用的内存像我需要的那样动态填充吗?听起来像是动态内存分配。我从这里得到的是:堆分配取决于操作系统,所以使用“纯”汇编程序时,你必须坚持使用堆栈。我使用的是MARS,一种MIPS模拟器。我知道这是我必须做的,但不是怎么做。这与您在PrintTowers中所做的类似(这就是编译器在函数调用之间保存寄存器值的方式)。假设您想在这个动态内存中存储4个值:
sub$sp,$sp,16
(16=4*4)。然后您可以像任何指针一样将它与0($sp)、4($sp)、8($sp)
和12($sp)
一起使用。不要忘记在之后“释放”堆栈:add$sp,$sp,16