Wie übergibt man Maschinensprache an das System?

... komplette Frage anzeigen

6 Antworten

Vor einiger Zeit habe ich schon mal auf eine ähnliche Frage geantwortet, aber ich schreibe hier jetzt noch mal ein paar Sätze, weil es gerade passt:

Vermutlich meinst du Assembler-Programmierung und nicht direkt den Maschinencode. (Das haben andere ja auch schon geschrieben.)

Allerdings habe ich mich lange und intensiv mit Assembler auseinander gesetzt und speziell beim Reversing hat man ja oft den Maschinencode direkt neben dem Disassemblat vor der Nase, weshalb man sich früher oder später einige Befehle in Hex einprägt.

Aus Interesse guckt man sich dann auch irgendwann mal im Datenblatt der CPU an, wie die Befehle zusammen gebaut werden. (und fällt bei x86 vor Schreck vom Hocker; im Gegensatz zur "Sauberkeit" von ARM, aber egal ...).

Naja, und irgendwann habe ich dann halt gemerkt, dass ich schon fast unbewusst den Maschinencode im Hexeditor modifizieren kann. Hat auch einwandfrei geklappt. :)

Aber da man ja einen gewissen Spieltrieb hegt, habe ich mich dann gefragt, ob ich "Hello World" nicht auch direkt im Maschinencode im Hexeditor schreiben kann, und siehe da: Es hat geklappt. :)

Aaaaaber! Der Umgang mit Adressen und Sprüngen ist die Hölle! Und gerade dafür bietet sich ein richtiger Assembler an, weil man dann nicht jeden Mist im Kopf nachrechnen muss.

Also als Proof-Of-Concept kann man Progrämmchen von Hello-World-Größe ruhig im Hexeditor schreiben. Bei allem was darüber hinaus geht, wird man aber garantiert wahnsinnig. :)

Das einfache ändern und ersetzen von Befehlen in Maschinencode direkt im Hexeditor ist aber ohne weiteres möglich. Mit der Zeit weiß man dann schon, wie man Sprünge verbiegt oder gängige Befehle ersetzt, dass ein Programm etwas anderes tut als das, wofür es ursprünglich geschrieben wurde.

Fazit: Falls dich das Thema interessiert, informiere dich mal über "Assembler Programmierung". Falls du es schaffst, an dem Thema dran zu bleiben, stößt du irgendwann von ganz allein auf Maschinencode.

Aber lass dir gesagt sein, dass Assembler auf viele Leute abschreckend wirkt. Für mich war es meine erste "Programmiersprache", wenn man das überhaupt so nennen kann, aber heutzutage fangen die Leute lieber mit C# oder Python an.

Naja, viel Spaß damit, falls du es schaffst, Interesse zu entwickeln! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Blacky2000
02.09.2016, 20:51

Danke, werd ich mal gucken, ich mag sowieso alles was mit Technik zu tun hat und auf den ersten Blick unverständlich aussieht, wenn man sich dann aber damit beschäftigt bzw. sich damit auskennt übersichtlich wird, so wie beispielsweise Programmierung generell oder wenn man´s noch extremer nimmt direkt Maschinencode

Aber noch ne Frage: Bringt es mir überhaupt etwas, wenn ich einigermaßen Python behersche mich mit Assembler zubeschäftigen bzw. zu lernen?

1

Du brauchst auf jeden Fall einen Exe-Dateiheader, Dann kannst Du ab einer bestimmten Position, die innerhalb des Headers steht, Deinen Code eintragen.

Allerdings kannst Du ohne Schnittstelle zum Betriebssystem kaum sinnvolle Abläufe programmieren, es würde schon an einer textlichen Ausgabe scheitern.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
02.09.2016, 20:39

Die Header der Ausführbaren Datei kann man auch ohne weiteres direkt in Assembler mit rohen Bytes schreiben. Hab das schon mit EXE und ELF Dateien gemacht. Dabei muss man sich natürlich an die vielen Seiten der Spezifikation halten. Der Vorteil dabei ist, dass die ausführbaren Dateien unglaublich klein werden (locker unter 300 Byte, und zwar inklusive einfachem Programmcode).

Gerade bei den Headern nimmt sich Assembler und Hexeditor nicht viel, da man ja sowieso bloß nackte Bytes eintippt. Schwieriger wird es, wenn man irgendwelche Offsets oder Adressen berechnen muss ... dabei macht sich ein Assembler dann schon positiv bemerkbar. :)

1

In den 80ern haben wir uns, die wir einen Atari oder Commodore unser eigen nannten, natürlich viel und ausführlich mit Maschinensprache befaßt.

