2011-03-06 2 views
1

J'ai besoin de trier un tableau et de trier chaque rangée dans le tableau pour être dans l'ordre croissant. Je ne semble pas aller si bien (surprise!) Que je continue à me frapper avec deux erreurs:Utilisation de valeurs relatives dans le tri de matrices (asm)

a2101: ne peut pas ajouter deux étiquettes délocalisables et A2026: attendu

constante Voici mon genre, il fait Je pense que je suis toujours en train d'essayer de mettre en œuvre des technologies linguistiques de haut niveau dans l'assemblage. Y at-il un moyen de contourner ne pas être en mesure d'utiliser des valeurs relatives? (le tableau est de 7 lignes par 9 colonnes, btw).

mov cx, 7; cx = number of rows 

outer: ; outer loop walk through the rows 

    push cx 
    mov cx, 9 
    mov row, cx ;rows 

    middle: ; middle-loop walk through the columns 

     push cx 
     sub cx, 1 ;cx = cx-1 
     mov column, cx ;columns 
      inner: ;inner loop - compare and exchange column values 

        cmp mArray[row*9 + column], mArray[row*9 + column+1] 
        xchg mArray[row*9 + column+1], mArray[row*9 + column] 
        ; compare and exchange values from mArray table 
        inc column 
      loop inner 

     pop cx 
    loop middle ;end middle loop 

    pop cx 
loop outer ; end outer loop 

ret 

Merci pour toute aide.

Répondre

2

Les lignes suivantes sont problématiques:

cmp mArray[row*9 + column], mArray[row*9 + column+1] 
xchg mArray[row*9 + column+1], mArray[row*9 + column] 

Contrairement HLL, l'assemblage ne permet pas d'expressions arbitraires en place des constantes ou des variables. C'est pourquoi les HLL ont été inventés en premier lieu. Calculez le décalage dans les registres avant d'utiliser:

mov ax, row 
mov bx, ax 
shr bx, 3 ; bx = row*8 now 
add bx, ax ; bx = row*9 now 
add bx, column ; bx = row*8+column now 
mov dx, [bx] ;first comparand 
inc bx 
cmd dx, [bx] ; that's your compare! 

De même, vous n'utilisez aucune branche; l'instruction cmp est totalement inutile; vous perdez son résultat, et xcng n'est pas exécuté conditionnellement. Lisez les commandes de saut conditionnelles (jz/jnz etc.).

Aussi, j'espère sérieusement que c'est un exercice, pas un vrai projet. Si c'est pour de vrai, veuillez reconsidérer en utilisant l'assemblage. Pour quelque chose d'aussi trivial, l'assemblage est un mauvais choix. Espec. vu à quel point vous êtes mauvais.

Questions connexes