2010-02-26 15 views
8

des idées? Pourquoi je reçois: exception d'exécution à 0x00400020: chercher l'adresse ne sont pas alignés sur une frontière de mot 0x00000007 ligne de problème est: pv $ s1,0 ($ a1) #copy arg2 = taille du tableauL'adresse de recherche MIPS n'est pas alignée sur la limite de mot, utilisée .align 4, toujours non

.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: 

Répondre

7

Le problème avec le code est que vous n'êtes pas à l'adresse où la taille est stockée, mais la taille lui-même:

ici vous chargez l'adresse dans A0 et la taille (7) dans A1:

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

ici vous chargez le premier mot stocké sur votre tableau (que chargera un 10). Ce n'est pas ce que vous avez prévu.

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

Ici, vous chargez le premier mot stocké à l'emplacement 0x000007. (ta taille). Ce est probablement pas pour objet et provoquera une exception, car l'adresse n'est pas aligné:

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

et ainsi de suite.

Il me semble que vous avez un malentendu ce que l'instruction LW fait. Il lit un emplacement de mémoire dans un registre. Ce que vous voulez dans le prologue de votre boucle est de faire des copies d'un registre.

Pour ce faire, vous pouvez utiliser l'instruction pseudo move si votre assembleur supporte. Sinon, utilisez l'instruction OR pour copier des registres comme celui-ci:

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: 

      ... 

pour un exemple complet d'une boucle de recherche linéaire essayer (non testé et attend à ce que le prend soin assembleur sur les fentes de retard)

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, J'apprécie vraiment l'aide. Ce n'est pas tout à fait une recherche linéaire, c'est juste un problème d'un livre qui ajoute un autre numéro, mais ce n'est pas pertinent. Je suis retourné et j'ai remarqué quelques erreurs, mais j'avais toujours des problèmes. Mes problèmes ont tourné autour de ceci: la a0 $, un tableau \t #if cette charge l'adresse du tableau dans a0 et pv s0 $, (a0 $) #should cela ne copie l'adresse enregistrée à s0 je fixe cela dans mon code en faisant la $ s0, ($ a0) La façon dont j'ai compris LW est qu'il obtient la valeur stockée à cette adresse de mémoire et le met dans le registre. Alors est-ce incorrect? Il stocke juste l'adresse? – bep

+0

la charge l'adresse d'un symbole. Dans votre cas, il contiendra l'emplacement du premier élément des tableaux. lw charge la cellule mémoire de la mémoire et la stocke dans le registre de destination. la $ s0, ($ a0) n'a aucun sens. la prend toujours un symbole de votre code, jamais un registre. –