Probleme umkehren einer Zeichenfolge in der Montage
Ich versuche das umkehren einer Zeichenfolge in der Montage.
Aber mein code scheint nicht korrekt zu funktionieren.
Ich habe eine newline-Schnur für bessere Lesbarkeit.
Ich bin mit linux und nasm als compiler.
Dachte ich, dass wenn ich nahm die Werte der adresspointers und schaltete Sie an der richtigen Stelle, der string würde schließlich Umgekehrt werden, und dann wieder normal.
Dies ist mein 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
Dies ist die Ausgabe die ich bekomme:
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=====
- Es gibt ein paar Dinge, die ich beachten rechts von der Fledermaus: 1) Wenn Sie die swap-Charaktere, sollten Sie das austauschen von bytes, nicht dwords. 2) ecx sollte helloLen-1. 3) Die Abbruchbedingung für den Algorithmus ist falsch; Sie werden am Ende tauschen jedes Zeichen zweimal. (Aufhören, wenn eax >= ecx)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Weg umkehren einer Zeichenfolge durch den Austausch von Zeichen ist, tauschen die erste und die Letzte, dann die zweite und vorletzte, usw.. In C, würden Sie schreiben:
In Assembler, ist der einfachste Weg zum einrichten der ESI und EDI Register-zu-Punkt am Anfang und Ende des Strings, dann Schleife. Bei jeder iteration, Sie erhöhen ESI-und Dekrement-EDI. Das Ergebnis sieht wie folgt aus:
Als ich diese für ein interview, ich kam mit dieser... Es ist ein bisschen Microsoft-spezifische, aber es ist ungefähr das gleiche wie das, was @Jim schrieb Mischel mit ein, außer dieser berechnet die Länge der Zeichenfolge, anstatt übergeben es etc.
Diese Funktion ist nackt, so da es keinen prolog oder epilog, die Sie tun müssen vorsichtig sein, über welche Register Sie verwenden können. (Es sei denn, Sie push und pop, wenn Sie Sie verwenden. In diesem Beispiel bin ich nicht mit jedem Register, die bewahrt werden müssen)