De la difficulté à inverser une chaîne de caractères en assemblée

Je suis en train d'inverser une chaîne de caractères dans l'assemblée.
Cependant, mon code ne semble pas fonctionner correctement.
J'ai ajouté une nouvelle ligne de chaîne pour une meilleure lisibilité.

Je suis à l'utilisation de linux et de msna comme compilateur.

J'ai pensé que si j'ai pris les valeurs de la adresspointers et mis à la bonne place, la chaîne a finalement inversé, puis revenir à la normale.

C'est mon code:

section .data
    hello     db 'Hello world!'
    helloLen  equ $-hello
    derp db '=========',10
    derplen equ $-derp

section .text
    global main

main:
    mov eax,0
    mov ecx,helloLen

    reverse:
        ;move pointer
        mov ebx,hello
        add ebx,eax
        push eax

        ;move pointer
        mov eax,hello
        add eax,ecx
        push ecx

        ;switch bytes
        push ebx
        mov ebx,[ebx]
        mov [eax],ebx
        pop ebx
        mov eax,[eax]
        mov [ebx],eax

        ;print text
        mov eax,4
        mov ebx,1
        mov ecx,hello
        mov edx,helloLen
        int 80h

        ;Print newline
        mov eax,4
        mov ebx,1
        mov ecx,derp
        mov edx,derplen
        int 80h

        ;increment and decrement
        pop ecx
        dec ecx
        pop eax
        inc eax

        cmp eax,helloLen
    jne reverse

    end:
        mov eax,1
        mov ebx,0
        int 80h

C'est le résultat que j'obtiens:

Hello world!Hell=====
Hello worldellol=====
Hello worlllo ol=====
Hello worlo w ol=====
Hello woo wow ol=====
Hello wooooow ol=====
Hello wooooow ol=====
Helloooooooow ol=====
Helloooooooow ol=====
Helooowooooow ol=====
Heoow wooooow ol=====
How o wooooow ol=====
  • Il y a quelques choses que je remarque tout de suite la chauve-souris: 1) Lorsque vous échangez les caractères, vous devriez être en échange octets, pas dword. 2) ecx devrait commencer à helloLen-1. 3) La résiliation de la condition de l'algorithme est faux; vous finirez par permutation de chaque personnage deux fois. (Arrêter quand eax >= ecx)
InformationsquelleAutor Horse SMith | 2012-11-27