Kann jemand von euch Maschinensprache (Assembler)?

6 Antworten

Früher habe ich Assembler unter DOS gelernt, weil mich interessiert hat, wie Computer-Viren funktionieren. Ich wollte unbedingt einen "polymorphen Bootsektorvirus" schreiben. (Habe meine "Erfindungen" allerdings nicht weiter verbreitet!)

Damals war ich so 8 Jahre alt, und habe ca. ein halbes Jahr gebraucht, um damit auch wirklich sinnvolle kleine Progrämmchen schreiben zu können.

Später habe ich die Kenntnisse genutzt, um Software zu optimieren; damals waren die Compiler nämlich noch nicht so intelligent.

Allerdings kann man auch heute mit Assembler unter Ausnutzung von AVX & Co in modernen CPUs bei vielen Algorithmen pro Kern locker auf die Leistung kommen, für die man normalerweise in einer Hochsprache auf allen verfügbaren Kernen parallel rechnen müsste. (Mehr als 30 Gigaflops pro Kern bei rund 3.0 GHz sind dabei leicht möglich! Das schafft kein C++-Compiler!)

Außerdem ist Assembler sehr nützlich, um sich anzusehen, wie Drittsoftware oder auch Malware funktioniert. Für ein geübtes Auge und mit vernünftigen Werkzeugen liest sich Assembler fast genauso schnell wie der Quelltext einer "richtigen" Programmiersprache.

Ich nutze auch immer einen Disassembler bei meiner Software, um nachträglich zu sehen, ob und wie gut der Compiler optimiert hat, bzw. ob es noch Potential nach oben gibt.

Wie schon jemand anderes geschrieben hat, lohnt sich Assembler auch bei Mikrocontrollern, und besonders bei den ganz kleinen, die nur 32 Byte RAM und 32 Byte ROM haben, schreibe ich grundsätzlich nur in Assembler, da jedes einzelne Byte zählt.

Da ich mir oft Disassemblate ansehe, und direkt daneben der Maschinencode steht, habe ich mir schon vor Jahrzehnten praktisch "im Vorbeigehen" die hexadezimale Repräsentation der gängigsten Befehle eingeprägt und für kleinere Dinge brauche ich gar keinen Disassembler oder Debugger mehr, da ein Hex-Editor reicht, um Funktionen aus einer Software raus zu patchen.

Direkt in Maschinensprache (also ohne einen Assembler rein im Hex-Editor) habe ich früher mal so eine Art "Hello World" geschrieben, aber da man dabei ständig gefühlt Millionen von Adressen im Hinterkopf haben muss, ist ein vernünftiger Assembler mit Labels deutlich vorzuziehen! Mehr ist im Hex-Editor sicher auch möglich, aber dazu fehlte mir die Zeit und die Muße ... man kann seine Zeit ja auch sinnvoller verplempern. :)

Früher habe ich mit Assembler für den 286er angefangen, und danach alle Generationen bis zu aktuellen x64ern mitgemacht. Zwischendurch hatte ich mit den gängigen Hobby-µCs wie PICs und AVRs zu tun, aber auch vielen anderen embedded Prozessoren von Industrieanlagen. Später kamen dann diverse ARM-Generationen hinzu.

Also Assembler-Software habe ich mich früher noch mit dem MASM gequält, aber der hingt allen anderen Alternativen seit jeher hinterher. Der TASM war früher richtig gut und verglichen mit dem MASM äußerst angenehm. In letzter Zeit nutze ich viel GAS, weil es kaum eine Plattform gibt, die der nicht unterstützt, aber NASM (bzw. davor YASM) gefällt mir noch besser. Dazu kommen dann noch unzählige proprietäre Assembler von irgendwelchen Hardwarebuden um deren Prozessoren ansteuern zu können.

Fazit: Ich halte Assembler auch heute noch für sehr sinnvoll, da ...

  • ... Einsteiger dadurch besser die Innereien einer CPU verstehen,
  • ... man mithilfe von Reversing nachsehen kann, wie eine Software genau arbeitet,
  • ... Flaschenhälse u. U. um den Faktor 1000 effizienter machbar sind (wenn man wirklich gut ist!),
  • ... die Resultate eines Kompiliervorgangs überprüfbar werden,
  • ... es einfach lustig ist, winzig kleine Software zu schreiben (Malprogramm wie MS-Paint in einer EXE unter 2KB, oder einen Webserver auf Linux in einer ELF unter 500 Byte z. B.).
Naja, schönen Abend noch! :)

PS: Ich habe auch mal eine kleine statisch linkbare C-Laufzeitbibliothek größtenteils in Assembler gebaut, einfach nur aus Interesse und um etwas zu lernen. Der Größenunterschied zwischen glibc und meiner Entwicklung war enorm. (Einfache Mini-Progrämmchen bei glibc ca. 10KB, mit meiner Bibliothek hingegen knapp über 500 Byte.)

Ja wobei man hier dazu sagen muss für welchen Prozessor da hat jeder andere Befehle bis auf einge Standartbefehle wie mov jmp etc.

Für den AVR Assembler 1 Monat wobei ich vorher schon C konnte von da her wars nicht sonderlich schwer.

Nützen tut es eigentlich beinahe gar nichts mehr es sei denn man muss aktiv bestimmte Register des Prozessors beschreiben aber das wird auch schon meist über inline Assembler in C gelöst.

Ich sehe den Vorteil von Assembler eigentlich nur noch in der Lehre damit man 1:1 sieht was der Prozessor wirklich macht wenn man zb if i=0 then else schreibt.

Es gibt zwar noch die Möglichkeit in Assembler sehr schnellen Code zu schreiben durch die wachsende "intelligenz" der Compiler muss man aber den Prozessor schon sehr gut kennen, dass man da noch was rausholen könnte.

Wir hatten zumindest die Grundlagen während des Informatik-Studiums im Modul Rechnerorganisation. 

Man muss aber auch die Plattform angeben, der Befehlssatz ist für jeden Prozessor anders - wir haben Xilinx PicoBlaze genutzt

Es ist prinzipiell nicht schwer, nur anders ... 

Das Code lesen und verstehen sowie die Strukturierung kann (je nach Code) anstrengend sein, da es eben nicht so schön lesbar aufgebaut ist wie "normale" Programmiersprachen

Ich kann Assemler. Das habe ich vor 35 Jahren mal auf einem C64  gelernt.

Aber nützen tut es Dir nichts mehr.

Das sind alles nur Zahlen. Wenn man diese Sprache einigermaßen drauf hat, kann man sehen, was da im Computer passiert.

Das war früher gut, um Spiele zu knacken.

Aber heut zu Tage ist das alles viel zu komplex.

Lerne lieber C++ oder so, da hast Du mehr von.

Mario

Abtacha  01.10.2017, 15:41

Wenn man wirklich tief in Optimierung rein will ist das noch Hilfreich, für Spiele Engines und sowas, aber ansonsten meh. Das meiste ist ja eh schon durch andere optimiert, und das Rad zwei Mal erfinden ist auch Zeitverschwendung. :)

1

Habe im Rahmen des Studiums damit gearbeitet und es für die Klausur in 1 Woche gelernt. Ist aber praktisch kaum von nutzen und wird eh inzwischen meist von der Programmiersprache geregelt