Entwickler-Ecke

Algorithmen, Optimierung und Assembler - String rückwärts einlesen - Asm to delphi


MagicRain - Fr 29.05.09 12:54
Titel: String rückwärts einlesen - Asm to delphi
Moin Leute ich habe hier folgendes Problem ich möchte ein String rückwärts einlesen bloß wie ich das mache soll weiß ich nicht! Hoffe jemand von euch kann mir irgendwie helfen :P

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Const Tabelle = '@!SDVXFGUHbvnc908 *&)5 fjd095j90kcf ja%JKeSFAKDJSLJgJDF 2k34lsdjfkldjf jdsklfjadskgl;jafdkl;gjasdkl;r568r;jvggfl;kd4ui12098  vlkjfdlk;sfjgklfdgjlejt03456erjgrj';

//41C654 == Tabelle
//Tabelle - length = F9

0040F989  |.  8D99 53C64100 LEA EBX,DWORD PTR DS:[ECX+41C653]        ;  // get Tabelle in EBX
0040F98F  |>  0FBE86 54C641>/MOVSX EAX,BYTE PTR DS:[ESI+41C654]      ;  // Ord(Tabelle[i]) ? start from first char
0040F996  |.  0FBE13        |MOVSX EDX,BYTE PTR DS:[EBX]             ;  // Ord(Tabelle[i]) ? start from last char

//MOVSX EAX,BYTE PTR DS:[ESI+41C654]

eEAX := Ord(Tabelle[i]);

//MOVSX EAX,BYTE PTR DS:[ESI+41C654]

eEDX := Ord(Tabelle[i] - F9) oder vlt eEDX := Ord(Tabelle[i]) - F9;


Aber wie mach ich das vom letzen Zeichen bis zum ersten ein zu lesen?

MfG


Delete - Fr 29.05.09 13:21

Ich weiß zwar nicht, was genau Du mit Einlesen meinst, aber evtl. suchst Du ReverseString aus StrUtils.


MagicRain - Fr 29.05.09 13:27

Nein. Zeichen weise in hex einlesen....... Tabellen char A = 41h.... halt Ord(Tabelle[i]); hmm

MFG


MagicRain - Sa 30.05.09 03:50

heftig keiner ne idee ?

:/


jaenicke - Sa 30.05.09 04:54

Naja, mir ist nicht klar was du eigentlich meinst und wo das Problem ist. :nixweiss:


alzaimar - Sa 30.05.09 06:11


Delphi-Quelltext
1:
2:
For i := Length (Tabelle) downto 1 do 
  Foobar(Tabelle[i]);

Foobar wird zuerst mit dem letzten Zeichen, dann mit dem vorletzten usw. aufgerufen. Rückwärts.


ffgorcky - Sa 30.05.09 09:04

Die Möglichkeit von user profile iconalzaimar wollte ich auch gerade so ähnlich aufschreiben.
Aber - da ich damit noch nicht so wirklich Erfahrungen habe - würde ich das dann doch eher so schreiben,
indem ich direkt auf die Indexe zugreife:

Delphi-Quelltext
1:
2:
for i:=length(umzudrehenderString)-1 downto 0 do
     umgedrehterString:=umzudrehenderString[i];


Oder man kann es meiner Ansicht nach auch so schreiben:

Delphi-Quelltext
1:
2:
for i:=0 to length(umzudrehenderString)-1 do
     umgedrehterString:=umzudrehenderString[length(umzudrehenderString)-1-i];

Ich weiß jetzt leider nicht, was sauberer ist.
Ich denke aber mal, dass meine erste Lösung sauberer ist.

Oder haben wir jetzt alle Deine Frage falsch verstanden?
- Dann formuliere sie doch bitte noch einmal genauer.


jaenicke - Sa 30.05.09 16:32

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
for i:=length(umzudrehenderString)-1 downto 0 do
     umgedrehterString:=umzudrehenderString[i];
Erstens hat der erste Buchstabe den Index 1 wie bei user profile iconalzaimar, zweitens legst du so in umgedrehterString jeweils nur einen einzelnen Buchstaben der Reihe nach und überschreibst jeweils den vorherigen damit...

Wenn es um das simple Umdrehen ginge, dann gibt es wie bereits gesagt wurde eine simple Funktion dafür (ReverseString). Aber darum geht es ja nicht.
user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
Nein.
Falls das Problem nur das rückwärts zeichenweise Durchgehen ist, hat es user profile iconalzaimar ja geschrieben.


MagicRain - Sa 30.05.09 17:26

Zitat:
Falls das Problem nur das rückwärts zeichenweise Durchgehen ist, hat es user profile iconalzaimar ja geschrieben.
Das war es danke euch dann doch nocht :P


ffgorcky - Sa 30.05.09 19:32

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
zweitens legst du so in umgedrehterString jeweils nur einen einzelnen Buchstaben der Reihe nach und überschreibst jeweils den vorherigen damit...


Ups, ich meinte das doch eigentlich so:

Delphi-Quelltext
1:
2:
for i:=length(umzudrehenderString)-1 downto 0 do     
     umgedrehterString:=umgedrehterString+umzudrehenderString[i];

Da habe ich irgendwie wohl mal wieder so einen Das-ist-ja-viel-zu-einfach-Fehler gemacht...