Programmierkenntnisse in Assemblersprache erhalten [geschlossen]

8

Ich bin ein DSP, embedded Software-Programmierer, der meine Programmierkenntnisse in Assemblersprache verbessern möchte. Seit 7 Jahren schreibe ich in C, Matlab, etwas Assembler-Programmierung. (ARM-Baugruppe, DSP-Prozessor-Baugruppe).

Jetzt möchte ich meine Assembler-Programmierkenntnisse (es kann jede Assemblersprache sein, ist egal) durch ein großes Quantum verbessern und es auf eine Expertenebene bringen. Ich weiß, dass das Programmieren mehr darin wäre, aber was ich hier frage ist:

  • Die Erfahrung der Menschen in der Programmierung in Assemblersprachen (beliebig), die sie über Jahre in der Assemblersprache gesammelt haben.

  • Richtlinien, die Sie beim Lernen einer neuen Assemblersprache beachten sollten

  • Spezielle Tipps und Tricks, um effizient und korrekt in Assemblersprachen zu programmieren

  • Wie man einen gegebenen C-Code effizient in einen optimalen Assemblercode umwandelt

  • Wie man einen gegebenen Assembler-Code klar versteht

  • Wie verfolgt man die Register, die Operanden enthalten, Stackpointer, Programmzähler, wie man die zugrundeliegende Architektur und die Ressourcen, die es für einen Programmierer bereitstellt, näher versteht. p>

Grundsätzlich möchte ich einige "echte" Tipps von Leuten bekommen, die eine umfassende und intensive Assemblersprache programmiert haben.

Danke.

-AD

    
goldenmean 07.07.2010, 22:27
quelle

4 Antworten

6

Ein guter Ausgangspunkt wäre Jeff Deltemanns Buch Assembly Language Step-by-Step . Das Buch handelt von x86-Programmierung unter Linux. Soweit ich mich erinnere, hat eine frühere Version des Buches die Programmierung unter Windows behandelt. Es ist ein Anfängerbuch, in dem es am Anfang anfängt: Bits, Bytes, binäre Arithmetik, usw. Sie können diesen Teil überspringen, wenn Sie möchten, aber es könnte eine gute Idee sein, sie zumindest zu überfliegen.

Ich denke, der beste Weg, ASM-Codierung zu lernen, ist, 1) die Grundlagen der Hardware zu lernen und dann 2) den Code anderer zu studieren. Das Buch, das ich oben erwähnt habe, ist lohnenswert. Sie könnten auch interessiert sein an Die Kunst der Assembler-Programmierung .

Ich habe in meiner Zeit ziemlich viel Assembler programmiert, obwohl in den letzten 15 Jahren nicht viel. Ein Kommentator wies darauf hin, dass die geringen Größen- und Leistungsgewinne schwer zu rechtfertigen sind, wenn man die im Vergleich zu einer Hochsprache erhöhte Entwicklungs- und Wartungszeit berücksichtigt.

Das heißt, ich würde Sie nicht von Ihrem Streben abhalten, mit ASM effizienter zu werden. Sich mit der Funktionsweise eines Prozessors auf dieser Ebene vertraut zu machen, kann auch nur Ihre HLL-Programmierkenntnisse verbessern.

    
Jim Mischel 07.07.2010, 23:35
quelle
18

Meine Antwort ist allgemein ... schreibe einen Disassembler. Du hast ARM berührt, vielleicht kennst du alle ARM-Anweisungen, vielleicht nicht, was ist mit Daumen? ARM ist ein guter zu lernen mit dieser Methode, sowohl beliebte als auch feste Befehlslänge, so dass Sie linear von Anfang bis Ende zerlegen können.

Ich meine nicht, schreibe einen polierten Sourceforge-würdigen Disassembler, schreibe vielleicht 5 oder 10 Zeilen Assembler gleichzeitig, max, vielleicht die gleiche Anweisung mit verschiedenen Registern, gerade genug, um die Binärdatei mit einem kleinen Wenn-Dann-Else-Baum zu analysieren oder Schalter.

%Vor%

Ihr Ziel ist es, jedes Bit im Opcode zu untersuchen, zu verstehen, warum Sie nur 8-Bit-Unmittelbar haben können, zu verstehen, warum einige Prozessoren Sie nur 127 oder 128 Bytes für eine lokale bedingte Verzweigung springen lassen. Sie müssen keinen Disassembler dafür schreiben, aber für mich funktioniert es, um die Informationen in mein Gehirn einzubetten.

