AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Opcodes berechnen - wie?

Ein Thema von dizzy · begonnen am 24. Jul 2004 · letzter Beitrag vom 24. Jul 2004
Antwort Antwort
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
w3seek
(Gast)

n/a Beiträge
 
#2

Re: Opcodes berechnen - wie?

  Alt 24. Jul 2004, 00:46
Zitat von dizzy:
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.
Die sind nach einzelnen bitmasken aufgeteilt (z.b. ersten x bits sind der opcode, danach welche register oder adresse; so in der art), ist im grunde ganz einfach. Allerdings weiss ich jetzt nicht mehr wo ich meine referenz hab, einfach mal danach googlen sollte eigentlich helfen.

Zitat von dizzy:
... 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 .)
Das koennte mit dem SP2 in Windows XP probleme geben...

Zitat von dizzy:
(Exceptionhandling und Kontrollstrukturen bleiben zunächst mal aussen vor. Mal sehen wie viel man davon wirklich braucht .)
SEH sollte recht einfach sein...sind nur ein paar wenige asm-anweisungen, oder do packst den ganzen aufruf des generierten codes einfach in SEH
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Opcodes berechnen - wie?

  Alt 24. Jul 2004, 00:53
Zitat von dizzy:
dass kann man der IA-32 Spezifikation leicht entnehmen.
Da stehen auch Opcode-Tabellen drin. Und auch eine Beschreibung, wie die Register und Größen der Operanden codiert werden...

Bei Radim Picha auf der Seite gibt es C-Quellcode zur Bestimmung der Länge von x86-Anweisungen (X86IL.zip) - das sollte Dir etwas Arbeit ersparen.

Zitat von w3seek:
Das koennte mit dem SP2 in Windows XP probleme geben...
Solange die Seite 'ausführbar' ist und nicht versucht wird den Code im Stack auszuführen, macht es auch mit NX keine Probleme.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Opcodes berechnen - wie?

  Alt 24. Jul 2004, 02:16
Zitat von NicoDE:
Zitat von dizzy:
dass kann man der IA-32 Spezifikation leicht entnehmen.
Da stehen auch Opcode-Tabellen drin. Und auch eine Beschreibung, wie die Register und Größen der Operanden codiert werden...
Ich hab's leider wohl noch nicht gefunden... Mein Hauptproblem sind eher die "Platzhalter" die in der Liste der Opcodes teilweise auftauchen. Für die hatte ich keine Referenz gefunden. Dann werd ich mir die pdfs nochmal intensiver zu Gemüte führen!

Zitat von NicoDE:
Bei Radim Picha auf der Seite gibt es C-Quellcode zur Bestimmung der Länge von x86-Anweisungen [...] das sollte Dir etwas Arbeit ersparen.
Wer ich morgen gleich mal dran gehen. Unter Rücksichtnahme auf die Tatsache, dass ich faktisch kein C kann, wird sich zeigen wie viel Arbeit das spart . Aber okay, lern ich neben asm/Maschinencode auch gleich noch etwas C. Kann ja nicht falsch sein

Zitat von w3seek:
Das koennte mit dem SP2 in Windows XP probleme geben...
...da würde ich aber fuchsig werden... aber gut dass Nico schon entschärft hat *g*.

\\edit: Wäre klasse, wenn du mir sagen könntest wo ich so eine Referenz von der du sprachst finden kann. Ich hab mich schon bald kugelig gegoogelt, und finde irgendwie nicht so wirklich brauchbares .


Vieeelen Dank euch beiden schon mal! Werd mich morgen mal eingehend damit auseinandersetzen! *froi*

Guts Nächtle,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5

Re: Opcodes berechnen - wie?

  Alt 24. Jul 2004, 08:54
Falls es auch ein Buch tut, empfehle ich "Assembler gepackt" von Joachim Rohde, da ist hinten eine, soweit ich das beurteilen kann, recht ausführliche Opcode-Tabelle im Anhang, und teuer ist das Buch auch nicht (15€, damals jedenfalls (c; )
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz