{"id":67782,"date":"2026-01-06T17:37:34","date_gmt":"2026-01-06T16:37:34","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=67782"},"modified":"2026-04-11T07:02:56","modified_gmt":"2026-04-11T05:02:56","slug":"vom-mausklick-zur-maschinensprache-linux-3","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2026\/01\/vom-mausklick-zur-maschinensprache-linux-3.htm","title":{"rendered":"Vom Mausklick zur Maschinensprache (Linux 3)"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2026\/01\/vom-mausklick-zur-maschinensprache-linux-3.htm#comments'>7 Kommentare.<\/a>)<\/small> <\/div>\n<h2 class=\"wp-block-heading\">1. Der einfache Teil<\/h2>\n\n\n\n<p>Es wird wieder technisch. Der erste Teil ist vielleicht noch von allgemeinem Interesse, der zweite Teil dann eher f\u00fcr an Informatik Interessierte, passend zum Stoff in der 13. Jahrgangsstufe in Bayern. (Solange noch Ferien sind, ist Nerdkram erlaubt!)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Der Klick im Men\u00fc<\/h3>\n\n\n\n<p>Ich habe mir ja im Kontextmen\u00fc einen Eintrag &#8222;Verkn\u00fcpfung in Home erstellen&#8220; angelegt, um mir zu gegebenen Elementen auf einfache Art eine Verkn\u00fcpfung in meinem Homeverzeichnis anlegen zu k\u00f6nnen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"312\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_kontextmenu_actions.png\" alt=\"\" class=\"wp-image-67757\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_kontextmenu_actions.png 502w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_kontextmenu_actions-300x186.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_kontextmenu_actions-150x93.png 150w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/figure>\n\n\n\n<p>Die Frage: Was passiert eigentlich, wenn man mit der Maus irgendwohin klickt? H\u00e4ufig ist die Antwort: Es werden ein paar Zeilen Code ausgef\u00fchrt, die irgendwo festgelegt sind. <\/p>\n\n\n\n<p>In diesem Fall wei\u00df ich sogar, welche Code-Zeilen das sind, weil ich das ja selbst festgelegt habe. Die Details f\u00fcr den Kontextmen\u00fc-Eintrag &#8211; wann er auftaucht, wie er hei\u00dft, was er bewirkt &#8211; stehen in einer Datei mit folgendem Inhalt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Nemo Action]\nActive=true\nName=Verkn\u00fcpfung in Home erstellen\nExec=ln -s %F \"\/home\/rau\/Verkn\u00fcpfung mit %N\" \nIcon-Name=folder_home\nSelection=s\nExtensions=any;\nQuote=double<\/code><\/pre>\n\n\n\n<p>Am wichtigsten ist wohl die Zeile, die angibt, was ausgef\u00fchrt wird:<\/p>\n\n\n\n<p><code>Exec=ln -s %F \"\/home\/rau\/Verkn\u00fcpfung mit %N\"<\/code><\/p>\n\n\n\n<p>Dabei ist %F ein Platzhalter f\u00fcr das aktuell ausgew\u00e4hlte Element mitsamt dem Pfad dorthin, und %N ein Platzhalter f\u00fcr den Namen des aktuell ausgew\u00e4hlten Elements. Ausformuliert hei\u00dft der auszuf\u00fchrende Teil dann, wenn etwa &#8222;Beispieldatei.odt&#8220; angeklickt ist:<\/p>\n\n\n\n<p><code>ln -s \"\/home\/rau\/Beispieldatei.odt\" \"\/home\/rau\/Verkn\u00fcpfung mit Beispieldatei.odt\" <\/code><\/p>\n\n\n\n<p>Aha! Das ist also, was wirklich geschieht, wenn man im Men\u00fc klickt. Diese Zeile Code wird ausgef\u00fchrt, wenn ich auf Beispieldatei.odt rechtsklicke und den entsprechenden Men\u00fcpunkt ausw\u00e4hle.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Der Aufruf in der Kommandozeile<\/h3>\n\n\n\n<p>Ich kann das Men\u00fc auch umgehen und diese Zeile  direkt in die Befehlszeile eingeben, das bewirkt das gleiche. Fr\u00fchers mussten wir immer so arbeiten, ganz ohne Mausklicks, da gab es allenfalls mal den Norton Commander.<\/p>\n\n\n\n<p>Also: Vieles von dem, was ich mit der Maus anklicke, ist nur eine Abk\u00fcrzung f\u00fcr auszuf\u00fchrenden Code. Und diesen auszuf\u00fchrenden Code kann ich auch gleich unter Umgehung der Maus selber eintippen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"817\" height=\"99\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_cmd.png\" alt=\"\" class=\"wp-image-67806\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_cmd.png 817w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_cmd-300x36.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_cmd-700x85.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_cmd-150x18.png 150w\" sizes=\"auto, (max-width: 817px) 100vw, 817px\" \/><\/figure>\n\n\n\n<p>Was hier passiert: Der Befehl &#8222;ln&#8220; wird benutzt, um zur Beispieldatei.odt eine symbolische (&#8222;-s&#8220;) Verkn\u00fcpfung mit dem Namen &#8222;Verkn\u00fcpfung mit Beispieldatei.odt&#8220; anzulegen. <\/p>\n\n\n\n<p>Dabei ist &#8222;ln&#8220; einer von vielen Befehlen, die es in Linux gibt, \u00e4hnlich nat\u00fcrlich auch bei Windows: &#8222;rm&#8220; l\u00f6scht Dateien, &#8222;mkdir&#8220; erzeugt ein Verzeichnis, und so weiter. All das muss man sich nicht merken, weil das Men\u00fc im Datei-Explorer einem das abnimmt: Man klickt mit der Maus etwas an, dann wird der darunter liegende Befehl ausgef\u00fchrt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.3 Das Starten des Programms<\/h3>\n\n\n\n<p>Wobei &#8222;Befehl&#8220; die tats\u00e4chliche Situation vielleicht verschleiert. &#8222;ln&#8220; ist nat\u00fcrlich ein Befehl, aber vor allem ist es ein Programm. Befehle sind Programme. Wenn ich in die Kommandozeile &#8222;ln&#8220; eintippe, wird das Programm &#8222;ln&#8220; ausgef\u00fchrt. Das Programm &#8222;ln&#8220; befindet sich in \/usr\/bin, erreichbar auch unter \/bin, ebenso wie andere Programme: mkdir, rm, mv, man, cp, curl und viele andere.<\/p>\n\n\n\n<p>Merke: Jeder Kommandozeilenbefehl ist eigentlich ein Programmaufruf. &#8222;ln&#8220; ist ein Programm.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.4 Das Programm unter der Lupe<\/h3>\n\n\n\n<p>Schauen wir uns das Programm &#8222;ln&#8220; einmal an, wie es auf der Festplatte aussieht, n\u00e4mlich als eine Reihe von Zahlen. So ein Werkzeuge zum Anschauen hei\u00dft Hex-Editor. Hex-Editoren gibt es zuhauf, in manchen Kreisen gelten sie schon als Hackerwerkzeug.<\/p>\n\n\n\n<p> Die Zahlen (im Hexadezimalsystem, also von 0 \u00fcber 9 bis F), aus denen die Datei besteht, stehen paarweise geordnet in dem gro\u00dfen mittleren Bereich. Nach g\u00e4ngigem System sind manchen Zahlenpaaren druckbare Zeichen zugeordnet, also Buchstaben und so,  diese Entsprechungen stehen in der rechten Spalte:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"600\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex.png\" alt=\"\" class=\"wp-image-67807\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex.png 800w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex-300x225.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex-700x525.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex-150x113.png 150w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>Das Bild zeigt nur den Anfang der Datei. Wie man an der Unverst\u00e4ndlichkeit sieht, ist es keine Textdatei, die von einem anderen Programm zeilenweise ausgef\u00fchrt wird, also nicht etwa Python-Code, sondern wohl ein assembliertes Programm in Maschinensprache.<\/p>\n\n\n\n<p>Ganz am Anfang der Datei fallen einem an zweiter bis vierter Stelle die Zahlen 454C46 auf, weil die nach Standardcodierung als ELF interpretiert werden. Das sieht nicht nach Zufall aus, es gibt auch keine weiteren sinnvoll zu lesenden Zeichen in der N\u00e4he. (Als herk\u00f6mmliche Zeichen zu lesen sind von den 256 verschiedenen Werten etwa hundert.) Also suchen wir doch mal, was ELF-Dateien eigentlich sind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.5 Exkurs: Dateianf\u00e4nge<\/h3>\n\n\n\n<p>Auch wenn Windows das vor einem zu verbergen sucht: Man erkennt oft an der Endung eines Dateinamens, um welche Art Datei es sich handelt: .docx sind Worddateien etwa. Allerdings: Wenn ich die Endung \u00e4ndere, bleibt die Datei nat\u00fcrlich gleich, also ist das nur ein Indiz, ein Hilfsmittel. Ein weiteres, technischeres und nicht so leicht zu \u00e4nderndes Hilfsmittel sind mitunter die Anf\u00e4nge von Dateien, also die ersten paar Bytes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alle assemblierten <strong>Java-Dateien<\/strong> erkennt man nicht nur an der Endung <code>.class<\/code>, sie fangen auch noch alle mit CAFEBABE an. Also, eigentlich mit den 4 Byte, die durch die Zahlenpaare CA FE BA BE repr\u00e4sentiert werden. Hier schauen wir uns die <em>Zahlen<\/em> an, nicht die Zahlen-als-Zeichen. (Dass die Zahlen hier wie Buchstaben aussehen, macht es nicht leichter.)<\/li>\n\n\n\n<li>Alle <strong>.exe-Dateien<\/strong> beginnen mit den 2 Byte 4D 5A. Hier sind, anders als vorhin, nicht die Zahlen interessant, sondern die als Zeichen interpretierten Zahlen, denn die sind &#8222;MZ&#8220;, und der Programmierer, der das eingef\u00fchrt hat, hei\u00dft Mark Zbikowski, und hat sich so ein bisschen verewigt.<\/li>\n\n\n\n<li>Alle <strong>zip-Dateien<\/strong> beginnen mit 50 4B 03 04 (eventuell auch 50 4B 05 06 oder 50 4B 07 08), dazu geh\u00f6ren .zip und .docx und .odt und .epub und .jar und viele mehr. Hier enthalten weder die Zahlen noch die als Zeichen interpretierten Zahlen einen Scherz oder Hinweis. (Zum korrekten Dateiformat geh\u00f6rt in allen F\u00e4llen nat\u00fcrlich viel mehr als nur der Anfang, der ist tats\u00e4chlich nur ein schnelles Signal.)<\/li>\n<\/ul>\n\n\n\n<p>Eine Liste solcher signifikanter Dateianf\u00e4nge gibt es bei Wikipedia: <a href=\"https:\/\/en.wikipedia.org\/wiki\/List_of_file_signatures\">https:\/\/en.wikipedia.org\/wiki\/List_of_file_signatures<\/a>. Wir lernen dabei: ELF steht f\u00fcr &#8222;Executable and Linkable Format&#8220;, und da steht am Anfang tats\u00e4chlich immer 7F 45 4C 46. Was eine ELF-Datei ist, dazu weiter unten mehr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Der schwierigere Teil, mit Basteln<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">2.1. Den Befehl &#8222;machnlink&#8220; erzeugen<\/h2>\n\n\n\n<p>Wenn man eine Kopie des Programms &#8222;ln&#8220; unter dem Namen &#8222;machnlink&#8220; in \/bin anlegt, kann man in der Kommandozeile den Befehl &#8222;machnlink&#8220; verwenden, indem man schreibt:<\/p>\n\n\n\n<p><code>machnlink -s \"\/home\/rau\/Beispieldatei.odt\" \"\/home\/rau\/Verkn\u00fcpfung mit Beispieldatei.odt\"<\/code><\/p>\n\n\n\n<p>Juhu! Wir haben unser erstes Linuxprogramm geschrieben! Also, jedenfalls angelegt. Das ist aus verschiedenen Gr\u00fcnden langfristig keine sinnvolle Idee, aber zum Ausprobieren ganz lustig.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.2 Den Befehl &#8222;machnlink&#8220; ver\u00e4ndern<\/h2>\n\n\n\n<p>Weil mir das Arbeiten im eigentlich gesch\u00fctzten Bereich \/bin zu brenzlig wird, verschiebe ich mein Progr\u00e4mmchen machnlink nach $HOME und kann es von dort in der Kommandozeile mit .\/machnlink aufrufen. Geht weiterhin und ich muss nicht als root arbeiten:<\/p>\n\n\n\n<p>.\/<code>machnlink -s Beispieldatei.odt <\/code>&#8222;<code>Verkn\u00fcpfung mit <code>Beispieldatei.odt<\/code>\"<\/code><\/p>\n\n\n\n<p>Wenn ich <em>irgendwelche<\/em> Zahlen in dem Programm machnlink ver\u00e4ndere, ist es danach sehr wahrscheinlich kaputt. Aber ich k\u00f6nnte doch ein paar der Zahlen ver\u00e4ndern, die wohl dazu gedacht sind, als Zeichen interpretiert zu werden, sprich: Text. Weiter unten in der Datei ist n\u00e4mlich eine Menge englischer Text mit Erkl\u00e4rung zum Programm, der angezeigt wird. Irgendwann am Ende st\u00f6\u00dft man zum Beispiel auf:<\/p>\n\n\n\n<p><code>In the 1st form, create a link to TARGET with the name LINK_NAME. <\/code><br><code>In the 2nd form, create a link to TARGET in the current directory.<\/code><\/p>\n\n\n\n<p>Das scheint Teil einer Anleitung zu sein. Wenn ich mit <code>machnlink --h<\/code> mir den Hilfetext anzeigen lasse, steht da n\u00e4mlich: <\/p>\n\n\n\n<p><code>In der 1. Form: Eine Verkn\u00fcpfung namens LINK_NAME auf ZIEL erstellen<\/code><br><code>In der 2. Form: Eine Verkn\u00fcpfung auf ZIEL im aktuellen Verzeichnis erstellen<\/code><\/p>\n\n\n\n<p>Mir wird die deutsche \u00dcbersetzung dieses Hilfetexts angezeigt, die <em>nicht<\/em> in der Programmdatei selbst gespeichert ist. Aus nachvollziehbaren Gr\u00fcnden sind alle \u00dcbersetzungen in anderen, zentralen Dateien gespeichert, das ist bei Wordpress \u00fcbrigens auch so. Wenn ich den englischen Text aber \u00e4ndere, so dass da steht <code>In the XXX form<\/code>, dann wird daf\u00fcr keine \u00dcbersetzung in der \u00dcbersetzungsdatei gefunde, gefunden und mir wird der ge\u00e4nderte Originaltext gezeigt. Damit haben wir nicht nur selbst ein neues Programm geschaffen, sondern es auch modifiziert!<\/p>\n\n\n\n<p>Aber es ist nat\u00fcrlich Unsinn, so brutal mit dem Hexeditor an diesen Programmen herumzupfuschen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.3 Den Befehl &#8222;machnlink&#8220; disassemblieren<\/h2>\n\n\n\n<p>So ein Programm wie <code>ln<\/code> wird wahrscheinlich in einer Hochsprache geschrieben, vermutlich in der Sprache C. Na gut, schauen wir nach: Ja, in C, und <a href=\"https:\/\/github.com\/coreutils\/coreutils\/blob\/master\/src\/ln.c\">hier ist der Code.<\/a> Das kann man sich deshalb so leicht anschauen, weil der Linux-Code quelloffen ist.<\/p>\n\n\n\n<p>Damit aus dem Quelltext ein ausf\u00fchrbares Programm wird, wird er in Maschinensprache \u00fcbersetzt. Das ist die einzige Sprache, die der Computerchip tats\u00e4chlich versteht, die aber f\u00fcr den Menschen fast v\u00f6llig unverst\u00e4ndlich ist. Dieser Vorgang hei\u00dft assemblieren. Das Ergebnis ist die ausf\u00fchrbare Datei &#8211; die mit den vielen verwirrenden Zahlen oben. <\/p>\n\n\n\n<p>Man kann so ein Programm auch gleich in einer Assembler-Sprache schreiben und in Maschinensprache \u00fcbersetzen lassen. Assemblersprache ist f\u00fcr Menschen mit Erfahrung noch verst\u00e4ndlich. W\u00e4hrend man theoretisch aus vielen verschiedenen Hochsprachen ein Maschinensprachen-Programm erzeugen kann, gibt es praktisch nur eine Assemblersprache f\u00fcr einen gegebenen Computerchip. Deswegen kann man aus dem Maschinensprachenprogramm in der Regel das Assemblersprachenprogramm rekonstruieren.<\/p>\n\n\n\n<p>Dieser Vorgang hei\u00dft disassemblieren und ist in Deutschland m\u00f6glicherweise illegal, ganz sicher, wenn es um Gesch\u00e4ftsgeheimnisse geht. Ich kenne mich rechtlich nicht genau aus. Durch Disassemblieren kann man sich anschauen, wie ein Programm eigentlich funktioniert, man kann auf Schwachstellen sto\u00dfen und sie ausnutzen oder melden. Wie gesagt, m\u00f6glicherweise illegal.<\/p>\n\n\n\n<p>Aber das Programm &#8222;machnlink&#8220; darf ich sicher disassemblieren, schlie\u00dflich steht oben:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>This program is free software: you can redistribute it and\/or modify<br>it under the terms of the GNU General Public License as published by<br>the Free Software Foundation, either version 3 of the License, or<br>(at your option) any later version.<\/p>\n<\/blockquote>\n\n\n\n<p>Einen ersten Einblick kriegt man mit dem Aufruf von <code>objdump -d machnlink<\/code>, hier wieder nur der Anfang:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1098\" height=\"860\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren.png\" alt=\"\" class=\"wp-image-67843\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren.png 1098w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren-300x235.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren-700x548.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_disassemblieren-150x117.png 150w\" sizes=\"auto, (max-width: 1098px) 100vw, 1098px\" \/><\/a><\/figure>\n\n\n\n<p>Wer in der 13. Jahrgangsstufe Informatik hat, erkennt zumindest, dass das wohl tats\u00e4chlich eine Assemblersprache ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.4 Die Sache mit dem Disassemblieren<\/h2>\n\n\n\n<p>Man kann also aus der weitgehend maschinensprachlichen ELF-Datei, oder aus einer anderen assemblierten Datei, den Assemblercode rekonstruieren. Zumindest meistens, und im Prinzip. Theoretisch kann man nie sicher sein, dass das dann auch stimmt, weil die Sache so trivial nicht ist, jedenfalls aus Sicht der theoretischen Informatik; in der Praxis d\u00fcrfte das aber gut funktionieren, da kenne ich mich aber nicht aus.<\/p>\n\n\n\n<p>Kann man am Ende sogar die urspr\u00fcngliche C-Datei wiederherstellen, mit den urspr\u00fcnglichen Variablennamen und allem dazu? Wenn man eine reine Maschinencode-Datei hat, dann nicht. Fr\u00fcher war das wohl immer so. Heute wird beim Assemblieren aus der Hochsprache oft zus\u00e4tzliche Information mitgeliefert, die das R\u00fcck\u00fcbersetzen in die Hochsprache erleichtert. So l\u00e4sst sich aus assemblierten Java-Klassendateien leicht der urspr\u00fcngliche Java-Code rekonstruieren, und auch ELF-Dateien enthalten sehr viel zus\u00e4tzliche Information. ELF-Dateien sind sozusagen Maschinensprache plus Extras.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.5 Doch mal einen eigenen Befehl schreiben<\/h2>\n\n\n\n<p>Der n\u00e4chste Schritt ist unweigerlich: K\u00f6nnte ich nicht gleich ein Programm in Assemblersprache schreiben? Nichts so Kompliziertes wie den ln-Befehl nat\u00fcrlich.<\/p>\n\n\n\n<p>Zu diesem Zweck m\u00fcsste ich allerdings die Assemblersprache f\u00fcr meinen Prozessor lernen. Soweit bin ich noch lange nicht. <a href=\"https:\/\/cs.lmu.edu\/~ray\/notes\/nasmtutorial\/\">Aber das Beispiel aus dem Tutorial,<\/a> das kann ich nachmachen. (<a href=\"https:\/\/asmtutor.com\/#lesson1\">Hier ein vielleicht noch besseres Tutorial.<\/a>) Die folgenden Zeilen schreibe ich in eine Textdatei namens hello.asm:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; ----------------------------------------------------------------------------\n; Writes \"Hello, World\" to the console using only system calls. Runs on 64-bit Linux only.\n; To assemble and run:\n;\n;     nasm -felf64 hello.asm &amp;&amp; ld hello.o &amp;&amp; .\/a.out\n; ----------------------------------------------------------------------------\n\n          global    _start\n\n          section   .text\n_start:   mov       rax, 1                  ; system call for write\n          mov       rdi, 1                  ; file handle 1 is stdout\n          mov       rsi, message            ; address of string to output\n          mov       rdx, 13                 ; number of bytes\n          syscall                           ; invoke operating system to do the write\n          mov       rax, 60                 ; system call for exit\n          xor       rdi, rdi                ; exit code 0\n          syscall                           ; invoke operating system to exit\n\n          section   .data\nmessage:  db        \"Hello, World\", 10      ; note the newline at the end<\/code><\/pre>\n\n\n\n<p>Wenn die Textdatei gespeichert ist, rufe ich die zwei folgenden Befehle auf:<\/p>\n\n\n\n<p><code>nasm -f elf64 -o 'hello.o' 'hello.asm'<br>ld -o 'hello.out' 'hello.o'<\/code><\/p>\n\n\n\n<p>Der erste erzeugt mir aus der Assemblersprachen-Datei &#8222;hello.asm&#8220; eine Art Zwischendatei, der zweite macht aus der Zwischendatei dann die endg\u00fcltige ausf\u00fchrbare ELF-Datei, die hier &#8222;hello.out&#8220; hei\u00dft. Und wenn ich in der Kommandozeile &#8222;.\/hello.out&#8220; eintippe, wird das Programm ausgef\u00fchrt und gibt &#8222;Hello, World&#8220; aus.<\/p>\n\n\n\n<p>Nat\u00fcrlich kann ich auf andere Art &#8222;Hello, World&#8220; ausgeben, indem ich das Programm Bash nutze, das Programm Python, das Programm Java. Aber hier wird eben kein solches anderes Programm benutzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.6 Die Probe aufs Exempel<\/h2>\n\n\n\n<p>Dann wollen wir mal das hello.out disassemblieren, also schauen, ob wir aus der ELF-Datei den Assemblercode rekonstruieren. Diesmal tippe ich eine Variante des Befehls ein, <code>objdump --disassemble-all hello.out<\/code>, und erhalte folgendes vollst\u00e4ndiges Ergebnis:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nhello.out:     Dateiformat elf64-x86-64\n\n\nDisassembly of section .text:\n\n0000000000401000 &lt;_start&gt;:\n  401000:\tb8 01 00 00 00       \tmov    $0x1,%eax\n  401005:\tbf 01 00 00 00       \tmov    $0x1,%edi\n  40100a:\t48 be 00 20 40 00 00 \tmovabs $0x402000,%rsi\n  401011:\t00 00 00 \n  401014:\tba 0d 00 00 00       \tmov    $0xd,%edx\n  401019:\t0f 05                \tsyscall\n  40101b:\tb8 3c 00 00 00       \tmov    $0x3c,%eax\n  401020:\t48 31 ff             \txor    %rdi,%rdi\n  401023:\t0f 05                \tsyscall\n\nDisassembly of section .data:\n\n0000000000402000 &lt;message&gt;:\n  402000:\t48                   \trex.W\n  402001:\t65 6c                \tgs insb (%dx),%es:(%rdi)\n  402003:\t6c                   \tinsb   (%dx),%es:(%rdi)\n  402004:\t6f                   \toutsl  %ds:(%rsi),(%dx)\n  402005:\t2c 20                \tsub    $0x20,%al\n  402007:\t57                   \tpush   %rdi\n  402008:\t6f                   \toutsl  %ds:(%rsi),(%dx)\n  402009:\t72 6c                \tjb     402077 &lt;_end+0x67&gt;\n  40200b:\t64                   \tfs\n  40200c:\t0a                   \t.byte 0xa<\/code><\/pre>\n\n\n\n<p>Der obere Teil, section .text, sieht sehr \u00e4hnlich aus wie unser urspr\u00fcnglicher Assemblertext. Das passt also. Der untere Teil, section .data, sieht aber nicht sinnvoll aus. Ist er auch nicht: Beim Disassemblieren wurden die Zahlen <code>48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a<\/code> nach bestem Wissen und Gewissen in den rechts stehenden Assemblercode \u00fcbersetzt. Diese 13 Zahlen sollen aber gar nicht Maschinensprache sein und sind gar nicht zum Ausf\u00fchren gedacht, sie sind vielmehr die Zeichenfolge <code>Hello, World<\/code>, wie man leicht ausz\u00e4hlen kann. (Das Zeichen 0a am Ende bedeutet: neue Zeile.)<\/p>\n\n\n\n<p>Die Aufteilung in markierte Sektionen in ELF hilft, solche Fehler zu vermeiden, ich wollte das hier nur mal forcieren und demonstrieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Verst\u00e4ndnisvolles Nicken<\/h2>\n\n\n\n<p>Ich wei\u00df, dass das alles ungeheuer kompliziert aussieht. Allein schon diese komischen Befehle. Es ist aber tats\u00e4chlich ganz einfach &#8211; sobald man es erst einmal mit eigenen H\u00e4nden gemacht hat. Kann auch nichts passieren dabei. Die Werkzeuge dazu gibt einem Linux gleich mit. Klar, unter Windows und MacOS geht das auch alles, da gibt es auch einen Hexeditor und einen Assembler und Disassembler. Irgendwie, irgendwo. Auf Linux finde ich das alles viel leichter.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(7 Kommentare.) 1. Der einfache Teil Es wird wieder technisch. Der erste Teil ist vielleicht noch von allgemeinem Interesse, der zweite Teil dann eher f\u00fcr an Informatik Interessierte, passend zum Stoff in der 13. Jahrgangsstufe in Bayern. (Solange noch Ferien sind, ist Nerdkram erlaubt!) 1.1 Der Klick im Men\u00fc Ich habe mir ja im Kontextmen\u00fc [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":67807,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,333],"class_list":["post-67782","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-linux"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_befehle_ln_hex.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/67782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=67782"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/67782\/revisions"}],"predecessor-version":[{"id":68547,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/67782\/revisions\/68547"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/67807"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=67782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=67782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=67782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}