Wenn Sie sich dazu entschließen, ein bisschen Assembler zu lernen, sollten Sie wahrscheinlich 6502 Assembler auf einem Commodore 64 (natürlich emuliert) oder 68000 auf einem Amiga lernen.
Hier können Sie sich einen Eindruck vom Commodore 64 verschaffen ...
http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main
Das klassische Alles-was-Sie-wissen-müssen-Buch ist das hier beschriebene ...
http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/
Sie können wahrscheinlich einen PDF-Scan finden, wenn Sie sich umschauen.
IMO, 6502 ist einfacher als Z80 und 68000 ist einfacher als 8086 - regelmäßigere Befehlssätze usw.
Die CPU ist jedoch nur ein Aspekt der Hardware. Auch eine moderne CPU ist ein ganz anderes Biest und erledigt Dinge, die auch aus der Sicht von Compilern transparent sind - wie das Präsentieren eines virtuellen Adressraums.
Ein besonderer Vorteil des 6502 auf dem C64 ist, dass nicht nur die CPU einfach ist, sondern es auch einige sehr einfach gibt, mit Hardware umzugehen. Früher hatte ich großen Spaß daran, mit dem SID-Musikchip herumzuspielen.
Also - es ist wahrscheinlich eine lohnende Übung, wenn Sie nicht zu viel Zeit damit verbringen. Ich habe 6502 Assembler als meine zweite Sprache gelernt, als ich ungefähr 14 Jahre alt war, direkt nach Commodore Basic. Meist geht es jedoch um ein sehr einfaches Arbeitsmodell, mit dem Sie mit einem Minimum an Missverständnissen komplexere Ideen hinzufügen können.
Einige nützliche Dinge, die Sie in Assembler lernen können ...
- Wie CPU-Register funktionieren.
- Funktionsweise der Speicheradressierung, einschließlich Indirektion
- So funktioniert der CPU-Stack
- Wie bitweise Logik funktioniert.
- Wie die CPU E / A-Geräte steuert.
- Wie funktionieren Interrupts?
Ein besonderer Grund, warum ich es empfehlen würde, ist, eine bessere Vorstellung davon zu bekommen, wie einfache Schritte völlig deterministisch und mechanisch und völlig ohne Intelligenz oder gesunden Menschenverstand funktionieren. Grundsätzlich gewöhnt man sich an das imperative Ausführungsmodell in seiner reinsten und eigensinnigsten Form.
Genau wie nützlich es die meisten dieser Dinge jetzt zu wissen , ist, obwohl, ist eine schwierige Frage.
Eine Sache, die Sie nicht lernen werden, ist, wie Sie gut mit einer Erinnerungserbschaft umgehen können. Diese alten Maschinen hatten meist ein einfaches Speichermodell ohne Cache-Schichten und ohne virtuellen Speicher. Sie werden auch nicht viel über Parallelität lernen - sie waren sicherlich Möglichkeiten, damit umzugehen, aber es bedeutete meistens Unterbrechungen. Sie mussten sich nicht um Mutexe usw. kümmern.
Manchmal kann ein mentales Modell, wie diese Dinge einst funktionierten oder wie der Assembler funktioniert, sogar irreführen. Wenn Sie sich beispielsweise einen C-Zeiger als Adresse vorstellen, kann dies zu undefinierten Verhaltensproblemen führen. Ein Wechselstromzeiger wird normalerweise als Ganzzahl implementiert, die eine Adresse enthält, es gibt jedoch keine Garantie dafür, dass dies strikt zutrifft. Beispielsweise können auf einigen bizarren Plattformen unterschiedliche Zeiger auf unterschiedliche Adressräume verweisen. Dies ist wichtig, wenn Sie mit zwei Zeigern arithmetisch oder bitweise logisch arbeiten möchten.
Wenn Sie nicht über eine dieser bizarren Plattformen verfügen, denken Sie vielleicht nicht, dass Ihnen das etwas ausmacht - aber Compiler nutzen heutzutage immer häufiger undefiniertes Verhalten von Standards zur Optimierung aus.
Ein mentales Modell der Systemarchitektur kann also nützlich sein, aber es ist immer noch wichtig, auf die Sprachspezifikation zu codieren, nicht auf ein hypothetisches Modell, das Ihre Sprache und Plattform möglicherweise nicht berücksichtigt.
Eine Menge nützlicher Gedankenmodelle entstehen schließlich, wenn man sich ein Bild davon macht, wie Compiler Code generieren - und die Codegenerierung für moderne Sprachen unterscheidet sich stark von den damals erhältlichen, recht trivialen Compilern.
Dies ist ein Lieblingsbuch von mir dafür ...
http://dickgrune.com/Books/MCD_1st_Edition/
Neben den Themen Parsing und ASTs usw. wird die Codegenerierung für eine Reihe von Sprachparadigmen behandelt - Imperativ, OOP, Funktional, Logik, Parallel und Verteilt - sowie für die Speicherverwaltung. Wenn Sie wissen möchten, wie polymorphe Methodenaufrufe funktionieren, ohne sich in den Details des CPU-Befehlssatzes zu verlieren, ist ein Buch wie dieses Ihr Freund - und in Kürze ist eine neue Ausgabe erhältlich.