Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

Opcodes berechnen - wie?

  Alt 24. Jul 2004, 00:12
So Leute, jetzt gehts los .
Mich würde mal interessieren, wie aus asm-Mnemonics letzendlich die Opcodes werden, bzw. wie ich diese berechnen könnte.

Zum Beispiel ist $D9FE der Opcode der der FPU sagt: "Gib mal für dein aktuelles Stackelement den Sinus raus." Okay, soweit geht's noch - dass kann man der IA-32 Spezifikation leicht entnehmen. Interessanter wird's bei Anweisungen, die eine Adresse mit sich tragen, z.B.:
$8BEC - heisst: mov ebp, esp
oder:
$DD4508 - heisst: fld qword ptr [ebp+$08] ($DD=fld, aber wie komme ich an den Rest?)
oder:
$5D - heisst: pop ebp (Wie? ein Wort für Befehl+Adresse??)

Neolithos wird wissen worauf ich hinaus will . Es geht letzten Endes um einen mathem. Parser der die Formeln nicht in Datenstrukturen wie Bäume oder irgendwie geartete Stacks packt, sondern ganz direkt ausführbaren Code ins RAM schreibt, und den Programcounter dahin schmeisst. (Was an sich auch schon klappt, ein sin(1) hab ich so schon hinbekommen .)
Dann wäre die geparste Rechnung u.U. genau so schnell wie einkompiliert, da ja tatsächlich kompiliert!

(Exceptionhandling und Kontrollstrukturen bleiben zunächst mal aussen vor. Mal sehen wie viel man davon wirklich braucht .)

Nun sollen da aber natürlich nicht nur Konstanten in der Formel Möglich sein, sondern auch Variablen. Dass heisst dass der von mir erzeugte Maschinencode auf Delphi-Variablen referenzieren können müsste, und dafür brauche ich ja a) ihre Adressen, und b) das Wissen wie diese Informationen im Maschinencode zu hinterlegen wären.

Ich hatte mal ganz einfach eine Funktion mit Delphi geschrieben, und die compilierte Funktion aus dem CPU-Fenster direkt so in den Speicher geschrieben, und den Programcounter dahin gepackt. Leider hat das nur für sehr einfache Funktionen geklappt, wie halt sin(1). Sobald übergebene Parameter referenziert werden sollten, hat's geknallt. (AVs)


Wenn dazu irgend jemand auch nur den kleinsten Tipp hätte... sei's Literatur, Web-Adressen was auch immer (bevorzugt in Deutsch, Englisch geht aber auch), oder gar direkt helfen könnte, da wär ich einen ultra-großen Schritt weiter!

Danke schonmal,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat