Frage von Blacky2000, 117

Wie übergibt man Maschinensprache an das System?

Wie kann ich Maschinensprache benutzen? Schreibe ich den in ne einfache txt Datei oder eine mit andern Endung? Und kann man dieses Code auch direkt in die normale Konsole eingeben oder brauche ich da ne extra Konsole?

LG blaggy$

Expertenantwort
von TeeTier, Community-Experte für programmieren, 36

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! :)

Kommentar von Blacky2000 ,

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?

Antwort
von ceevee, 57

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.

Kommentar von Blacky2000 ,

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...

Kommentar von ceevee ,

Wenn deine Zielhardware nicht mal eine Assembler-Referenz hat, dann kannst du deine Programme sehr wahrscheinlich gar nicht schreiben.

Kommentar von TeeTier ,

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. :)

Antwort
von Mikkey, 38

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.

Kommentar von TeeTier ,

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. :)

Kommentar von Mikkey ,

Beim Assembler benutzt man aber auch den (von richtigen Programmiersprachen bekannten) Linker, der einem den Header produziert.

Übrigens habe ich mir kürzlich eine simple C#-exe gebaut, die hat auch nur 4,5 kB

Kommentar von TeeTier ,

Naja, entweder Assembler => Linker => Binary oder direkt Assembler => Binary, wenn man den Job des Linkers macht, und selbst den Header zusammen baut. Das ist so, als würdest du eine alte DOS-COM-Datei assemblieren, allerdings selbst einen EXE-Header einbauen ... für den Assembler ist es so, als würde er eine COM-Datei bauen, aber am Ende kommt eine sehr sehr kompakte EXE-Datei raus! :)

Übrigens habe ich mir kürzlich eine simple C#-exe gebaut, die hat auch nur 4,5 kB

Wenn man ordentlich strippt und unnötige Segmente entfernt, kommt man bei einem simplen C++ Programm auch auf knapp 500 Byte! Ganz ohne Assembler oder manuellem Header-Hacking. :)

Kommentar von Mikkey ,

Eine COM-Datei konnte man damals einfachst über Debug.exe erstellen. Die enthielt ja nichts als den Programmcode und evtl. enthaltene und initialisierte Datenbereiche. Ich habe mir nie die Mühe gemacht, die Befehlscodes zu lernen (nur aus dem häufigen Vorkommen weiß ich immer noch dass CD für "INT" und "90" für "NOP" bzw. "XCHG AL,AL" steht).

Kommentar von Blacky2000 ,

Wenn ich in der Windows Konsole den Code direkt in den Arbeitsspeicher mit debug schreibe, wird dieser dann noch von Virenscannern überprüft oder hat da ein AV niX mehr zusagen?

Kommentar von Mikkey ,

Exe-Programme kannst Du mit Debug nicht ohne Weiteres ändern (zumindest war das damals so). COM-Programme (wenn das System die denn noch ausführt, solltest Du einfach so speichern können.

Der Linker wird durch den Virenscanner ja auch nicht ausgebremst.

Den Debug gibt es aber m.W. nur auf 32-bit-Systemen!

Kommentar von Blacky2000 ,

ok

Antwort
von joheipo, 39

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.

Kommentar von gfntom ,

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.

 

Kommentar von TeeTier ,
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. ><

Kommentar von Blacky2000 ,

Würden direkte Konsolen Eingaben in den Arbeitspeicher von nem Virenscanner überprüft werden?

Antwort
von joheipo, 61

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

http://assembler.hpfsc.de/

Kommentar von Blacky2000 ,

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...

Kommentar von ceevee ,

Assembler ist eigentlich auch Maschinencode, nur halt ein bisschen besser für Menschen lesbar zusammengefasst. Wenn man mal eine Beispielzeile von Wikipedia nimmt:

https://de.wikipedia.org/wiki/Maschinensprache

Assembler: ADD eax, edx

Hex: 01 D0

Binär: 0000 0001 1101 0000

Alle drei Zeilen haben 1:1 die gleiche Bedeitung

Kommentar von NeoExacun ,

Dennoch kann Maschinencode und Assembler nicht 1:1 übersetzt werden. Dafür gibt es zuviele Unterschiede, besonders bei einer so komplexen Architektur.

Kommentar von ceevee ,

Maschinensprache bezieht sich eben auf die Maschine. ;)

