2017-01-03 1 views
1

J'ai écrit un code pour calculer la valeur minimale dans le tableau donné et l'idée est de prendre le premier élément (en considérant que c'est la valeur min) et de le comparer avec les éléments restants puis échanger les valeurs en cas que je trouve plus petite et voici mon code:trouver la valeur min dans un tableau donné dans l'assembly 8086

array dw 7,4,12,5,1 

mov si,00h 
mov ax,array[si] 


mov cx,5 

minimum: 

inc si ;find the minimum value 
mov dx,array[si] 
cmp ax,dx 
jb nochange 

swap: 
xchg ax,dx 

nochange: 
dec cx 
cmp cx,0 
JNE minimum 

lastcmp: ; to compare the last item with the minimum value and swap if it's smaller 
mov dx,array[si] 
cmp ax,dx 
jb endi 
xchg ax,dx 


end 

, mais il semble que j'ai un problème ici car il compare tous les éléments, mais pas le dernier il me donne toujours (4) et c'est pour me donner (1), de l'aide!

+3

Damn ... ** jamais ** utiliser 'array [si]' jamais! Tu ne sais pas ce que tu fais. Votre tableau est un tableau de mots et non d'octets! Il n'y a pas d'accès au tableau indexé dans l'assembly! –

+0

vous voulez dire la dernière étape "lastcmp"! , mais je l'ai déplacé au registre dx pour pouvoir comparer!? –

+1

Non, je veux dire ceci 'inc si' –

Répondre

1
mov cx,5 

Le tableau que vous procès- a seulement 5 éléments au total. Vous avez supprimé le premier élément dans une étape distincte, votre code ne peut donc être comparé qu'avec les 4 éléments restants!


inc si 

Depuis le tableau contient des mots, vous devez augmenter le registre SI de 2 pour passer à l'élément suivant du tableau. Rappelez-vous que dans une instruction comme mov dx,array[si] la partie [si] est en fait un décalage dans le tableau (un déplacement exprimé en nombre d'octets). Ce n'est pas un index comme dans les langages de haut niveau habituels.


dec cx 
cmp cx,0 
JNE minimum 

L'instruction cmp cx,0 ici est tout à fait inutile puisque l'instruction dec cx définit déjà le drapeau zéro au besoin par le saut conditionnel qui suit. Raccourcir le code:

dec cx 
jnz minimum 

lastcmp: ; to compare the last item with the minimum value and swap if it's smaller 
mov dx,array[si] 
cmp ax,dx 
jb endi 
xchg ax,dx 

Pourquoi vous pensez-vous que besoin de cette dernière section? Le résultat est déjà dans le registre AX. De plus puisque vous n'avez pas modifié le registre SI, cette comparaison supplémentaire duplique juste la dernière que vous avez faite dans la boucle!