2010-02-26 5 views
8

¿Alguna idea? ¿Por qué estoy recibiendo: Runtime excepción en 0x00400020: dirección de búsqueda no alineados en la línea límite de palabra 0x00000007 problema es: lw $ s1,0 ($ a1) #copy arg2 = tamaño de la matrizdirección de recuperación de MIPS no alineada en el límite de palabra, utilizada .align 4, todavía no ir

.data 
    .align 4 #added this, didnt work 
    size: .word 7 
    .align 4 #added this, didnt work 
    search: .word 30 
    .align 4 #added this,didnt work 
    array: .word 10,20,30,40,50,60,70 
    .align 4 

.text 

main: 

      la $a0,array #$a0 = address of array 
      lw $a1,size #a1 = size of array 
      lw $a2,search #$a2 = search key 


COUNT: 
      lw $s0,0($a0) #copy arg1 = address array 
      addi $s1,$zero,7 
      lw $s1,0($a1) #copy arg2 = size of array 
      lw $s2,0($a2) #copy arg3 = search key (n) 
      addi $s2,$zero,30 
      COUNTLOOP: 
      add $v0,$zero,$zero #v0 = res 
      add $t0,$zero,$zero #$t0 = init i to 0 
      slt $t1,$t0,$s1  #check if i > size of array 
      beq $t1,$zero,DONECOUNT #i is n so end 
      sll $t2,$s0,2  #$t2 = get off set for a[i] 
      lw $t3,0($t2)  #$t3 = get value of a[i] 
      bne $t3,$s2,CLOOPBTM #check if a[i] == seach key 
      addi $v0,$v0,1  #if above then increment res 
      CLOOPBTM: 
      addi $t0,$t0,1 
      j COUNTLOOP 
      DONECOUNT: 

Respuesta

7

El problema con el código es, que no se está utilizando la dirección donde se almacena el tamaño, pero el tamaño de la misma:

Aquí se carga la dirección en A0 y el tamaño (7) en A1:

 la $a0,array 
     lw $a1,size #a1 = size of array 

Aquí carga la primera palabra almacenada en su matriz (esa cargará un 10). Esto no es lo que pretendías.

 lw $s0,0($a0) #copy arg1 = address array 
     addi $s1,$zero,7 

Aquí carga la primera palabra almacenada en la ubicación 0x000007. (tu talla). Esta es, probablemente, también no deseado y que causará una excepción porque la dirección no está alineado:

 lw $s1,0($a1) #copy arg2 = size of array 

y así sucesivamente.

Me parece que tiene un malentendido acerca de lo que hace la instrucción LW. Lee una ubicación de memoria en un registro. Lo que quiere en el prólogo de su ciclo es hacer copias de un registro.

Para hacerlo, puede usar la instrucción pseudo movimiento si su ensamblador lo admite. De lo contrario usar la instrucción o para copiar los registros de la siguiente manera:

COUNT: 
      or $s0, $a0, $a0 #copy arg1 = address array 
      addi $s1, $zero,7 
      or $s1, $a1, $a1 #copy arg2 = size of array 
      or $s2, $a2, $a2 #copy arg3 = search key (n) 
      addi $s2, $zero,30 
      COUNTLOOP: 

      ... 

para un ejemplo completo de un bucle de búsqueda lineal probar esto (no probado y espera que el ensamblador se preocupa por las ranuras de retardo)

main: 

      la $a0,array   # $a0 = address of array 
      lw $a1,size    # $a1 = size of array 
      lw $a2,search   # $a2 = search key 


      beq $a1, $zero, NOTFOUND # handle the size==0 case.. 
      or $v0, $zero, $zero # init counter to zero 

LOOP: 
      lw $s0, 0($a0)   # load element 
      beq $s0, $a2, FOUND  # branch if key found: 

      addiu $a0, $a0, 4  # increment array pointer 
      addiu $v0, $v0, 1  # increment loop counter 
      bne $v0, $a1, LOOP  # repeat until we've processed the array. 

NOTFOUND: 
      # -------------------------------------- 
      # if you reach this, key does not exist: 
      # -------------------------------------- 
      li $v0, -1    # load a -1 to signal key not found. 
      jr $lr     # return to caller 

FOUND: 
      # ----------------------------------------- 
      # v0 now contains the position of the key. 
      # ----------------------------------------- 
      jr $lr 
+0

Hey, Realmente aprecio la ayuda. Esta no es una búsqueda bastante lineal, es solo un problema de un libro que agrega otro número, pero eso es irrelevante. Volví y noté algunos errores, pero todavía tenía problemas. Mis problemas han girado en torno a esto: $ a0 la, gama \t # si esta carga la dirección de la matriz en a0 y lw $ s0, ($ a0) #should esto no copiar la dirección almacenada allí para S0 me fijo esto en mi código haciendo la $ s0, ($ a0) La forma en que entendí LW es que obtiene el valor almacenado en esa dirección de memoria y lo coloca en el registro. Entonces, ¿es esto incorrecto? ¿Simplemente almacena la dirección? – bep

+0

la carga la dirección de un símbolo. En su caso, contendrá la ubicación del primer elemento de las matrices. lw carga la celda de memoria de la memoria y la almacena en el registro de destino. la $ s0, ($ a0) no tiene sentido. la siempre toma un símbolo de tu código, nunca un registro. –

Cuestiones relacionadas