Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#12

Re: ReverseString für ältere Delphi-Versionen

  Alt 12. Dez 2009, 19:25
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat