河内塔在MIPS

时间:2013-04-30 21:35:48

标签: mips

尝试将其转换为可以为其输入磁盘/响铃次数的程序。我得到了计算机看到工作的响铃次数,但输出结果不正确。如果我输入正好3它工作正常,但如果我放入少于它仍然加载所有3的图形,但只有移动,但很多我告诉计算机有。如果我输入的不仅仅是6,那么它会操纵未使用的数据中的数字(实际使用它们但它们只是我能说的图形)两次基本上从乞讨开始。只要我输入的数字与未使用的数量完全相同(严重的是我可以把w,g,f,t,n,u放在那里并输入6并且它会正常工作)它工作正常。

我认为我需要做的是找到一种方法来填充未使用的数字1-n,其中n是我输入的数字,但我不知道该怎么做。到目前为止,这是我的代码:

.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:"

任何人都知道如何动态填充未使用的内容,就像我需要它一样?

0 个答案:

没有答案