2010-01-20 15 views
0

J'ai rencontré des problèmes avec le code assembleur. Je suis un débutant à l'assembleur, donc il me semble difficile de le résoudre moi-même.Tâche de l'assembleur - valeurs min et max du tableau

La tâche est: "Pour trouver les éléments minimal et maximal du tableau."

Tout ce que j'ai déjà fait est la recherche d'un élément maximal. Je ne peux pas savoir, comment faire vérifier l'élément minimal et où je devrais mettre une telle vérification. Ou, probablement, je devrais passer à travers les éléments une deuxième fois après avoir trouvé l'élément maximal?

code:

#include <conio.h> 
#include <stdio.h> 
#include <iostream.h> 
void main() { 
    int N = 10, i; 
    clrscr(); 
    int a[] = { 1, 4, -6, 12, -25, 10, 3, -4, 15, 7}, MAX, MIN, RESULT; 

    __asm{ 
    mov cx, N 
    lea si, a 
    lodsw 
    mov bx, ax 
    mov dx, ax 
    dec cx } 
    m: 
     __asm{ 
    lodsw 
    cmp dx, ax 
    jge m1 
    mov dx, ax 
     } 
    m1: 
     __asm{ 
     loop m 
     mov MAX, dx 
    } 

cout << "Max = " << MAX; 
//cout << "Min = " << MIN; 
getch(); 
} 
+0

Il est préférable de calculer le min dans la même boucle que vous calculez le maximum, c'est-à-dire, pour chaque élément, au moment où vous l'avez dans un registre, testez-le pendant min. Au label 'm1' semble le bon endroit. –

+0

Merci de votre aide. J'ai compris l'algorithme, comment implémenter une telle vérification, mais malheureusement je ne suis pas capable d'écrire du code pour rendre ce code utilisable. – Alex

Répondre

0

S'il est intéressant de quelqu'un, voici la solution pour ma question (j'ai découvert aujourd'hui avec l'aide de mon tuteur):

#include <conio.h> 
#include <stdio.h> 
#include <iostream.h> 
void main() { 
    int N = 10, i; 
    clrscr(); 
    int a[] = { 1, 4, -6, 12, -25, 10, 3, -4, 15, 7}, MAX, MIN, RESULT; 

    __asm{ 
     mov cx, N 
     lea si, a 
     lodsw 
     mov MIN, ax 
     mov MAX, ax 
     dec cx 
    } 
    m: 
    __asm{ 
     lodsw 
     cmp MIN, ax 
     jle m1 
     mov MIN, ax 
     jmp m2 
    } 
    m1: 
    __asm{ 
     cmp MAX, ax 
     jge m2 
     mov MAX, ax 
    } 
    m2: 
    __asm{ 
     loop m; 
    } 

cout << "Max = " << MAX << "\n"; 
cout << "Min = " << MIN; 
getch(); 
} 

algorithme: si cmp MIN, ax a un résultat négatif, cela signifie ax est supérieur à MIN. Donc, le script passe à m1 étiquette pour comparer ax valeur avec MAX. Lorsque cmp MIN, ax renvoie une valeur positive, les scripts attribuent la valeur ax à la variable MIN et, par la suite, sautent sur l'étiquette m2 pour décrémenter le compteur de boucle. L'algorithme de recherche de la valeur maximale fonctionne de manière similaire (étiquette m1).

3

Qu'est-ce qui se passe si vous remplacez "JGE" avec "jle"? Essayez-le et voyez.

+0

Le résultat sera égal à '-25' - la valeur minimale du tableau. – Alex

+0

Très bien. Maintenant vous avez deux boucles, une pour calculer le min, et une pour calculer le maximum. Que devriez-vous faire pour les combiner en une seule boucle? Astuce: La boucle que vous avez est déjà en train d'initialiser deux registres (bx et dx) mais actuellement seulement en utilisant l'un d'entre eux. –