2017-06-20 3 views
1

J'essaie de copier un tableau dans un autre tableau, mais l'ordre des éléments doit être inversé et affiché. Mon fichier programme se compile mais ne s'exécute pas et provoque une erreur d'arrêt Windows à chaque fois (boîte de dialogue Windows).
Je ne suis pas sûr de ce que je fais mal. S'il vous plaît donnez votre avis.Copie d'un tableau dans un autre tableau comme inversé et affichage dans l'assemblage

INCLUDE Irvine32.inc 

.data 
sarray DWORD 500h, 400h, 300h, 200h, 100h 
darray DWORD 5 DUP(?) 

.code 
main PROC 

    mov eax, 0 
    mov esi, OFFSET sarray ;move first element address to esi 
    mov edi, OFFSET darray + SIZEOF darray - TYPE darray ;move last element address to edi 
    mov ecx, LENGTHOF sarray ;sets the counter in the reverseLoop 

    reverseLoop: 
    mov eax,sarray[esi]  ;move 1st sarray element to eax 
    mov darray[edi],eax  ;move 1st sarray element as last element on darray 
    call WriteInt 
    call Crlf 
    add esi, TYPE sarray 
    sub edi, TYPE darray 
    call WriteInt 
    loop reverseLoop 

    exit 
main ENDP 

END main 

Modifier: Mon problème était que esi et edi avait l'adresse déjà ajouté (OFFSET sarray), mais dans la boucle I a ajouté le nouveau départ (mov eax, sarray[esi]).

Après le correctif, je devais ajouter une autre boucle pour imprimer la deuxième Darray (nouveau)

+0

Avez-vous une condition pour quitter votre boucle? –

+0

L'instruction 'loop' sur x86 décrémente' ecx' comme un compteur et se termine si elle va à zéro. Donc, ce n'est pas infini. – Jester

+1

"Mon fichier programme s'arrête de fonctionner après la compilation." n'est pas une bonne description d'erreur, s'il vous plaît spécifier exactement ce qui se passe. En outre, utilisez un débogueur. – Jester

Répondre

0

Mon problème était que esi et edi avec l'adresse déjà ajouté OFFSET sarray, mais dans la boucle I a ajouté le recommencez (mov eax, sarray[esi]). Après avoir corrigé cela, j'ai également dû ajouter une autre boucle pour imprimer le deuxième tableau (le tableau inversé).

Voici le code de travail:

INCLUDE Irvine32.inc 

.data 
sarray DWORD 500h, 400h, 300h, 200h, 100h 
darray DWORD 5 DUP(?) 

.code 
main PROC 

    mov esi, OFFSET sarray        ;move first element address to esi 
    mov edi, OFFSET darray + SIZEOF darray - TYPE darray ;move last element address to edi 
    mov ecx, LENGTHOF sarray        ;sets the counter in the reverseLoop 

reverseLoop: 
    mov eax,[esi]  ;move 1st sarray element to eax 
    mov [edi],eax  ;move 1st sarray element as last element to the darray 
    add esi, TYPE sarray 
    sub edi, TYPE darray 
    loop reverseLoop 
    call clrscr 

    mov esi, OFFSET darray 
    mov ecx, LENGTHOF darray 
    mov ebx, 0 

printerLoop: 
    mov eax,[esi] 
    call WriteHex   
    call Crlf 
    add esi, TYPE darray 
    loop printerLoop 

    call Crlf 

    exit 
main ENDP 

END main 
+0

Pour en faire une meilleure réponse (que je voudrais upvote), s'il vous plaît [modifier] pour inclure (en haut) une brève description de ce qui n'allait pas avec votre code original et comment vous l'avez changé. Jester vous l'a dit dans les commentaires, donc c'est génial que vous ayez pu prendre les indications et les transformer en vrai code, mais idéalement, nous aimerions que cette information soit dans la réponse elle-même. –

+0

Edited.Merci pour le conseil – mwater07