Ошибка QtSpim: «попытка выполнить не инструкцию» в рабочем коде - PullRequest
0 голосов
/ 31 октября 2018

Скриншот моей ошибки

У меня два компьютера, и я не получаю эту ошибку при запуске одного и того же кода MIPS в QtSpim на одном из них.

Я попытался найти инструкцию по адресу в сообщении об ошибке, но не могу найти адрес на странице ... или в любом месте.

Я также попробовал пошаговые инструкции. Сообщение об ошибке появляется при первой инструкции.

Вот код на всякий случай:

.data

N:  .word  4

m:  .word  2, 5, 3, 4
    .word  1, 7, 2, 7
    .word  6, 6, 4, 5
    .word  2, 5, 3, 4

a:  .space 16

    .align  2

# main program + show function

   .data
msg1:
   .asciiz "Matrix\n"
msg2:
   .asciiz "Array\n"
   .align  2

   .text
   .globl main
main:
   addi $sp, $sp, -4
   sw   $fp, ($sp)
   la   $fp, ($sp)
   addi $sp, $sp, -4
   sw   $ra, ($sp)

   la   $a0, m
   lw   $a1, N
   la   $a2, a
   jal  colSum       # colSum(m, N, a)

   la   $a0, msg1
   li   $v0, 4
   syscall           # printf("Matrix\n")
   la   $a0, m
   lw   $a1, N
   jal  showMatrix   # showMatrix(m, N)

   la   $a0, msg2
   li   $v0, 4
   syscall           # printf("Array\n")
   la   $a0, a
   lw   $a1, N
   jal  showArray    # showArray(b, N)

   lw   $ra, ($sp)
   addi $sp, $sp, 4
   lw   $fp, ($sp)
   addi $sp, $sp, 4
   j    $ra

# end main()

# void showMatrix(m, N)
# params: m=$a0, N=$a1
# locals: m=$s0, N=$s1, row=$s2, col=$s3
showMatrix:
   addi $sp, $sp, -4
   sw   $fp, ($sp)
   la   $fp, ($sp)
   addi $sp, $sp, -4
   sw   $ra, ($sp)
   addi $sp, $sp, -4
   sw   $s0, ($sp)
   addi $sp, $sp, -4
   sw   $s1, ($sp)
   addi $sp, $sp, -4
   sw   $s2, ($sp)
   addi $sp, $sp, -4
   sw   $s3, ($sp)

   move $s0, $a0
   move $s1, $a1
   li   $s2, 0
show_matrix_loop1:
   bge  $s2, $s1, end_show_matrix_loop1

   li   $s3, 0
show_matrix_loop2:
   bge  $s3, $s1, end_show_matrix_loop2

   li   $a0, ' '          # putchar(' ')
   li   $v0, 11
   syscall

   move $t0, $s2
   mul  $t0, $t0, $s1
   add  $t0, $t0, $s3
   li   $t1, 4
   mul  $t0, $t0, $t1
   add  $t0, $t0, $s0
   lw   $a0, ($t0)
   li   $v0, 1            # printf("%d",m[row][col])
   syscall

   addi $s3, $s3, 1       # col++
   j    show_matrix_loop2

end_show_matrix_loop2:
   li   $a0, '\n'         # putchar('\n')
   li   $v0, 11
   syscall

   addi $s2, $s2, 1       # row++
   j    show_matrix_loop1

end_show_matrix_loop1:

   lw   $s3, ($sp)
   addi $sp, $sp, 4
   lw   $s2, ($sp)
   addi $sp, $sp, 4
   lw   $s1, ($sp)
   addi $sp, $sp, 4
   lw   $s0, ($sp)
   addi $sp, $sp, 4
   lw   $ra, ($sp)
   addi $sp, $sp, 4
   lw   $fp, ($sp)
   addi $sp, $sp, 4
   j    $ra

# void showArray(a, N)
# params: a=$a0, N=$a1
# locals: a=$s0, N=$s1, i=$s2
showArray:
   addi $sp, $sp, -4
   sw   $fp, ($sp)
   la   $fp, ($sp)
   addi $sp, $sp, -4
   sw   $ra, ($sp)
   addi $sp, $sp, -4
   sw   $s0, ($sp)
   addi $sp, $sp, -4
   sw   $s1, ($sp)
   addi $sp, $sp, -4
   sw   $s2, ($sp)

   move $s0, $a0
   move $s1, $a1
   li   $s2, 0            # i = 0