Davon, dass Assembler-Spezifikation und Hardware aufeinanderpassen, gehe ich mal stillschweigend aus.

Kommentar von NeoExacun ,

Nicht nur das. Es gibt oft auch Assembler-Befehle, für die es keinen Maschinencode gibt. Das umzusetzen ist dann Sache des Assemblers.

Kommentar von Mikkey ,

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.

Kommentar von joheipo ,

Du hast recht; ich hätte "immer noch gültig" auf die in dem genannten Link bezogene 8086 beschränken müssen.

Maschinensprache bezieht sich eben auf die Maschine. Ein Ford-Motor kann nicht mit Opel-Teile befeuert werden, und ein 8-Zylinder nicht mit Teilen für einen 4-Zylinder.

Kommentar von Mikkey ,

So schlimm ist es gar nicht, in den 32-Bit-Varianten der aktuellen Windowse würde das sogar noch (über den 1632-Kern oder so ähnlich) gehen. Im 64-Bit-System gibt es die Wandlung 32 auf 64, da ist für die 16 Bit kein Platz mehr.

Antwort
von NeoExacun, 61

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

Kommentar von Blacky2000 ,

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

Kommentar von NeoExacun ,

Ich bin nicht auf ein Danke angewiesen^^ aber Danke für den Hinweis ;)

Eine .exe wäre ein Beispiel für Maschinencode. Kannst dir ja mal eine in einem beliebigen Texteditor anschauen.

Kommentar von ceevee ,

Ich würd die exe in einem Hex-Editor betrachten, in einem Texteditor sieht man nur Quatsch.

Aber für die Antwort kriegste trotzdem erstmal ein "Danke" und 'nen Pfeil nach oben. Um zu beweisen, dass der Fragesteller unrecht hat. ;P

Kommentar von NeoExacun ,

Es gibt auch Texteditoren, die Hex anzeigen können^^

Ich unterstelle den TO jetzt einfach mal, dass er mit dem Code in Hex-Form nicht mehr anfangen kann, als mit dem Code in ASCII-Form. Hätte er ernsthaft Ahnung davon, bräuchte er nicht in diesem Portal eine solche Frage stellen^^

Kommentar von Blacky2000 ,

Du kannst mir doch dann bestimmt auch sagen wie Maschinencode unter macOS umzusetzen ist? xD

Kommentar von NeoExacun ,

Genauso, heißt halt nicht mehr .exe

Kommentar von Blacky2000 ,

Ohne das ich davon Ahnung habe kann ich guten Gewissens behaupten das du damit unrecht hast, da eine macOS Anwendung, welche übrigens mit .app endet vollkommen anders gepackt ist als eine .exe Datei, falls diese überhaupt gepackt ist...

Kommentar von NeoExacun ,

Die Executable ist in der .app enthalten.

Kommentar von Blacky2000 ,

Welche wäre das dann? Spotify z.B. ist aus 225 Dateien gepackt...

Kommentar von Blacky2000 ,

Also nur so neben bei, nicht das ich dich nur auf die Probe stellen will, ich arbeite wirklich hauptsächlich an nem MacBook der neuesten Generation, falls das nen Unterschied für den Code macht

Kommentar von NeoExacun ,

Der Code selbst hängt immer von der Maschine ab. Maschine heißt hier Prozessor.

Jede Architektur hat ihren eigenen Befehlssatz. Welche CPU in deinem MacBook verbaut ist, sollte sich herausfinden lassen.

Keine passende Antwort gefunden?

Fragen Sie die Community