Um alle möglichen Opcodes / Anweisungen zu erstellen, um den Disassembler zu testen, lernen Sie alle Syntax-Nuancen für den Assembler, den Sie verwenden. Die Assemblersprache im Buch der Chiphersteller ist nicht unbedingt die exakte Syntax, die von jedem Assembler für diese Prozessorfamilie verwendet wird. Die mrc / mcr-Anweisungen (ARM) sind ein gutes Beispiel dafür. Insbesondere Gas ist bekannt für die schreckliche Arbeit, die es tut, um die Syntax zu ändern, was es schmerzhafter macht als die Syntax und die Werkzeuge der Chip-Firmen. Es hängt davon ab, was Sie zu tun versuchen, wenn Sie nur ein paar Zeilen codieren oder etwas modifizieren wollen, müssen Sie nicht jede Ecke oder Assembler-Funktion kennen, aber wenn Sie wirklich den Befehlssatz lernen wollen, empfehle ich diesen Ansatz .

Ich bin auch ein eingebetteter Softwareentwickler, der hauptsächlich C benutzt, aber täglich das C (mit objdump, nicht meine Tools) zerlegt, um die Ausgabe zu überprüfen und sicherzustellen, dass dieser Code in diesem Speicherbereich und dem Code hier ist, Linker-Zeug. Aber manchmal muss ich eine Simulation des Prozessors / Chips untersuchen und muss den Anweisungsabrufen und ihren zugehörigen I / O folgen, um den Code durch die Simulation zu verfolgen. Oder Debugging einer Platine mit einem Logikanalysator auf dem RAM oder einem anderen Bus. Ich habe viele verschiedene Prozessoren gelernt, 8, 16, 32, 64 Bit (und solche mit Registerlängen, die nicht in dieser Liste sind) cisc, risk, dsp und ein paar Mikromaschinen. Ich habe einen Disassembler für jeden von ihnen geschrieben (naja, bis auf pdp11 und x86, meine ersten beiden Befehlssätze), ich brauche vielleicht einen Nachmittag, um eine neue ISA zu lernen, sobald man ein paar von ihnen gesehen hat. Nein, es dauert ein oder zwei Tage, bis ich von einem, den ich seit Tagen / Wochen / Monaten täglich verwende, auf einen umschalte, den ich seit Monaten / Jahren nicht mehr benutzt habe. Ich denke nicht in allen Sprachen gleichzeitig.

Das Zerlegen von Instruktionen mit variabler Länge (die meisten Prozessoren da draußen), es wirklich richtig zu machen, ist eine Kunstform für sich und weit über das, worüber ich spreche, deshalb empfehle ich nur eine Handvoll Anweisungen auf einmal, betten Sie die Daten nicht in diese Anweisungen ein. Idealerweise verwenden Sie diese Methode, wenn Sie einen funktionierenden / guten Disassembler zur Hand haben, damit Sie Ihre Ausgabe mit dem echten meist getesteten und getesteten Disassembler vergleichen können.

Jenseits der Zerlegung, wenn Sie wirklich eifrig sind, ist das Schreiben eines Emulators eine gute Übung, wieder schreibe ich statt zu untersuchen. Viele Kerne haben Emulatoren, und du könntest sie nur untersuchen, anstatt deine eigenen zu schreiben. Was für mich funktioniert, funktioniert vielleicht nicht für dich. Ich habe nur ein paar davon geschrieben. Dies ist kein Nachmittags-Projekt, aber Sie verstehen tiefer, wie diese Prozessorfamilie funktioniert.

Welche Lernumgebung auch immer für Sie am besten ist, sei es Disassemblierung, Emulatoren, Einzelschritte durch einen gui-basierten ISA-Simulator, Bücher, Webseiten. Wenn Sie einen Assembler für einen oder mehrere Prozessoren lernen, wird Ihre High-Level-Programmierung definitiv besser. Auch wenn Sie Assembler eigentlich nie schreiben, sondern nur untersuchen. Schreiben Sie einen C-Code, der Arrays und Pointer und Strukturen und ohne Strukturen, Schleifen, entrollte Loops verwendet, kompilieren Sie diese mit verschiedenen Compiler-Optionen, mit und ohne Debugger-Stuff, ohne Optimierung, bis zur max / aggressiven Optimierung. (kompilieren Sie für verschiedene Prozessoren und vergleichen Sie die Unterschiede im Programmablauf, Anzahl der Anweisungen, etc. llvm ist dafür großartig).

