C/C++ - Assembler



  • Ich stelle fest, dass immer wieder Performance oder generierter Code daran gemessen wird, wie der generierte Assembler für bestimmte C++-Programme aussieht.

    Es scheint mir daher berechtigt, etwas Assembler zu lernen, um die prinzipiellen Dinge nachvollziehen zu können. Nicht zu viel, das würde zu viel Zeit beanspruchen...

    Ist das sinnvoll? Und wenn, gibt es Tutorials dafür?



  • Sone schrieb:

    Ist das sinnvoll?

    Ja, zumindest sollte man Assembler halbwegs lesen können und nicht schon bei Sachen wie Registern und indirekter Adressierung abschalten. Sehr hilfreich beim Debuggen, Optimieren oder Reverse-Engineering. Assembler schreiben ist dagegen was für Spezialisten.



  • Endlich mal ein Thread von meiner Lieblingsnervensäge



  • Bashar schrieb:

    Sone schrieb:

    Ist das sinnvoll?

    Ja, zumindest sollte man Assembler halbwegs lesen können und nicht schon bei Sachen wie Registern und indirekter Adressierung abschalten. Sehr hilfreich beim Debuggen, Optimieren oder Reverse-Engineering.

    Überzeugt.

    Assembler schreiben ist dagegen was für Spezialisten.

    Ja, schreiben habe ich nicht vor, nur lesen. Lesen wird helfen.

    Irgendwelche Vorschläge, wie ich das angehe? Ich habe bereits ein wenig Ahnung davon, Befehle wie mov/pop und Konsorten sind natürlich Standard, aber ich habe keine Ahnung, was bestimmte Register tun, und so weiter.



  • lernt man am besten indem man lernt in assembler ein paar dinge zu schreiben. verwendung praegt am besten.
    du musst nicht optimieren lernen, aber gerade beim x86/x64 gibt es dinge die man erfaehrt wenn man es selbst probiert (und auch erstmal falsch macht).

    also geh ein paar tutorials durch, aber nicht die alten dos dinger mit 16bit, etwas mit 32bit, denn dazwischen gibt es auch unterschiede und einige 16bit restriktionen sind heutzutage uninterresant.



  • Ich möchte aber kein falsches nehmen. Ist das hier passabel: http://andremueller.gmxhome.de/toc.html
    ?
    Edit: Nein, noch von DOS-Zeiten.



  • Bashar schrieb:

    Sone schrieb:

    Ist das sinnvoll?

    Ja, zumindest sollte man Assembler halbwegs lesen können und nicht schon bei Sachen wie Registern und indirekter Adressierung abschalten. Sehr hilfreich beim Debuggen, Optimieren oder Reverse-Engineering. Assembler schreiben ist dagegen was für Spezialisten.

    Ja, die Speziallisten waren damals 13-Jährige Buben, die das alles auch kaum vorhandener Fachliteratur gelernt haben. Tut doch nicht immer so als wäre Assembler sooo kompliziert. Es ist die einfachste Art einen Computer zu programmieren, nämlich so wie er wirklich funktioniert.



  • Sone schrieb:

    Ist das sinnvoll?

    Es ist sinnvoll, zuerst Assembler zu lernen und dann eine Hochsprache, genauso wie es sinnvoll ist, zuerst laufen zu lernen und dann Fahrrad fahren.

    Ein Tutorial habe ich gerade nicht, aber ein schönes Beispiel:

    http://www.cortstratton.org/articles/HugiCode.html



  • Von 90 Zykeln durch die Standard C++ Methode, bis zur handoptimierten Assembler-Lösung mit 17 Zykeln, ist schon ein gewaltiger Sprung. Assembler beschleunigt also nicht nur ein wenig, sondern bis zu VIER-fach!!! Es ist dann schon ein Unterschied ob ich eine Stunde auf mein Ergebnis warten muss, oder nur 15 Min.



  • dd++ schrieb:

    Sone schrieb:

    Ist das sinnvoll?

    Es ist sinnvoll, zuerst Assembler zu lernen und dann eine Hochsprache, genauso wie es sinnvoll ist, zuerst laufen zu lernen und dann Fahrrad fahren.

    Im Allgemeinen nicht.

    Deine Analogie entbehrt jeder Grundlage. So, wie es sinnvoll ist, zuerst Quantenpysik zu lernen und dann erst das Spiel mit Bauklötzchen?

    Ich bin mir echt nicht sicher, ob der überfrachtete C++-Sone oder der minimalistische ASM-Sone leichter zu ertragen wäre.



  • volkard schrieb:

    überfrachtete C++-Sone

    Ist das jetzt ein Kompliment? 😕

    Es ist sinnvoll, zuerst Assembler zu lernen und dann eine Hochsprache

    Hört sich schwachsinnig an.



  • heftigerUnterschied schrieb:

    Von 90 Zykeln durch die Standard C++ Methode, bis zur handoptimierten Assembler-Lösung mit 17 Zykeln, ist schon ein gewaltiger Sprung. Assembler beschleunigt also nicht nur ein wenig, sondern bis zu VIER-fach!!! Es ist dann schon ein Unterschied ob ich eine Stunde auf mein Ergebnis warten muss, oder nur 15 Min.

    Musst auch -O3 -march=native oder sowas angeben.



  • Sone schrieb:

    volkard schrieb:

    überfrachtete C++-Sone

    Ist das jetzt ein Kompliment? 😕

    Ich sag's mal ganz diplomatisch: Mit Dir möchte ich nicht in einem Team arbeiten.



  • dd++ schrieb:

    Sone schrieb:

    Ist das sinnvoll?

    Es ist sinnvoll, zuerst Assembler zu lernen und dann eine Hochsprache, genauso wie es sinnvoll ist, zuerst laufen zu lernen und dann Fahrrad fahren.

    Vorher sollte man natürlich erstmal Digitaltechnik verstehen, sonst hat man ja gar keine Grundlage.



  • Bashar schrieb:

    Vorher sollte man natürlich erstmal Digitaltechnik verstehen, sonst hat man ja gar keine Grundlage.

    Und die geht auch nicht ohne Quantenphysik.



  • heftigerUnterschied schrieb:

    Assembler beschleunigt also nicht nur ein wenig, sondern bis zu VIER-fach!!!

    Also aus einem Beispiel leitest du einen allgemeinen Faktor ab? Bullshit.

    Leider sind spezielle Befehlssaetze des Prozessor nur ueber ASM zugaenglich, bspw. SSE. Sollen diese Genutzt werden, muss entweder eine entsprechende Bibliothek genutzt werden oder eben inline-ASM.



  • volkard schrieb:

    Ich sag's mal ganz diplomatisch: Mit Dir möchte ich nicht in einem Team arbeiten.

    Wie genau kannst du das beurteilen, wenn du nie in einem Team mit mir gearbeitet hast?

    Vorher sollte man natürlich erstmal Digitaltechnik verstehen, sonst hat man ja gar keine Grundlage.

    Es stimmt aber vielleicht schon, dass man theoretischer Informatik einen kleinen Besuch abstatten sollte. So etwas wie Bitweises Und usw. ist doch wichtig.
    Edit:

    Und die geht auch nicht ohne Quantenphysik.

    Wenn das kein Sarkasmus war, dann bitte eine Erklärung.



  • theoretischer Informatik ... Bitweises Und usw. ist doch wichtig

    Koenntest du die Verbindung zwischen theoretischer Informatik und Bitweises (was immer das ist) herstellen. Ich verstehe es nicht.

    Wie genau kannst du das beurteilen, wenn du nie in einem Team mit mir gearbeitet hast?

    Man kann auch Dinge ablehnen, ohne sie jemals ausprobiert zu haben. Das ist voellig in Ordnung. Passiert bei jedem Einstellungsgespreach. Formelle und informelle Kriterien fuehren zur Akzeptanz oder Ausschluss des Bewerbers.



  • Bitte nicht krass abdriften, wenigstens einen Link zu einem Tutorial bitte bevor das zu einem ASM vs. C++ Thread wird... 🙂

    P.S.: Ich merk' schon, volkard mag' mich gar nicht leiden... 😞



  • knivil schrieb:

    theoretischer Informatik ... Bitweises Und usw. ist doch wichtig

    Koenntest du die Verbindung zwischen theoretischer Informatik und Bitweises (was immer das ist) herstellen. Ich verstehe es nicht.

    Ich weiß es jetzt auch nicht. Nach einem Buch von Galileo Computing, das ich gelesen habe, gibt es theoretische, technische, praktische und angewandte Informatik.

    Gehört Bitweises Und nun zur praktischen, also in dieselbe Sparte wie Programmieren? Ich dachte, das theoretische wäre die Mathematik hinter der Informatik. (Oder steht die Informatik hinter der Mathematik? :p)
    Und da nun mal das & eine Operation auf eine Folge von Ziffern ist, hört sich das sehr mathematisch an.


Anmelden zum Antworten