Programmierung mit reinem Binärcode

Hallo zusammen,

wollte mal wissen, ob es heute noch möglich ist in eine Datei einen Binärcode zu schreiben (also rein 0 und 1) und dann diesen als Programm auszuführen?
Also ein Programm ohne Compiler oder Interpreter zu schreiben?

Wenn nicht, kann man dann wenigstens mit einem speziellen Editor eine exe-Datei öffnen und diesen Binärcode ansehen?

THX

Hallo Fragewurm,

wollte mal wissen, ob es heute noch möglich ist in eine Datei
einen Binärcode zu schreiben (also rein 0 und 1) und dann
diesen als Programm auszuführen?
Also ein Programm ohne Compiler oder Interpreter zu schreiben?

Wieso sollte das nicht gehen ?
Alles was ein Compiler oder Assembler kann, kann ich schon lange (1976 musste ich noch meine Programme für den KIM-1 [CPU 6502] von Hand schreiben, dann Kodieren und die HEX-Werte eintippen. Danach konnte man das Programm auf einem Kassettenrecorder abspeichern).
Wenn man heute einen Assembler, Compiler oder sonstigen Codegerator selber schreibt, muss man dann auch von Hand kontrollieren ob die Befehle richtig codiert werden.

Man benötigt aber, neben den Unterlagen zu CPU und Betriebssystem, noch einen (HEX)-Editor um die Daten auf die Platte zu bekommen.

Wenn nicht, kann man dann wenigstens mit einem speziellen
Editor eine exe-Datei öffnen und diesen Binärcode ansehen?

Ja, nennt sich allgemein Disassembler. Gibt es als eigenständige Programme oder ist Bestandteil der meisten Debugger.

MfG Peter(TOO)

Als kleinen Tip hinterher:
nullen und einsen wirste auch mit dem dissassembliertem code nicht finden,
das niedrigste was du sehen wirst sind hexadezimale Ziffern (1-9,A-F) diese können, je nach dissassemblierungsrad, in die einzelnen CPU-Befehle übersetzt werden (also die ganzen MOVs, und JMPs usw.)

Sagt dirdas alles nichts such dir ein Buch/Webseite über Assembler-sprachen raus :wink:

Hallo,

null problemo, wenn du das Wort Datei in dem Zusammenhang weglässt - das setzt schon unglaublich viel voraus wie ein Dateisystem auf einem Datenträger und ein Betriebssystem, das diese Datei einliest und reloziert. Eine Exe-Datei ist keineswegs einfach Binärcode für 80x86-Prozessoren (d.h. nur zum Teil).

Du kannst aber den Binärcode in ein Eprom brennen und das an den Prozessorbus anschliessen. So geht das z.B. beim BIOS, da existiert ja noch kein Betriebssystem. Voraussetzung ist, dass das Eprom an Adresse 0 anfängt, da springt der Prozessor beim Reset hin.

Allerdings musst du alle Adressen selbst ausrechnen, z.B. bei einem relativen Sprung die übersprungenen Bytes abzählen und beim Sprungbefehl einrechnen. Wenn man das eine Weile macht, kann man hexadezimal kopfrechnen. In den Urzeiten, bevor es Assembler gab, habe ich zu dem Zweck sogar eigene Formulare drucken lassen.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

wollte mal wissen, ob es heute noch möglich ist in eine Datei
einen Binärcode zu schreiben (also rein 0 und 1) und dann
diesen als Programm auszuführen?

alles was Du auf die Platte schreibst, steht dort als Nullen und Einsen. Es ist nur üblich, die in Bytes zusammen zu fassen, also immer 8 Bit (Nullen und Einsen) auf einmal zu betrachten, weil das übersichtlicher ist.

Also ein Programm ohne Compiler oder Interpreter zu schreiben?

Klar geht das. wenn Du ein Programm mit einem Assembler schreibst entsteht so etwas. Auf meinem ersten Computer musste ich noch ‚09‘ tippen, weil ich keinen Assembler hatte, der ‚MOV‘ verstanden und als ‚09‘ geschrieben hat.

Wenn nicht, kann man dann wenigstens mit einem speziellen
Editor eine exe-Datei öffnen und diesen Binärcode ansehen?

Klar gibt es Hex-Editoren.
http://www.google.de/search?hl=de&q=Hex+Editor+Freew…

Gruß, Rainer

Hallo Fragewurm,

