0

我正在尝试将值添加到子例程内的数组中。我可以将第一个有效值(正数且可被 3 整除)放入数组中,但下一个有效条目不起作用。我可以输入一个有效数字,然后输入一个无效数字,程序运行正常,但两个有效数字使 Spim 停止工作。我花了几个小时试图弄清楚但没有运气。从一个子程序跳转是分配的要求,我有一个工作程序,但缺少所有不必要的(在我看来)子程序。

    .data
    array1:                 .word   80
    EnterARVal:             .asciiz "Please enter a number:\t"
    space:                  .asciiz " "
    errormessage:           .asciiz "*****Error: "
    notpos:                 .asciiz " is not a positive number.\n"
    notdiv3:                .asciiz " is not divisible by 3.\n"
    numadded:               .asciiz " added to array.\n"
    EnterElem:              .asciiz "Enter number "
    ARReverse:              .asciiz "The contents of the array in reverse orders is:\n"
    InvalidAR:              .asciiz "Invalid number of array elements, please try again.\n"                     
                    .text



main:                   
                    la  $s0, array1 #array1 pointer
                    li  $t0, 1
begin:                  

                    jal readNum #go to readNum subroutine

                    add $a0, $0, $v0    #stores readNum input to $a0

                    jal verifySize  #jumps to verifySize subroutine

                    add $t1, $v1, $0    #stores 0 or 1 value to $t1

                    beq $t1, $0, begin  #starts over if t1 is 0 or false

                    beq $t1, $t0, numok #goes to numok if t1 is 1 or true

                    numok:  add     $a0, $0, $a0
                            add     $a1, $0, $s0
                            jal     createArray

                 j exit


readNum:                li  $v0, 4
                    la  $a0, EnterARVal
                    syscall

                    li  $v0, 5
                    syscall

                    add $v0, $v0, $0

                    j   $ra

verifySize:             add $t1, $0, $a0

                    li  $t2, 20 
                    li  $t3, 1
                    li  $t4, 0
                    li  $t5, 1

                    slt $t6, $t1, $t3
                    beq $t6, $t3, toolow

                    sgt $t7, $t1, $t2
                    beq $t7, $t3, toohigh
                    beq $t7, $t4, oknum

                    oknum:
                    add $v1, $t5, $0

                    j   $ra

                    toolow:
                    li  $v0, 4
                    la  $a0, InvalidAR
                    syscall

                    add $v1, $t4, $0
                    j   $ra

                    toohigh:
                    li  $v0, 4
                    la  $a0, InvalidAR
                    syscall

                    add $v1, $t4, $0                    
                    j   $ra


createArray:            add     $s1, $a0, $0
                    add     $s0, $a1, $0
                    li  $t0, 0 #counter
                    li  $t2, 1

                    add $a0, $s1, $0
                    li  $v0, 1
                    syscall

    makingarray:        beq $t0, $s1, arraydone

                    jal readNum #go to readNum subroutine

                    add $a0, $v0, $0    #stores number from readNum to $a0
                    jal checkNumPositive    #jump to checkNumPositive subroutine

                    add $t1, $v0, $0
                    beq $t1, $0, positivenum    #if number is positive go to positivenum
                    beq $t1, $t2, notpositive

                    positivenum:
                    jal divisibleBy3
                    add $t4, $v0, $0

                    beq $t4, $0, notdivisibleby3


                        sw  $a0, 0($s0)

                        li  $v0, 1
                        syscall

                        li  $v0, 4
                        la  $a0, numadded
                        syscall

                        add $s0, $s0, 4
                        add $t0, $t0, 1
                        j   makingarray

                        arraydone:                  
                        add $v0, $s0, $0
                        j   $ra                         

                        notpositive:
                        li  $v0, 4
                        la  $a0, notpos
                        syscall

                        j makingarray

                        notdivisibleby3:
                        li  $v0, 4
                        la  $a0, notdiv3
                        syscall
                        j makingarray



#reverseArray:





divisibleBy3:           add $t0, $a0, $0
                    li  $t1, 3

                    div $t0, $t1
                    mfhi    $t2
                    mflo    $t3

                    seq     $t4, $t2, $0

                    add     $v0, $t4, $0
                    j       $ra


checkNumPositive:       li  $t0, 0

                    slt $t1, $a0, $0    #set t1 to 1 if number is less than 0

                    add $v0, $t1, $t0
                    j   $ra


exit:                   li  $v0, 10
                    syscall

感谢任何有关如何修复 createArray 的提示,谢谢。

4

1 回答 1

1

您的主要问题是您使用.word 80它只保留一个值为 80 的单词。您可能打算.space 80为最多 20 个单词保留空间(这似乎是您的代码中强制执行的限制)。

进一步的问题是您没有遵循关于需要保留哪些寄存器的约定。

例如,您使用$t0as counter increateArray并且它不会在子例程中保留,不是按照惯例,事实上也不是您的代码(两者都divisibleBy3销毁checkNumPositive它)。

嵌套子程序调用中未正确保留的类似问题,$ra因此返回地址createArray被从那里调用的子程序覆盖。

我认为作业的目的是教你这些细微差别。

于 2012-10-22T01:29:41.417 回答