Kunststück: der C64 (einer der populärsten Homecomputer dieser Ära) hatte ein freies RAM von gerade mal 30 kB. Jedes Byte für eigene Anwendungen war kostbar.

Außer dem ROM-Listing mußte man seinerzeit natürlich die Assemblerbefehle aus dem Effeff beherrschen. Hier die Assemblerbefehle für die CPU des C64 (MOS 6502, 8-bit):

https://www.c64-wiki.de/index.php/%C3%9Cbersicht_6502-Assemblerbefehle

Du könntest ja mal zum Einstieg ein wenig mit der simplen CPU des C64 spielen. Es gibt diverse PC-Emulatoren für den C64, und ebenfalls auch einige Maschinensprache-Monitore, mit denen man ein Assemblerprogramm an die emulierte CPU übergeben kann.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von gfntom
02.09.2016, 20:20

Wie du selber schreibst:
das war Assembler, fälschlich auch oft als "Maschinensprache" benannt. Der Assembler übersetzt die Assembleranweisungen in Maschinesprache. Der Assemblercode ist zugegebnermaßen der Maschinensprache sehr nahe, so dass ein Assembler - je nach Funktionsumfang - nur eine tabellarische "Übersetzung" vornehmen muss.

Aber auch die CPU des C64 "versteht" kein "LDA #$E0" sondern nur das "übersetzte" Äquivalent "10101001 11100000"

In "echter" Maschinensprache hat kaum je einer programmiert, in Assembler jedoch schon einige.

 

0
Kommentar von TeeTier
02.09.2016, 20:20
Kunststück: der C64 (einer der populärsten Homecomputer dieser Ära) 
hatte ein freies RAM von gerade mal 30 kB. Jedes Byte für eigene 
Anwendungen war kostbar.

Ich programmiere gerade einen Microcontroller in Assembler, der nur 32 Byte RAM hat! Also nicht KILObyte, sondern nur 32 nackte Byte!

Grafisch dargestellt:

xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx

Lustig, oder? Eigentlich würde man denken, dass man mit so wenig gar nichts anfangen kann. :)

Da ist der Stack sogar schon mit inbegriffen! Ich wünschte, ich hätte wenigstens 1KB zur Verfügung. ><

0

Ich würd einen Hex-Editor nehmen und damit Maschinencode schreiben, speichern dann als exe. Einige Hexeditoren haben sicherlich auch eine Binär-Ansicht.

Heutzutage programmiert allerdings kein Mensch mehr in purer Maschinensprache. Weil der Aufwand in keinem Verhältnis steht.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Blacky2000
02.09.2016, 19:57

Das stimmt, ich wollte aber halt mal wissen wie ich´s mache, falls ich mal keine andere Möglichkeit habe meine Programme "normal" zu nutzen/schreiben...

0
Kommentar von TeeTier
02.09.2016, 20:43

Einige Hexeditoren haben sicherlich auch eine Binär-Ansicht.

Naja, also die 16 Nibbles sollte man schon im Kopf haben, ohne jedes mal aufs neue grübeln zu müssen. Wenn man 1F sieht, dann ist das das gleiche, als würde man "0001 1111" lesen.

Geht dir bestimmt auch so, ohne dass du bisher bewusst darauf geachtet hast!

Einen Binäreditor bzw. Binärmodus halte ich deshalb für nicht sonderlich sinnvoll. Das gibt es ja meistens sowieso nur, damit die Entwickler einen Punkt auf ihrer Todo-Liste als Feature abhaken können. So richtig gebraucht habe ich das noch nie. :)

0

Nachfolgende Erläuterung für Assembler ist zwar schon älter, aber immer noch gültig:

http://assembler.hpfsc.de/

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Blacky2000
02.09.2016, 19:54

Wie du schon sagst es ist ne Erläuterung für Assembler. Jedoch wird Maschinencode meist fälschlicher weise Assembler bezeichnet, leider auch diesem Fall...

0
Kommentar von Mikkey
02.09.2016, 20:03

aber immer noch gültig:

Damit liegst Du falsch (zumindest, wenn Du eine 64-Bit-Betriebssystem-Grundlage hast). Damit kann kein 16-Bit-Code (aus den Beispielen) ausgeführt werden.

2

Ich bezweifle, dass du es schaffst, ein nutzbares Programm in Maschinencode für x86 zu schreiben. Wozu also diese Frage?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Blacky2000
02.09.2016, 19:52

Ich bezweifle das du für diese Antwort irgendein Danke oder sowas bekommst. Also wozu die Antwort?

Man ey ich frage einfach nur aus interesse

0

Was möchtest Du wissen?