Zusätzlich zu Ihrem höheren Programmierniveau erfahren Sie auch, welche Compiler gut und schlecht und durchschnittlich sind. Was für eine Whiz-Syntax sollte man vermeiden, auch wenn es Teil eines Standards ist und welche Syntax die meisten Compiler richtig verstehen. Ich empfehle Ihnen, so viele verschiedene Compiler wie möglich zu testen.

Ich empfehle sehr unterschiedliche Familien, die keine / weniger Inzucht haben. Ich erwähnte ARM / thumb (und thumb2), die definitiv Inzucht, aber beliebt sind und die Rechnungen bezahlen, damit Sie die anderen in Ihrer Freizeit lernen können. Geh zurück zum 6802 oder 68hc11, dem 8088 und / oder dem z80. Das alte Bild pic12 oder pic16 (das pic32 ist nur ein Mips). Mips, Strom pc, avr.Ich bin ein großer Fan des msp430-Instruktions-Sets, das sehr gut zu lernen ist, hatte ein pdp11-Gefühl, Compiler-freundlich, leider auf einen Nischenmarkt ausgerichtet. Die 8051, noch immer nicht tot, erstaunlich. Die älteren, die meisten von ihnen, haben Befehlssatz-Simulatoren in verschiedenen Formen (Mame zum Beispiel hat viele), so dass Sie diese Simulatoren nehmen und Speicher und Register drucken können, während Ihr Programm zum Beobachten und Lernen und Verbessern ausführt. Dann vergleichen Sie diese älteren mit moderneren. Sehen Sie, warum einige ISAs mit derselben Taktrate andere sprunghaft übertreffen, manche haben einen einzigen Akkumulator, ein Register, vielleicht zwei oder vier, und um etwas Nützliches zu tun, müssen Sie ständig laden und speichern, indem Sie mehrere Anweisungen für eine echte Operation nehmen . Wo etwas moderneres diese reale Operation in einem oder zwei oder drei Befehlen / Takten ausführt, indem einfach mehr Register oder generische Register anstelle von Registern für spezielle Zwecke vorhanden sind.

Ein fortgeschrittenes Thema sind Speicherzugriffe. Thumb (nicht thumb2) ist nicht so effizient wie ARM, es gibt einen deutlichen Overhead, 5-10% mehr Anweisungen für die gleiche Aufgabe, also warum ist der Daumen bei einem GameBoy Advance wesentlich schneller? Antwort, meist 16 Bit Speicherbusse mit Nicht-Null-Wartezustandsspeicher. Der GBA hat keinen Cache, hat aber einen Prefetch-Deal auf der ROM-Schnittstelle, und das ROM-Timing ist nichtlinear, das erste Lesen ist N Takte und das Lesen von sequentiellen Adressen, die folgen, sind M Takte (M ist kleiner als N) macht rom schneller ausführen als ram). Wenn Sie dies nicht wissen, kann dies für Ihr eingebettetes Programm für diese und andere Plattformen den Unterschied zwischen Erfolg und Misserfolg ausmachen. geht weit über das Verständnis der Assemblersprache hinaus, aber Sie können nicht dorthin gelangen, ohne die Ausgabe des Compilers lesen und verstehen zu können.

Ein weiteres fortgeschrittenes Thema sind Caches. Wenn Sie Zugriff auf etwas mit einem Cache haben und es ausschalten können (sagen Sie etwas aus gamepark ein gp32 oder wiz, ein älteres ipod, dass Sie Homebrew on tun können), etc. Idealerweise etwas Sie die Befehls- und Datencaches separat steuern können . Sie erhalten das Gefühl für eine ganz andere Art von Optimierung, es geht nicht mehr um die wenigsten Anweisungen mit den wenigsten Sprüngen / Verzweigungen und möglichst wenig Speicherzugriffe. Jetzt müssen Sie sich mit der Länge der Cache-Zeile befassen, in der die Anweisungen innerhalb dieser Cache-Zeile landen. Hinzufügen von einem, zwei, drei, manchmal mehr Nops am Anfang eines Programms (nicht wirklich, buchstäblich Hinzufügen eines NOP in Start.S) kann dramatisch verbessern oder ruinieren die Leistung eines Programms von der gleichen (höhere Ebene) Quelle, Compiler generiert und Optimierungseinstellungen. Ich muss die Anweisungen lesen und die Hardware verstehen, um zu sehen, warum.

