MIPS" spim :(解析器)语法错误"

时间:2015-04-30 01:30:03

标签: mips qtspim

我在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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

bgt需要两个寄存器操作数,但是你试图给它两个内存操作数。请改用这样的东西:

lw $t0, ($s8)
lw $t1, ($s3)
bgt $t0, $t1, elseif