2017-05-05 2 views
0

J'ai le code d'assemblage c suivant qui trie un tableau dans l'ordre décroissant, je l'ai testé en utilisant 8086emu et cela a fonctionné à 100% mais au studio visuel il m'a donné des résultats erronés et une erreur. Des idées ou comment résoudre ce problème.C erreur d'assemblage pour un tableau donné

Mon code: -

#include "stdafx.h" 
#include <iostream> 
using namespace std; 


void main(void) 
{ 
short *arr; 
arr = new short[10]; 
cout << "please enter the array elements" << endl; 
for (int i = 0; i < 10; i++) 
{ 
    cin >> arr[i]; 
} 

short *p; 
p = arr; 
_asm{ 

START: 
    mov cx, 9 
     mov esi, p 

    LABEL2 : 
    MOV ax, [esi] 
     CMP ax, [esi + 2] 
     JGE LABEL1 
     MOV bx, [esi + 2] 
     MOV word ptr[esi], bx 
     MOV word ptr[esi + 2], ax 
     JMP START 

    LABEL1 : 
    inc esi 
     inc esi 
     LOOP LABEL2 

} 

for (int i = 0; i < 10; i++) 
{ 
    cout << arr[i] << endl; 
} 

} 

The result

+1

la distance à travers l'ensemble est-il? Qu'avez-vous fait pour déboguer cela? –

+0

@PaulBentley Je n'ai pas débogué cela, il apparaît directement après avoir entré les éléments du tableau, mais le même code qui se trouve dans le bloc ASM fonctionne avec Masm et emu. –

+0

'loop' décrémente probablement et vérifie' ecx', pas seulement le mot inférieur ('cx'). Que faire si vous faites 'mov ecx, 9' au lieu de' mov cx, 9'? – Michael

Répondre

0

Le problème a été résolu par Michael dans a comment.

Le problème est que j'utilisais le LOOP instruction, qui décrémente implicitement et teste le registre ECX. Cependant, lorsque j'ai initialisé le registre en haut de la boucle, j'ai seulement initialisé son mot de poids faible (mov cx, 9), ce qui a laissé des déchets dans le mot supérieur.

La solution est d'initialiser le registre complet ECX: mov ecx, 9

+0

Par ailleurs, 'LOOP' est une instruction très lente et obsolète. Vous ne devriez vraiment pas l'utiliser du tout. C'est équivalent à 'dec ecx' +' jnz ??? ', et c'est ce que vous devriez utiliser à la place. Si vous l'aviez écrit de cette façon, non seulement votre code serait plus rapide et plus idiomatique, mais vous auriez aussi facilement détecté ce bug. (Mais plus généralement, vous ne devriez pas écrire du tout dans l'assemblage en ligne, c'est un code que le compilateur C peut générer et optimiser facilement.Le code de votre assembly est plus lent et plus sujet aux erreurs. * programmation de langage d'assemblage, n'utilisez pas un compilateur C.) –

+0

@CodyGray oh merci beaucoup, je vais le rappeler, mais pourquoi je ne devrais pas utiliser un compilateur C?! –

+0

Si vous souhaitez apprendre le langage d'assemblage, utilisez un assembleur, tel que MASM ou NASM, et écrivez * all * le code dans assembly. L'assemblage en ligne est une bête horrible et compliquée, et ce n'est * pas * un bon moyen d'apprendre l'assemblage. –