Ihre Fragen speziell:

-People Erfahrung in der Programmierung in Assemblersprachen (beliebig), die sie über Jahre in Assembler-Programmiersprachen gesammelt haben.

siehe oben

-Richtlinien, die Sie beim Lernen einer neuen Assemblersprache beachten sollten

Siehe oben. Glauben Sie, dass Prozessoren ähnlicher als anders sind, sie laden und speichern Register, verzweigen bedingungslos und bedingt. Die gleiche Handvoll bedingter Verzweigungen sind bekannt und werden verwendet. Suchen Sie zuerst nach den allgemeinen Anweisungen, laden Sie sofort, wechseln Sie von einem Register zum nächsten, registrieren Sie sich auf add und, oder, xor. Nicht alle Prozessoren haben eine Division-Anweisung, die meisten nicht, einige haben keine Multiplikation, mehr als Sie denken. Und die meisten, die Sie nicht generisch verwenden können, wenn die Operanden und das Ergebnis einer Multiplikation alle das gleiche Größenregister haben, dann werden viele Kombinationen von Operanden das Ergebnis überlaufen lassen.

-Spezifische Tipps und Tricks, um effizient und korrekt in Assemblersprachen zu programmieren

Fahren Sie die Mitte der Straße hinunter, kommen Sie nicht in coole Tricks, die spezifisch für diesen Assembler / Compiler sind, oder gee whiz Features einer Sprache. Halten Sie es einfach, einige meiner 20 Jahre alten C-Code kompiliert noch heute auf vielen Compilern. Ich finde Code oft ein paar Jahre oder weniger alt in der Welt, die nicht heute kompiliert wird, muss ständig beibehalten werden, um die gleiche Funktion mit neuen Compilern durchzuführen, einfach wegen Compiler- oder Sprachtricks.

- Wie man einen gegebenen C-Code effizient in einen optimalen Assembler-Code umwandelt

Beginnen Sie mit C oder anderen, und kompilieren und disassemblieren Sie, vielleicht ein paar Ebenen der Optimierung, vielleicht ein paar verschiedene Compiler. Dann repariere einfach die Probleme. Das ist eine lustige Aufgabe, aber du fällst wirklich in diese Gee-Whizz-Falle. Häufig ist es nicht wert, dass Sie den Assembler mit dem C herumtragen und Sie in eine nicht portable Situation versetzen, oder in eine Situation, in der der Compiler aufholen kann, dass Sie 1, 2 oder 7 Anweisungen von 5 oder 10 oder 20 speichern die nächste Version oder zwei, und sogar Ihre Fähigkeiten übertreffen, weil sie mehr über die Anweisungen und wie man sie benutzt, als Sie wissen.

Wo ich Assembler am meisten benutze (außer natürlich booten) ist eigentlich zum Lesen und Schreiben von Registern oder Speicherplätzen.Jeder Compiler, den ich verwendet habe, hat zu einem bestimmten Zeitpunkt die richtige Anweisung nicht bekommen, einen 32-Bit-Speicher durch ein 8-Bit ersetzt, so etwas. Ich verschwende tatsächlich Anweisungen und Uhren, um Peek- und Poke-Routinen in Assembler zu implementieren, um sicherzustellen, dass der Compiler mich nicht begraben wird. Speicherkopien und solche Dinge sind im Allgemeinen wirklich gut (in C-Bibliotheken), aber es sind Orte, an denen Sie einen Befehlssatz nutzen können. Nutzen Sie spezielle Anweisungen, die nicht Teil der von Ihnen verwendeten Sprache sind, Bit-Tests oder Bit-Set (die der Compiler nicht erkennt / optimiert). Byte-Swapping, wenn Sie einen Byte- oder Halfword-Tauschbefehl haben. Bestimmte rotiert oder verschiebt oder signiert Erweiterungen.