show_array_for:
   bge  $s2, $s1, end_show_array_for

   li   $a0, ' '          # putchar(' ')
   li   $v0, 11
   syscall

   move $t0, $s2
   mul  $t0, $t0, 4
   add  $t0, $t0, $s0
   lw   $a0, ($t0)
   li   $v0, 1            # printf("%d",a[i])
   syscall

incr_show_array_for:
   addi $s2, $s2, 1       # i++
   j    show_array_for

end_show_array_for:
   li   $a0, '\n'
   li   $v0, 11
   syscall

   lw   $s2, ($sp)
   addi $sp, $sp, 4
   lw   $s1, ($sp)
   addi $sp, $sp, 4
   lw   $s0, ($sp)
   addi $sp, $sp, 4
   lw   $ra, ($sp)
   addi $sp, $sp, 4
   lw   $fp, ($sp)
   addi $sp, $sp, 4
   j    $ra
# COMP1521 17s2 Final Exam
# void colSum(m, N, a)

   .text
   .globl colSum

# params: m=$a0, N=$a1, a=$a2
colSum:
# prologue
   addi $sp, $sp, -4
   sw   $fp, ($sp)
   la   $fp, ($sp)
   addi $sp, $sp, -4
   sw   $ra, ($sp)
   addi $sp, $sp, -4
   sw   $s0, ($sp)
   addi $sp, $sp, -4
   sw   $s1, ($sp)
   addi $sp, $sp, -4
   sw   $s2, ($sp)
   addi $sp, $sp, -4
   sw   $s3, ($sp)
   addi $sp, $sp, -4
   sw   $s4, ($sp)
   addi $sp, $sp, -4
   sw   $s5, ($sp)


# suggestion for local variables (based on C code):
# m=#s0, N=$s1, a=$s2, row=$s3, col=$s4, sum=$s5


   li    $s4, 0      # col
   li    $s5, 0      # sum

for_col: 
   bge   $s4, $a1, for_col_end       # if col >= N, end the loop   
   li    $s5, 0                       # sum = 0 ;  

    li    $s3, 0      # row
for_row:
   bge   $s3, $a1, for_row_end       # if row >= N, end the loop 


   # DO : sum += m[row][col];
   li    $t0, 4               # size of int 
   mul   $t1, $a1, $s3       # curr row x number of columns 
   add  $t1, $t1, $s4       # =+ current column 
   mul   $t0, $t1, $t0        # =* size of int      ////// $t0 is now the offset 
 #  la    $t1, ($a0)             # load address of matrix into $t1 
   add  $t0, $t0, $a0        # get the exact address of our current position in the matrix 

   lw    $t1, ($t0)           # get the word value from the address
   add  $s5, $s5, $t1       # sum += m[row][col];

   addi  $s3, $s3, 1         # row ++; 
   j  for_row; 
for_row_end:

   # DO: a[col] = sum;      
   li    $t0, 4 
   mul   $t0, $t0, $s4       # 4xcol  this is out offset from array a 
   addu  $t0, $t0, $a2        # current address of a[col]

   sw    $s5, ($t0)         #  a[col] = sum;      /// store the word in $s3 (sum) into the address at $t0

   addu  $s4, $s4, 1       # col ++ 
   j  for_col; 
for_col_end: 

# epilogue
   lw   $s5, ($sp)
   addi $sp, $sp, 4
   lw   $s4, ($sp)
   addi $sp, $sp, 4
   lw   $s3, ($sp)
   addi $sp, $sp, 4
   lw   $s2, ($sp)
   addi $sp, $sp, 4
   lw   $s1, ($sp)
   addi $sp, $sp, 4
   lw   $s0, ($sp)
   addi $sp, $sp, 4
   lw   $ra, ($sp)
   addi $sp, $sp, 4
   lw   $fp, ($sp)
   addi $sp, $sp, 4
   j    $ra

У меня есть ощущение, что это может быть связано с настройками на моем компьютере, потому что я попробовал этот код на QtSpim на компьютере моего коллеги, и он работает нормально.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Решено! Оказывается, в QtSpim были параметры, которые я установил давным-давно и (тупо) забыл очистить. Если у вас есть проблема, перейдите на Симулятор> Параметры запуска> (снимите флажки и нажмите ОК).

0 голосов
/ 31 октября 2018

Я могу получить подобное сообщение, если я включил отложенные ветви в QtSpim.

На машине, которая не работает, нажмите кнопку «Простая машина» в настройках и попробуйте эти настройки.

...