![]() |
ASM zu binärcode bzw funktionierender exe?
Tag allerseits.
Da mich das gebiet Assembler total interressiert(sowie Compilerbau :twisted:), würde ich gerne wissen, wie man von Assembler code zu einem ausführbaren programm kommt. Wenn ich es richtig verstanden habe ist es doch so verkettet: Hochsprache -> Assembler -> Binärcode (bitte dringenst korrigieren wenn ich falsch liege) MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
Assembler = Binärcode
Assembler ist nur eine Textanzeige des Binärcodes. Das kannst du vergleichen mit der Darstellung von Zahlen, diese lassen sich im dezimalen System besser lesen als im binären. 0011 = 3 Es gibt nun noch spezielle Editoren, welche ASM-Code als "Hochsprache" behandeln und Sprungmarken mit Text darstellen. Diese Textmarken werden dann in Adressen beim kompilieren umgesetzt. Ohne diese Editoren müsste man die Adresse ausrechnen und eingeben. Wenn du mal CPU "anfassen" möchtest, dann empfehle ich dir einen Mikrocontroller zu nehmen und diesen zu programmieren. Beliebt sind die Atmel 8Bit Risc Prozessoren - billig und leicht zu beschalten. Das schöne da dran - man muss alles per Hand machen, da es kein OS gibt. |
AW: ASM zu binärcode bzw funktionierender exe?
Die einfache Antwort wäre
Compilieren,Linken,fertig. Aber das willst Du wahrscheinlich nicht lesen. Es gibt "Sprachpakete" bei denen es so gemacht wird, wie Du es skizziert hast: Hochsprache -> (Makro)Assembler -> Binärcode -> Ausführbares Programm Was sind denn Deine konkreten Anliegen? Gruß K-H |
AW: ASM zu binärcode bzw funktionierender exe?
Ich glaube wir haben uns etwas verpasst^^.
mir geht es darum: wen ich z.B den ausgeschriebenen befehl "mov" habe, wie wird der "übersetzt". Gibt es dafür eine tabelle, wird der wert einfach aus den Asciizeichen berechnet? mit "mov" im Klartext kann eine CPU ja schlecht was anfangen o.O. Und dan ebend noch: wie ist das mit einer Executable unter windows.? EDIT: rote box war wohl wieder auf urlaub.... EDIT2: Also: ich möchte ein programm schreiben dass aus einer art selbst definierter hochsprache(hoch in anführungszeichen...eher was sehr simples proceduales) den noch für menschenlesbaren ASM code generiert. Ok da bin ich noch im stande mir selbst zu helfen. Wenn ich aber bei dem lesbaren ASM angekommen wäre, wie geht es dan weiter? Was muss ich tun, damit ich daraus dan ein ausführbares programm machen kann? MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
Ich glaube ihr verwirrt ihn nur mehr...
Also man kann Assembler quasi 1:1 in Binären Code (ich nenne es mal so) umwandeln. z.B. entspricht der Befehl "hlt" dem Byte (Opcode) 0xF4 mov eax, 20 inc eax hlt :arrow: B8 14 00 00 00 40 F4 Liste mit Befehlen/Opcodes: ![]() Infos zum Aufbau von Exe-Dateien findest du bei Wikipedia: ![]() und natürlich bei Microsoft selbst: ![]() |
AW: ASM zu binärcode bzw funktionierender exe?
Meinst Du TASM oder MSAM?
|
AW: ASM zu binärcode bzw funktionierender exe?
@Neutral General: ah das ist doch schonmal was. Aber "quasi" bedeutet ja das ich trotzdem irgendwo ne referenz haben muss(also welcher opcode für welchen befehl ;) ). Aber damit komm ich schonmal weiter, danke.
@Bummi: o.O? |
AW: ASM zu binärcode bzw funktionierender exe?
Das
![]() Kapitel 2 sollte imho die Zusammensetzung der Instruktionen beschreiben. |
AW: ASM zu binärcode bzw funktionierender exe?
@Bummi
ich denke das ist in diesem zusammenhang egal Gruß K-H Edith: vielleicht noch als Zusatz, der "Assemblercode" für ein LINUX-Programm ist der gleichen wie bei windows, da der Processor der gleiche ist. Nur die systemspezifischen Befehle, unterscheiden sich. (Linker) Also alles was Du für das Laden des Programms und für die Speicheradressierung brauchst. (OK ein bischen API und ....) |
AW: ASM zu binärcode bzw funktionierender exe?
Zitat:
![]() ![]() |
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 |
AW: ASM zu binärcode bzw funktionierender exe?
AH, gerade diese seite gefunden:
![]() da steht genau erklärt wie opcodes notiert werden (z.B das +r). Damit kapier ich auch wieso du da nur den opcode direkt gefolgt von dem hexwert hast. :) MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
Liste der Anhänge anzeigen (Anzahl: 1)
kannst auch mal in Delphi nen asm-Block benutzen, ein paar Anweisungen reinschreiben, dann nen Breakpoint auf die 1. Anweisung und wenn der Debugger angehalten hat ins CPU-Fenster gucken (Strg+Alt+C). Da steht sowohl der Assemblerbefehl als auch der Bytecode des Befehls drin.
|
AW: ASM zu binärcode bzw funktionierender exe?
Hab icha cuh schon beutzt. war gut um mal rauszufinden ob ich vorgehensweise X richtig verstanden habe :).
werde ich auch zum gegentesten nutzen. wenn ich wirklich mal nen programm hab das bytecode ausschmeißt, werd ich daneben den selben asm code auchnochmal in delphi angucken und vergleichen :) edit: strg+alt+c geht aber nichtmehr sobald Smartinspect drin ist >.< MFG Memnarch |
AW: ASM zu binärcode bzw funktionierender exe?
Zitat:
|
AW: ASM zu binärcode bzw funktionierender exe?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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