Und nochmal @himitsu:
Die Systemroutinen kannst du mit z.B.
CALL System.@LStrSetLength
aufrufen.
Zu deiner Assembler Routine:
Hast du die mal getestet ?
Bei Längen im Bereich 1 bis 3 gibts Probleme.
Warum?:
ECX enthält Length(Text).
Wenn ECX<4 ist dann wird ECX durch SHR ECX,2 auf 0 gestellt.
Das Loop senkt dann ECX um 1 und springt zu @@Loop4, bis ECX=0 ist.
Die Schleife wird also 2^32 mal durchlaufen, bzw. bis es 'ne
Exception gibt.
Delphi-Quellcode:
SHR ECX, 2
XOR EAX, EAX
@@Loop4:
MOV EDX, [ESI + EAX * 4]
BSWAP EDX
MOV [EDI + ECX * 4], EDX
INC EAX
LOOP @@Loop4
Bei Längen > 3 funktioniert die Routine zwar, aber dafür funktioniert danach irgend etwas anderes nicht mehr.
Warum ?: Weil du EDI und ESI veränderst.
Ich hab die Idee mit dem bswap aufgegriffen.
Delphi-Quellcode:
FUNCTION ReverseStr_A(s:
string):
string;
asm
test eax,eax
jne @Start
mov eax,edx
jmp system.@LStrClr
@Start: push edi
mov edi,edx
push eax
mov edx,[eax-4]
mov eax,edi
call System.@LStrSetLength
pop edx
// @s[1]
mov ecx,[edx-4]
// Length(s)
mov edi,[edi]
// @result[1]
jmp @NextDW
@DWLoop: mov eax,[edx+ecx]
bswap eax
stosd
@NextDW: sub ecx,4
jnc @DWLoop
add ecx,3
js @
End
@BLoop: mov al,[edx+ecx]
stosb
sub ecx,1
jnc @BLoop
@
End: pop edi
end;