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)
Vous devez vous connecter pour publier un commentaire.
Le moyen d'inverser une chaîne de caractères par le remplacement des caractères est de permuter le premier et le dernier, puis le deuxième et avant-dernier, etc. En C, on peut écrire:
En langage d'assemblage, le plus simple est de configurer l'ESI et EDI registres de point au début et à la fin de la chaîne, puis la boucle. À chaque itération, vous incrément de l'ESI et de décrémentation de l'EDI. Le résultat ressemble à quelque chose comme ceci:
Quand j'ai fait cela pour un entretien, je suis venu avec cette... C'est un peu Microsoft, mais c'est à peu près la même chose que @Jim Mischel a écrit, à l'exception de ce calcule la longueur de la chaîne plutôt que d'être envoyés, etc.
Cette fonction est nu, donc depuis il n'y a pas de prologue ou epilogue vous ne devez être prudent sur ce que les registres que vous pouvez utiliser. (Sauf si vous push et pop, si vous les utilisez. Dans cet exemple, je ne suis pas en utilisant tous les registres qui doivent être préservés)