AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ASM zu binärcode bzw funktionierender exe?

Ein Thema von Memnarch · begonnen am 28. Jul 2011 · letzter Beitrag vom 29. Jul 2011
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#11

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 28. Jul 2011, 18:52
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Jul 2011 um 18:54 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#12

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 28. Jul 2011, 18:55
So gesehen könnte Embarcadero auch gleich noch den Source-Code des Compilers und der IDE dazupacken

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)
Anscheinend schaffen die das ja selbst nicht (siehe Error Insight).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#13

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 28. Jul 2011, 19:09
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.



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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Jul 2011 um 19:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#14

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 28. Jul 2011, 23:45
Es gibt auf der Seite verschiedene Referenzen, ich habe für meinen Brainfuck-JIT-Compiler diese verwendet: http://ref.x86asm.net/coder32.html
Herje ist das ein wust^^.

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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#15

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 00:46
Ja, opN steht für den N-ten Operanden. Ein Operand ist meistens entweder
  • ein Register (z.B. eAX, AL usw.)
  • eine direkt (=immediate) auf den OP-Code folgende Konstante im Code (imm8, imm16, imm32)
  • ein mod-R/M-Byte – eine auf konfuse Weise kodierte Kombination aus einem Register (r) und einer Adresse (m wie Memory) (in der Tabelle gekennzeichnet durch r/m8 , r16/32 , r/m16/32 etc.)
Die Sache mit dem mod-R/M-Byte zu verstehen, hat mich damals am meisten Zeit gekostet. Eine wirkliche Erklärung habe ich dazu nicht gefunden, aber immerhin diese Übersicht¹, und daraus habe ich es mir dann zusammengereimt. Oben steht das Ziel der Operation (immer Register), links die Quelle (Register, oder Adresse).

Wenn z.B. im Register EBX eine Speicher-Adresse steht, und du den an dieser Adresse stehenden Wert in das Register EAX kopieren willst (als Mnemonic: MOV EAX, [EBX] ²), so lautet der OP-Code dafür: 89 03 . Das erste Byte ist die Instruction MOV , das zweite Byte ist das mod-R/M-Byte für „EAX ← [EBX]“ (siehe Tabelle). MOV EAX, EBX (ohne eckige Klammern (!), also direkte Kopie des Register-Inhaltes) wäre hingegen 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 Wert^ in Delphi

Geändert von Namenloser (29. Jul 2011 um 17:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#16

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 07:21
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

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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch (29. Jul 2011 um 08:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#17

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 10:41
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 10:53
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...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#19

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 11:24
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

AW: ASM zu binärcode bzw funktionierender exe?

  Alt 29. Jul 2011, 11:33
Nein,

B8 bedeutet: mov eax, <32-Bit Wert>
darauf folgt der entsprechende 32-Bit Wert (Little Endian):

Code:
   Hex      32-Bit             Little Endian
20 ===> 0x14 =====> 0x00000014 ============> 14 00 00 00


B8 14 00 00 00
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (29. Jul 2011 um 11:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 16:40 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