Entwickler-Ecke

Sonstiges (Delphi) - Parser um Funktion erweitern


j0hnny - Do 24.06.10 13:40
Titel: Parser um Funktion erweitern
Moin!

Ich würde gerne den tyParser (http://www.delphi-forum.de/viewtopic.php?t=36946) um eine eigene Funktion erweitern. Die Stellen, an denen die Funktionen definiert werden (abs, sin usw.) habe ich gefunden. Allerdings weiß ich nicht, was ich unter "machine code fragments" eintragen muss. Z.b. beim sin


Delphi-Quelltext
1:
... ExprFuncs = (_sin, ...) ...                    


Delphi-Quelltext
1:
2:
... if S = 'sin' then
        Result := _sin else ...


Delphi-Quelltext
1:
..._sin      : _SP^ := sin(_SP^);...                    


Delphi-Quelltext
1:
2:
...       _sin     : begin
                   Move(fsin, P^, SizeOf(fsin)); Inc(P, SizeOf(fsin));...

Aber woher kriege ich jetzt diesen Wert:

Delphi-Quelltext
1:
 fsin: array[0..1of Byte = ($d9,$fe);                    


Vielen Dank für euere Hilfe!

Moderiert von user profile iconNarses: URL-Tags ergänzt.


delfiphan - Do 24.06.10 18:47

Ich habe die entsprechenden Funktionen zuerst in Delphi implementiert, Break-Point gesetzt und dann im Debugger ausgelesen.


j0hnny - Do 24.06.10 19:07

Danke für deine Antwort!

An welcher Stelle müsste ich denn den Breakpoint setzen? Für den sin bei

Delphi-Quelltext
1:
_sin      : _SP^ := sin(_SP^);                    

?

Und in welchem Fenster kann ich dann die Bytes auslesen?

Sorry, bin recht neu bei Delphi. Danke schonmal!


j0hnny - Do 24.06.10 20:18

Oh! Ok ich habe gesehen, dass obiger Codeausschnitt nur für ein parsen ohne Compilierung gedacht ist.

Aber wie und wo ich jetzt diesen Bytearray her bekomme, habe ich noch nicht herausfinden können.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Also im CPU Fenster habe ich jetzt den Aufruf der sin-Funktion nachvollziehen können. Allerdings komme ich schon bei der heavidide-Funktion mit der if-Abfrage schon nicht mehr weiter. Das einzige, was ich finden kann ist "$9b,$df,$e0,$9e". Z.b. das "$d9,$ee,$d8,$d9" kann ich schon nicht mehr finden.


delfiphan - Fr 25.06.10 18:48

Bei Heaviside ist es nicht 1:1 umgesetzt wie beim Delphi-compiler, daher stimmt der Code nicht ganz überein.

Alternativ kannst du es wie ähnlich wie XPower machen. Dort wird die Funktion nicht in die Funktion reincodiert sondern eine externe Funktion aufgerufen.