Wenn Sie es finden können, ist es als Teil des schwarzen Buches, Michael Abrash, Zen of Assembly, kostenlos da draußen. Messen Sie die Ausführungszeit und testen, testen, testen. Egal, wie gut Sie denken, dass Sie die Stoppuhr sind, zeigt den echten Gewinner. Hardware hat die Hälfte seiner Lehren eliminiert, aber der Denkprozess und die Tiefe der Untersuchung des Codes auf dieser Detailebene (ich habe das Originalbuch im Druck BTW), später wurden Zeitschriftenartikel in die Super-Scaler-Prozessoren und einfach neu arrangiert einige Anweisungen, so dass sie erkannt und an separate Ausführungseinheiten übergeben werden konnten, die dieselben Anweisungen viel schneller ausführen ließen, waren interessant zu lesen und zu verstehen. Auch hier ist wieder viel davon durch Pipelines, mehr Ausführungseinheiten, Parallelverarbeitung, schnellere Uhren in den Lärm eingegraben. Tatsächlich ist alles ein Ergebnis von schrecklichen Programmiersprachen, die so ineffizient sind, dass die Hardware dies kompensieren muss. Aber es macht uns noch mehr Spaß, wenn wir dieselbe Operation viele tausend bis zehntausend Mal schneller durchführen können als unsere Kollegen.

Es ist sehr, sehr einfach, sich mit dieser Aktivität in den Fuß zu schießen (Verbesserung der C-Ausgabe mit Assembler), Vorsicht ist geboten. Du wurdest gewarnt.

- Wie man einen gegebenen Assemblercode klar versteht

Das ist der Punkt der Übung. Wenn Sie Ihren eigenen Assembler schreiben und mitten auf der Straße fahren, gibt es eine Untergruppe populärer Anweisungen, die leicht zu lesen und zu schreiben sind. Sie kennen sie gut. Sie nehmen Compiler generierte Anweisungen und versuchen, sie zu untersuchen, das ist schwieriger, der Disassembler ist so viel Hilfe / Problem wie der Code, der generiert wurde. Nehmen Sie alte, von Hand in Assembler oder Maschinencode geschriebene Spielroms, noch härter.

- Wie verfolgt man die Register, die Operanden enthalten, Stackpointer, Programmzähler, wie man die zugrundeliegende Architektur und die Ressourcen, die es für einen Programmierer bereitstellt, näher versteht.

Dies liegt oft außerhalb des Assemblers, Sie müssen Pipelines, Prefetching, Zweigschatten, Caches, Schreibpuffer, Speicherbusse, Wartezyklen verstehen.

Eine weitere Antwort, je nachdem, was Sie hier wirklich gefragt haben, ist, die Compiler Calling Konvention zu kennen, sind die Operanden für eine Funktion in r0, r1, r2 gespeichert ... und wenn ja, wie viele sind in Registern, bevor sie auf die gehen Stapel. Setzt dieser Compiler alles auf den Stapel? Sind die Flags auch auf dem Stack gespeichert? Wo ist die Absenderadresse gespeichert? Diese KAN variieren von verschiedenen Compilern für dasselbe Ziel wie im x86 in den alten Tagen (Zortech / Watcom gegen Microsoft / Borland), oder für denselben Prozessor für denselben Compiler wie wir es in modernen Zeiten sehen (ABI und EABI). Moderne Zeiten, die Sie finden können, eine Schnittstelle wird von jemandem entworfen und definiert (die Chip-Firma selbst?) Und verschiedene Compiler erfüllen diesen Standard aus verschiedenen Gründen, Portabilität, Marketing, Faulheit, etc. Ich finde, die Demontage zu untersuchen und in der Mitte herunter zu fahren Auf der Straße können Sie die Aufrufkonventionen herausfinden, ohne eine Spezifikation lesen zu müssen.

Ich lernte die Assemblersprache schon früh und oft zum Ärger meiner Kollegen tendiere ich dazu, generische Variablen in meinem C wiederzuverwenden, als ob ich Assembler schreiben würde. So ist es für mich selbstverständlich, den Überblick darüber zu behalten, welche Daten in welcher Variablen zu welchem ​​Zeitpunkt im Programm gespeichert sind. Ymmv. Während ich jemandes Assembler- oder Compiler-Ausgabe analysiere, werde ich diese Ausgabe innerhalb des Texteditors, den ich benutze, um es zu lesen, hacken. Setzen Sie visuelle Leerzeichen, Leerzeilen zwischen Funktionsblöcken, machen Sie nach jeder Anweisung Kommentare darüber, was sich jetzt in einem Register befindet, r0 enthält die Indexnummer in einer Tabelle, r1 enthält nun den Wortversatz dieses Elements in der Tabelle, r0 enthält jetzt die physikalische Adresse dieses Elements in der Tabelle, r2 hält nun das Element selbst aus der Tabelle usw.