Als kleinen Tip hinterher:
nullen und einsen wirste auch mit dem dissassembliertem code
nicht finden,
das niedrigste was du sehen wirst sind hexadezimale Ziffern
(1-9,A-F) diese können, je nach dissassemblierungsrad, in die
einzelnen CPU-Befehle übersetzt werden (also die ganzen MOVs,
und JMPs usw.)

Das ist Übungssache.
Nach über 30 Jahren „sehe“ ich auch bei HEX-Ziffern die Bitkombinationen :wink:

Sagt dirdas alles nichts such dir ein Buch/Webseite über
Assembler-sprachen raus :wink:

MIR musst du das nicht erklären :wink:

MfG Peter(TOO)

Hallo Reinhard,

Du kannst aber den Binärcode in ein Eprom brennen und das an
den Prozessorbus anschliessen. So geht das z.B. beim BIOS, da
existiert ja noch kein Betriebssystem. Voraussetzung ist, dass
das Eprom an Adresse 0 anfängt, da springt der Prozessor beim
Reset hin.

Das stimmt so nicht.
Leider ist das bei den X86-CPUs genau anders. Hier muss das ROM oben im Speicher liegen.
Manche Prozessoren arbeiten zudem mit einem Reset-Vektor über welchen der PC gesetzt wird, andere setzen den PC auf einen bestimmten Wert und fangen dort mit der Abarbeitung des Codes an.

MfG Peter(TOO)

C64 6510 Code:

00 C0 A2 00 BD 0E C0 20 D2 FF E8 E0 0B D0 F5 60 4A 41 4A 41 20 53 4F 20 47 49 4E 47 20 44 41 54 20 44 41 4D 41 4C 53 20 3B 2D 29 20 4C 47 20 41 4C 45 58

LG Alex

MIR musst du das nicht erklären :wink:

MfG Peter(TOO)

Sorry *G*
Meinte auchned dich sondern den dem du geantwortet hast :wink:

MfG
Quin

Das stimmt so nicht.
Leider ist das bei den X86-CPUs genau anders. Hier muss das
ROM oben im Speicher liegen.

Hallo,

da hast du recht, ich hab wohl schon ewig keine x86-Hardware mehr entworfen oder analysiert.

Mit dem „leider“ hast du auch recht, ich weiss bis heute nicht, wozu das gut sein soll. Immerhin besteht Hoffnung: es sind die letzten 16 Bytes vorgesehen, bei der 128-bit-Generation kann man also keinen Jump mehr unterbringen und braucht ein neues Reset-Konzept. Geschieht Intel recht, an Adresse 0 gäbe es das Problem so nicht. Ich habs eben schon immer besser gewusst!

Gruss Reinhard

Hallo Reinhard,

da hast du recht, ich hab wohl schon ewig keine x86-Hardware
mehr entworfen oder analysiert.

ich auch schon lange nicht mehr.

Mit dem „leider“ hast du auch recht, ich weiss bis heute
nicht, wozu das gut sein soll. Immerhin besteht Hoffnung: es
sind die letzten 16 Bytes vorgesehen, bei der
128-bit-Generation kann man also keinen Jump mehr unterbringen
und braucht ein neues Reset-Konzept. Geschieht Intel recht, an
Adresse 0 gäbe es das Problem so nicht. Ich habs eben schon
immer besser gewusst!

Je nach Anwendung ist jedes Konzept Sch… !

Wenn die CPU einfach damit anfängt Code ab Adresse 0 abzuarbeiten, stellt sich die Frage wo man die Interrupt-Vektoren ablegt.
Eigentlich macht das der x86 auch so, nur wird dabei das Segment auf 0xFFFF gesetzt. Durch das Speicherkonzept des 8086 ergeben sich dann die 16 Bytes.
BTW: Welche andere CPU startet eigentlich noch so ?

Als andere Variante bleibt dann einen Resetvektor zu benutzen.
Für den CPU-Entwickler ist es dann am einfachsten einen zusätzlichen NMI einzubauen.
Dann liegen aber alle Vektoren im ROM, was wieder Sch… ist, wenn man ein Entwicklungs- oder Betriebssystem bauen will, ausser man hat die Möglichkeit die Vektortabelle im Speicher zu verschieben.
Die andere Möglichkeit ist dann noch den Resetvektor an der höchsten Adresse abzulegen.

Ob jetzt das ROM oben oder unten liegt ist dabei eigentlich egal.

MfG Peter(TOO)

BTW: Welche andere CPU startet eigentlich noch so ?

PICs.

Gruss Reinhard

Danke!
Dann bedanke ich mich für die ausführlichen Antworten.

Ist ja schon erstaunlich, was ein Compiler bzw. Interpreter eigentlich alles leisten muss.