0

したがって、2 つの配列を入力してそのうちの 1 つを (今のところ) 印刷していますが、配列の 1 つを印刷すると、一方の配列の値ともう一方の配列の値が印刷されます。なぜこれが起こるのか分かりません。助けてください。これが私のコードで、出力例が続きます。

.data

    title: .asciiz "Find The Product of Two Matrices\n\n"
    menuString: .asciiz "Menu\n\n"
    option1: .asciiz "1. Enter values and find product\n"
    option2: .asciiz "2. Exit program\n\n"
    inputString: .asciiz "Enter selection: "

    promptSize: .asciiz "\nEnter row size of square matrix: "
    promptRow: .asciiz "Row: "
    promptCol: .asciiz "Col: "
    promptMatrix1Float: .asciiz "Enter a first matrix's float: "
    promptMatrix2Float: .asciiz "Enter a second matrix's float: "
    answer: .asciiz " Answer:"
    printFloat: .asciiz "\nA Float: "
    inputFirstMatrix: .asciiz "\n\nInput First Matrix(left-to-right and top-to-bottom):\n\n"
        inputSecondMatrix: .asciiz "\n\nInput Second Matrix(left-to-right and top-to-bottom):\n\n"


.globl main
.text

################################### INPUT SIZE AND MATRICES ####################


size:  li $v0, 4
       la $a0, promptSize
       syscall

        li, $v0, 5
    syscall



       add $t1, $v0, $v0
       li $t0, 0

    li $v0, 4
    la $a0, inputFirstMatrix
    syscall

L1: beq $t0, $t1, L2IndexInit

    li $v0, 4
    la $a0, promptMatrix1Float
    syscall

        li $v0, 6                      #6 is the syscall code for get float
        syscall 

        sll $t3, $t0,  3
    add $t3, $a2, $t3
    s.d $f0, 0($t3)         # Store $f0 at memory location .


    addi $t0, $t0, 1

    j L1 

L2IndexInit:


    li $v0, 4
    la $a0, inputSecondMatrix
    syscall

        li $t0, 0


L2: beq $t0, $t1, PrintIndexInit

    li $v0, 4
    la $a0, promptMatrix2Float
    syscall

        li $v0, 6                      #6 is the syscall code for get float
        syscall 

        sll $t3, $t0,  3
    add $t3, $a1, $t3
    s.d $f0, 0($t3)         # Store $f0 at memory location .


    addi $t0, $t0, 1

    j L2 

############################## PRINT MATRIX ################################################# 

PrintIndexInit:  
     li $t0, 0

PrintMatrix:   beq $t0, $t1, End

      sll $t4, $t0, 3
      add $t4, $a2, $t4
      l.d $f12, 0($t4)

      li $v0, 4
      la $a0, printFloat
      syscall

      li $v0, 2                      #2 is the syscall code for print float (arg. to print in f12)
      syscall

      addi $t0, $t0, 1

      j PrintMatrix






####################################### MAIN FUNCTION AND END ######################

End:
     lw $ra, 0($sp)
     addi $sp, $sp, 4
     jr $ra




main:
    li $v0, 4   
    la $a0, title
    syscall


        addi $sp, $sp, -4
        sw $ra, 0($sp)
        jal size
    li $v0, 10
    syscall

出力例:

2 つの行列の積を求める


正方行列の行サイズを入力してください: 2


最初の行列を入力 (左から右、上から下):

最初の行列の float を入力してください: 2.3
最初の行列の float を入力してください: 4.3
最初の行列の float を入力してください: 6.5
最初の行列の float を入力してください: 4.3


入力 2 番目のマトリックス (左から右、上から下):

2 番目の行列の float を入力してください: 3.2
2 番目の行列の float を入力してください: 6.5
2 番目の行列の float を入力してください: 8.9
2 番目の行列の float を入力してください: 3.2

フロート: 6.50000000
フロート: 8.89999962
フロート: 3.20000005
フロート: 4.30000019
4

1 に答える 1

0

実行できないコードにはいくつかの問題があります。

  • 2 つのマトリックスにスペースが割り当てられていません --syscall 9ヒープにスペースを割り当てるために使用します
  • ではEnd、スタックから戻りアドレスをポップしていますが、必要なアドレスは既に$ra

これらを修正して実行すると、コードは正常に動作します。でメモリを割り当てた方法は次のsizeとおりです。

size:  
    li $v0, 4
    la $a0, promptSize
    syscall

    li $v0, 5
    syscall
    add $t1, $v0, $v0

    sll $a0, $t1, 3
    li $v0, 9
    syscall
    move $a2, $v0

    li $v0, 9
    syscall
    move $a1, $v0

    li $t0, 0

    li $v0, 4
    la $a0, inputFirstMatrix
    syscall

Endmain:

End:
    jr $ra

main:
    li $v0, 4   
    la $a0, title
    syscall

        addi $sp, $sp, -4
        sw $ra, 0($sp)
        jal size

        lw $ra, 0($sp)
        addi $sp, $sp, 4

    li $v0, 10
    syscall

出力:

Find The Product of Two Matrices


Enter row size of square matrix: 2


Input First Matrix(left-to-right and top-to-bottom):

Enter a first matrix's float: 1.2
Enter a first matrix's float: 3.4
Enter a first matrix's float: 5.6
Enter a first matrix's float: 7.8


Input Second Matrix(left-to-right and top-to-bottom):

Enter a second matrix's float: 2.1
Enter a second matrix's float: 4.3
Enter a second matrix's float: 6.5
Enter a second matrix's float: 8.7

A Float: 1.2
A Float: 3.4
A Float: 5.6
A Float: 7.8
于 2012-10-15T23:45:37.670 に答える