viel Glück, viel Spaß, Entschuldigung für die wirklich lange Antwort.

    
old_timer 08.07.2010 05:34
quelle
1

Das ist eine ziemlich breite Frage, aber ich habe vielleicht ein paar Leckerbissen für Sie. Ich habe (in der Reihenfolge des Aussehens) BAL (IBM 360 Assembly), 8080A / 8085, 8086/8088/80186, einen Hauch der 68000 (aber nicht viel, wirklich) und 80960 Assembly Languages, plus ein bisschen Sparc ( obwohl es für eine Klasse in der Universität war, so erinnere ich mich nicht an Details). Meine Stärke waren immer eingebettete Systeme, obwohl ich in meinen späteren Jahren Webseiten mache und mit JavaScript-Verrücktheit ringe. Ich habe meine langjährige Assemblersprache genossen, nur keine Jobs für uns Alte ...

Ich habe ein paar Tipps für dich. Zuerst müssen Sie die Chip-Register lernen; wofür jedes benutzt wird, ist es ein spezieller Zweck des allgemeinen Zwecks, Fließkomma-Mathe, usw. Zweitens, die Markierungsfahnen; Welcher Test löst die Flags aus und findet an dieser Stelle die Anweisungen, die diese Flags setzen UND löschen. Sie sind normalerweise einfach, wie CLC ('clear the carry' - 8086/88/186). Finden Sie heraus, ob der Chip groß oder ein kleiner Endian ist, das ist die Reihenfolge der Bits von links nach rechts ist hoch zu niedrig oder umgekehrt.

Die Bitmanövrierbefehle sind auch wichtig, z. ODER, XOR, Durchschalten der Übertragsflag usw.

Und dann gibt es das Schreiben in und aus der Erinnerung; Wie funktioniert die Assembler-Sprache Ihres Chips? Kannst du direkt in den Speicher schreiben? Sehr abhängig von Ihrer Hardware-Konfiguration. Befehle zum Schreiben von Sofortwerten in Register? Weil Sie im Grunde Datenbewegung machen: zwischen Registern und Speicher. Ist die Speicheradresse flach (hoffentlich) oder segmentiert (aiiiiigh!).

Wenn Sie Timing-Probleme haben, da Sie Ihren Code schreiben müssen, um keine zu verschwenden, müssen Sie ein Testframework als solches einrichten. Protokolliere Anfangszeit, Protokollierungszeit und deinen Code dazwischen. Mein ganzer Grund, die Sprache der Assembly zu lernen, war, dass du damals in der Versammlung geschrieben hast, wenn du schnell gehen wolltest.

Um zu beginnen, schreiben Sie kurze, Testversionen, bevor Sie sich voll mit dem Schreiben von großen befassen. Finde heraus, wie du feststellen wirst, ob die Ergebnisse erzielt werden (nicht alles hat eine LED auf, die das Leben leichter macht). Ich habe einen Analysator benutzt; eingebettete Systeme sind nicht immer visuell. Machen Sie zuerst kleine Schritte.

Wenn Sie einen Compiler haben, sehen Sie sich den Assembly-Code an, der für Ihren speziellen Chip generiert wurde. Probieren Sie eine kleine C-Funktion aus, um 2 Zahlen hinzuzufügen, und sehen Sie sich den generierten Code an. Sie werden dadurch viel lernen. Lassen Sie sich nicht von den Assembler-Anweisungen überwältigen

Ich spreche hier weiter, und ich denke, Sie haben die Idee. Fangen Sie klein an, testen Sie, lernen Sie den Chip, stellen Sie sicher, dass die Ingenieure Ihnen die Orte zur Verfügung stellen, an die Sie schreiben und schreiben können. Und weiter geht es ...

Wie auch immer, viel Glück. Ich lernte, weil wir mussten, und ich mochte es sehr. Ich wurde sehr gut in der Optimierung (ich mochte Michael Abrashs "Zen of Assembly Language"), aber die Compiler für Intel-Chips wurden sehr optimiert, so dass Assembler-Programmiersprachen im Allgemeinen nicht benötigt werden. Genießen!

    
S.E. Foulk 06.11.2014 08:06
quelle
0

Der beste Weg besteht darin, C-Dateien zu kompilieren und die Ausgabe anzusehen und nach der Dokumentation der Anweisungen zu suchen, die Sie nicht kennen. Die Erfahrung wird mit der Zeit kommen ...

    
Quonux 10.07.2010 22:22
quelle

Tags und Links