![]() |
AW: ASM zu binärcode bzw funktionierender exe?
Besonders blöde ist es ja, daß die Delphi-IDE quasi einen Binär-zu-ASM-Decoder integriert hat. (siehe CPU-Ansicht)
Würde BorCodeGero solche internen Sachen uch mal "öffentlich" zur Verfügung stellen, dann hätten sie gleich mal ganz "schöne" Komponenten/Codes im Delphi integriert, wofür man jetzt noch externe Bibliotheken nutzen muß. (obwohl eigentlich etwas vorhanden ist) Und wenn diese ASM-Deklarationen in einer ordentlichen Weise veröffentlich wären, dann könnte man sie bestimmt auch ganz gut für den umgekehrten Weg (ASM-zu-Binär) nutzen. Genauso schön wäre es schön, wenn der Codeparser (der vorm Compiler) öffentlich wäre, dann hätte man einen aktuellen Parser, welcher wirklich mal die aktuellen Delphicodes parsen könnte. (gut für sehr kleine Script-Engines) |
AW: ASM zu binärcode bzw funktionierender exe?
So gesehen könnte Embarcadero auch gleich noch den Source-Code des Compilers und der IDE dazupacken :stupid:
Zitat:
|
AW: ASM zu binärcode bzw funktionierender exe?
Beim Error-Insight hab ich eher den Verdacht, als wenn da ein anderer Parser genutzt wird, als für den Compiler.
Mit dem selben Parser und einem Background-Compiler (ohne aktive Codeoptimierungen und Co.) könnte man man da bestimmt etwas zusammenbekommen, welches besser läuft. :stupid: Nee, nicht den ganzen Compiler, nur etwas, was den Quellcode einließt und erstmal in eine Art DOM-Objekt zerlegt. Darüber könnte man auch endlich mal einen Multi-Pass-Compiler bauen (denn der aktuelle Single-Pass-Compiler mag vielleicht schneller sein, hat aber auch gewaltige Nachteile). Wo man jetzt doch sowieso mehrere Compiler hat, macht es sich eh besser, den Quellcode erstmal zu zerlegen, darin vielleicht noch ein paar optimierungen vorzunehmen und kann es dann an den entsprechenden Compiler weitergeben, der ja nun selber keinen Code mehr parsen muß (da alles schon geparst und syntaktisch kontrolliert vorliegt) und somit sich nur noch auf seine wesentliche Aufgabe konzentrieren zu braucht. Für's Code-Insight und das Error-Insight kann man sich dann aus ganz einfach das Wichtigste rausziehen, aus den den vorgeparsten Daten. Da sich die Syntax ständig verändert/erweitert hätte man dann einen Parser, welcher auch wirklich mit allen Codes klar kommt, da er auch von denen kommt, welche die Syntax festgelegt haben. Die letzen Delphi-Parser stammen doch quasi noch aus Delphi 7-Zeiten und danach gibt es kaum noch etwas, was wirklich mit all den neueren Feinheiten von Generics, Operatoren, recordmethoden, Klassenvariablen oder alternativen recordstrukturen klarkommt. Neueres ist doch mehr nur für einen begrenzten Wortschatz, von dazugehörigen "kleinen" Scriptengines, erstellt wurden. |
AW: ASM zu binärcode bzw funktionierender exe?
Zitat:
Schätze mal das aber zuersteinmal die implementierung der 1Byte opcodes reichen würde oder? Mal abgesehen davon rätsel ich gerade an einigen stellen der tabelle rum. Spalte "PO" ist klar, das ist der primary opcode, mnemonic der befehl als geschriebener Text, so und jetzt hänge ich bei den spalten op1, op2, op3, op4. op = operand? Da bräuchte ich mal kurz nen anstubs. ich kenne nur befehl a, b wieso den jetzt bis op4? und wenn ich das richtig sehe dient 0F dazu einen 2bytebefehl(0F als erstes byte) zu markieren? MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
Ja, opN steht für den N-ten Operanden. Ein Operand ist meistens entweder
![]() Wenn z.B. im Register
Delphi-Quellcode:
eine Speicher-Adresse steht, und du den an dieser Adresse stehenden Wert in das Register
EBX
Delphi-Quellcode:
kopieren willst (als Mnemonic:
EAX
Delphi-Quellcode:
²), so lautet der OP-Code dafür:
MOV EAX, [EBX]
Delphi-Quellcode:
. Das erste Byte ist die Instruction
89 03
Delphi-Quellcode:
, das zweite Byte ist das mod-R/M-Byte für „EAX ← [EBX]“ (siehe Tabelle).
MOV
Delphi-Quellcode:
(ohne eckige Klammern (!), also direkte Kopie des Register-Inhaltes) wäre hingegen
MOV EAX, EBX
Delphi-Quellcode:
.
89 C3
¹ gerade jetzt sehe ich, dass das gleiche auch unten auf der anderen Seite steht... ² die eckigen Klammern sind bekanntlich der Dereferenzierungs-Operator, das Assembler-Äquivalent zu
Delphi-Quellcode:
in Delphi
Wert^
|
AW: ASM zu binärcode bzw funktionierender exe?
Ih hatte es dann bisher so verstanden:
Befehl + Ziel(Register) = OpCode deswegen ist MOV EAX, X ein anderer OpCode als MOV EBX, X EDIT: ah ne wohl doch was falsch verstanden^^ aber das mit dem Modbytes...dein link führt mich auf die hauptseite o.O EDIt2: ah hab die tabelle gerade am ende der OpCode seite gefunden :P EDIT3: ah ja jetzt hats klick gemacht bei der tabelle. Deswegen gibt es auch z.B für ADD verschiedene opcodes, weil das wiederum abhängig davon ist, welche zulässigne register kombinationen mit dem befehl auftreten können. Mh es klingelt im kopf immer lauter :stupid: |
AW: ASM zu binärcode bzw funktionierender exe?
SO nochmal eine Frage zu der tabelle:
bei den Op1-4 stehen dadrunter die zulässigen register bzw memoryblöcke. Wenn dort nur "r" ohne r8, r16 etc steht, beinhaltet das alle register die in der ModR/M Byte tabellen ein (\r) hinter sich haben? und mm steht für eine adresse zu einem speicherblock, richtig? wie wird die denn dann angegeben, also an den opcode angehängt? MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
mm steht laut der letzten Tabelle auf der Seite für die Register MM0 bis MM7.
Speicheradressen bzw. Konstanten werden wie in meinem Beispiel drangehangen: mov eax, 20 => B8 14 00 00 00 Es sei denn ich habe dich falsch verstanden... |
AW: ASM zu binärcode bzw funktionierender exe?
Mh, seh ich das ichtig dass die operanden umgekehrt werden?
mov eax, 20 => mov 20, eax//das bedeutet doch dein bytecode? und dein Hexwert wird von links nach recht und nicht von rechts nach links gelesen? in der ModByte tabelle steht für 00 aber [eax] und nicht eax. Wieso den dereferenzierten? und wie wird hier unterschieden sodass erkannt wird, dass nach dem opcode für mov das eine eine adresse und keine eventuelle nezeichnung für ein anderes mrmodbyte ist? Dazu bräuchte ich mal eine detaliertere erläuterung |
AW: ASM zu binärcode bzw funktionierender exe?
Nein,
B8 bedeutet: mov eax, <32-Bit Wert> darauf folgt der entsprechende 32-Bit Wert (Little Endian):
Code:
:arrow:
Hex 32-Bit Little Endian
20 ===> 0x14 =====> 0x00000014 ============> 14 00 00 00 B8 14 00 00 00 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz