Intel X86-64 Montage-tutorials oder ein Buch
Ich habe versucht die Suche zu intel x64 assembly tutorials mit Beispielen oder ein gutes Buch, aber ich habe nicht gefunden, auch in der intel-Website.
so, Könnte Sie mir empfehlen eine gute tutorials oder ein Buch für die ??
Ich bin mit nasm unter linux.
Dank
- Ich weiß nicht, über nasm-tutorials, aber Sie können die Intel Software Developer Manuals, die Sie finden sollte, sehr hilfreich.
- Ein tutorial an intel.com? Das klingt wie ein schlechter Witz. Start mit Paul Carter ' s tutorial. Überraschend, basiert es auf NASM. Wenn Sie master 32-bit-Montage, wechseln Sie zum 64.
- Ich empfehle Introduction to 64 Bit Intel Assembly Language Programming for Linux von Ray Seyfarth. Das Buch verwendet YASM statt NASM, aber YASM akzeptiert AFAIK fast alle NASM-code und unterstützt auch DWARF2 debugging-Daten-format etc.. Das Buch hat einige SSE-und AVX-code zu, und es nimmt nur einige Programmier-hintergrund und erklärt sogar, binäre und hexadezimale zahlen usw. Ich habe gelernt, x86 assembly zurück in DOS-Tagen, aber das Buch dient als nützliche Referenz, wie die Dinge in der Linux-x86-64 Montage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zugegeben, es ist die persönliche Befangenheit, wie Sie lieber zu lernen über die Programmierung.
Aber mit Respekt zur Versammlung Sprachen im besonderen, fand ich einen Ansatz, der mir mehr als nützlich, reading instruction set reference manuals und/oder Bücher über Assembler (wo Sie existieren).
Was ich normalerweise tun, um herauszufinden, wie Montagearbeiten für eine neue CPU /ein CPU unbekannt, um mich auf eine OS-Plattform habe ich nicht gearbeitet und dennoch ist die Nutzung der developer-toolchain. So:
installieren Sie sich selbst ein (cross-)compiler und disassembler für die Ziel-CPU. In diesen Tagen, GNU gcc /binutils ubiquity oft bedeuten, dass die
gcc
undobjdump -d
.erstellen Sie eine Reihe von kleinen Programmen /kleine Stücke von sourcecode, wie:
kompilieren Sie diese mit compiler-Optimierung und zerlegen die generierte Objekt-code.
Die Struktur des Codes ist einfach genug, um zu zeigen, wie die ABI verhält wrt. zu Funktion aufrufen, Argumente übergeben und zurückgeben von Werten, Verwaltung des Registers Raum wrt. um die Register sind erhaltene /volatile machen, wenn Funktionsaufrufe. Es wird auch zeigen Ihnen einige grundlegende Assembler-code für die Initialisierung Konstante Daten, und "Kleber" wie stack-Zugriff und-Verwaltung.
erweitern diese für einfache C-Sprachkonstrukte wie Schleifen und
if
/else
oderswitch
Aussagen. Halten Sie immer einige Anrufe zu externen Undefinierte Funktionen, weil dies verhindert, dass der compiler optimizer werfen Sie alle Ihre "test-code" aus, und wenn Sieif()
tests vonswitch()
, Prädikat aufargc
(oder eine andere Funktion Argumente), weil der compiler nicht Vorhersagen kann, dass entweder (und damit zu optimieren, die Bausteine der code "unheimlich").erweitern diese für die Verwendung
struct {}
undclass {}
Definitionen mit Sequenzen von verschiedenen primitiven Datentypen, um heraus zu finden, wie der compiler ordnet diese im Speicher, die Montage-Anweisungen werden verwendet, um den Zugang bytes/Worte/ints/longs/Schwimmer usw.Alle diese Teile der test-code kann man gezielt variieren (wie andere Vorgänge als
+
), und/oder komplexer, um zu lernen, mehr über bestimmte Teile der Befehlssatz und die ABI.Nachdem Sie dies getan haben, und schaute auf den Ausgang, suchen Sie eine Kopie (elektronisch oder nicht) der Plattform ABI. Enthält das Regelwerk, wie das oben geschehen ist /warum es gemacht wird, die Art und Weise, und es wird Ihnen helfen, bekommen ein Gefühl dafür, warum diese Regeln gelten für die spezifische Plattform. Es ist wichtig, um eine Vorstellung über die da oben, wenn Sie schreiben Ihre eigenen Assembler-code, müssen Sie die Schnittstelle, die mit anderen non-Montage (es sei denn, für rein-demos). Das ist, wo Sie brauchen, nach den Regeln zu spielen, also auch wenn Sie weiß Sie nicht auswendig, zumindest wissen, wo die Anleitung ist.
Erst danach würde ich vorschlagen, Sie tatsächlich auf die Spur der Befehlssatz Referenz für die jeweilige Plattform.
Das ist, weil, wenn Sie gegangen sind, durch den oben genannten ersten, dann haben Sie schon genug Erfahrung mit /du hast schon genug gesehen, um zu starten mit einem kleinen C-Programm, kompilieren Sie es auf der Montage-Quelle ändern, dass ein wenig, montieren und verbinden Sie es und sehen, ob Ihre änderungen das tut, was es tun soll.
Versucht, auf die Bühne, etwas mehr ungewöhnlich /spezielle Anweisungen wird viel leichter sein, weil Sie gesehen haben, wie die Funktion aufrufen funktioniert, welche Art von glue-code ist notwendig, um die Schnittstelle Ihrer Montage mit anderen teilen des Programms, Sie habe bereits mit der toolchain, so dass Sie nicht brauchen, um zu starten, ganz von vorne mehr.
I. e., zusammenfassend diese alle, mein Vorschlag ist, zu lernen, Montage von die top-down - statt von unten nach oben.
Seite Hinweis:
Warum bin ich darauf hindeutet, verwenden compiler-Optimierung bei der Analyse der vom compiler generierten Assembler-code für solch einfache Beispiele ?
Nun, die Antwort ist da, counterintuitively, um einige der generierte Assembler-code ist viel einfacher, wenn man den compiler optimieren Sie die Hölle aus der Dinge. Ohne Optimierungen, die Compiler erzeugen oft "dumm" - code, z.B. setzt alle Variablen in den stack, speichert und stellt Sie von dort aus keinen Grund, dass Sie sehen können, hat register speichert/wiederherstellt/Initialisierungen nur zu überschreiben, dass reg die nächste Anweisung und viele weitere solche Dinge. Die Menge an code, die emittiert wird, ist viel viel größer, weil dieser. Es ist gespickt mit cruft und viel schwerer zu verstehen. Die compiler-Optimierung Kräfte trimmen diese Reste nach unten auf das wesentliche, ist das, was Sie sehen wollen, um zu verstehen, die Plattform ABI, und die assemnbly. Daher verwenden compiler-Optimierung.