我在MIPS上构建一个程序,用于检查矩阵的列是否以递增的方式排序,如果它的所有数字相等或是否相等,则以递减的方式排序无序。这是代码:
# #include <iostream>
# int m; int n;
# int M[m][n];
#
# int i=0; bool ordenada=true; int direccion=0; int j=0;
#
# cout<<"\n¿Qué columna desea comprobar? ";
# cin>>j;
#
# do{
# if (m[i][j] > m[i+1][j])
# if (direccion != 0) ordenada = false;
# else if (m[i][j] < m[i+1][j]){
# if ((direccion != 1)&&(i>0)) ordenada = false;
# direccion = 1;
# }
# else{
# if ((direccion != 2)&&(i>0)) ordenada = false;
# direccion = 2;
# }
# i++;
# }while ((i<m)&&ordenada);
# cout<<"\nLa columna "<<j;
# if (ordenada){
# cout<<" está ordenada";
# if (direccion == 0) cout<<" de manera decreciente."<<endl;
# else if (direccion == 1) cout<<" de manera creciente."<<endl;
# else cout<<" de manera que todas las variables son iguales."<<endl;
# }
# else cout<<" está desordenada."<<endl;
.globl main
.data
m: .word 4 # numero de filas de m1
n: .word 5 # numero de columnas de m1
size: .word 4 # tamano de cada elemento
m1: .word 1,2,3,4,5
.word 1,2,3,4,5
.word 1,2,3,4,5
.word 1,2,3,2,5
# la primera fila es la fila 0
# la primera columna es la columna 0
pregunta: .asciiz "\n¿Qué columna desea comprobar? Tenga en cuenta que las columnas se empiezan a contar desde 0: "
principio: .asciiz "\nLa columna "
ordenada: .asciiz " está ORDENADA"
creciente: .asciiz " de manera creciente."
decreciente: .asciiz " de manera decreciente."
igualada: .asciiz " de manera que todas las variables son iguales."
desordenada: .asciiz " está DESORDENADA"
.text
main:
lw $s6,m # numero de filas de m1
lw $s7,n # numero de columnas de m1
li $v0,4
la $a0,pregunta
syscall
li $v0,5
syscall
move $s0,$v0 #$s0 = columna objeto de estudio
li $t0,4
mult $s7,$t0
mflo $s4 #$s4 = número de bytes que debe saltar cada vez para recorrer una fila
li $s1,1 #$s1 = variable ordenada
li $s2,0 #$s2 = i (num. fila)
la $s3,m1 #$s3 = puntero a la matriz
move $s5,$zero #$s5 = direccion
li $t0,4
mult $s0,$t0
mflo $t0
add $s3, $s3, $t0 #posicionamos el vector en el primer elemento de la columna objeto de estudio
add $s8, $s4, $s3
dowhile:
bgt 0($s8),0($s3),elseif #THIS IS THE LINE QTSPIM COMPLAINS ABOUT
ifa: beq $s5,$zero,elseif
move $s1,$zero
j endif
elseif:
bge 0($s3),0($s8),else
ifb: beq $s5,1,endifb
ble $s2,$zero,endifb
move $s1,$zero
endifb: li $s5,1
j endif
else:
ifc: beq $s5,2,endifc
ble $s2,$zero,endifc
move $s1,$zero
endifc: li $s5,2
endif:
addi $s2, 1
add $s3,$s3,$s4
add $s8,$s8,$s4
bne $s1,$zero,endw
bgt $s2, $s6, dowhile
endw:
li $v0,4
la $a0,principio
syscall
li $v0,1
move $a0,$s0
syscall
ifd:
beq $s1,$zero,endifd
li $v0,4
la $a0,ordenada
syscall
cre: bne $s5,$zero,dec
la $a0,creciente
syscall
j exit
dec: li $t0,1
bne $s5,$t0,igu
la $a0,decreciente
syscall
j exit
igu: la $a0,igualada
syscall
j exit
endifd:
li $v0,4
la $a0,desordenada
syscall
exit:
li $v0,10
syscall
问题是,当我尝试在QtSpim上加载它时会出现以下错误:
spim: (parser) syntax error on line 83 of file
C:/Users/Tutoru/Desktop/Universidad/Principios de Computadores/practica4.s
bgt 0($s8),0($s3),elseif
有什么想法吗?
答案 0 :(得分:0)
bgt
需要两个寄存器操作数,但是你试图给它两个内存操作数。请改用这样的东西:
lw $t0, ($s8)
lw $t1, ($s3)
bgt $t0, $t1, elseif