Assembly - .data, .code und Register ...?
So bin ich heute morgen gepostet, eine verwirrte Frage über die Montage und ich erhielt einige große echte Hilfe, die ich wirklich zu schätzen.
Nun bin ich ab zu bekommen in der Montage-und fange an zu verstehen, wie es funktioniert.
Dinge, die ich fühle, ich verstehe okay umfassen den stack, interrupts, Binär/hex, und im Allgemeinen, was die meisten grundlegenden Operationen (jmp, push, mov, etc).
Konzepte, die ich bin kämpfen, um Sie zu verstehen und möchte mit helfen, sind unten - es wäre eine riesige Hilfe, wenn Sie könnten-Adresse eine der folgenden Optionen:
- Was genau ist passiert in der .data-Abschnitt? Sind die Variablen, die wir deklarieren?
- Wenn dem so ist, können wir Variablen deklarieren, die später in den code-Bereich? Wenn nicht, warum nicht? Wenn ja, wie, und warum verwenden wir die Daten Abschnitt dann?
- Was ist ein register? Wie tut es vergleichen, um eine variable? Ich meine, ich weiß, es ist ein Ort, speichert Sie ein kleines Stück von Informationen, die... aber das klingt genau wie eine variable zu mir.
- Wie erstelle ich ein array? Ich weiß, das scheint ziemlich zufällig, aber ich bin neugierig, wie würde ich gehen, etwas zu tun wie dieser.
- Gibt es irgendwo eine übersicht der gängigen Praktiken für das, was jedes register verwendet werden soll? Ich verstehe immer noch nicht vollständig, aber haben bemerkt, einige Leute sagen, zum Beispiel, dass ein bestimmter register sollte verwendet werden, um speichern 'Rückgabewerte' von Verfahren - ist es, eine umfassende oder zumindest informative Liste von solchen Praktiken?
- Einer der Gründe, ich ' m learning assembly, um besser zu verstehen, was passiert hinter meiner high-level-code. In diesem Sinne - wenn ich in c++ Programmieren, ich bin auch oft Gedanken über den stack und den heap. In Assembler weiß ich, was der stack ist - wo ist der 'Haufen'?
Einige Infos: ich benutze masm32 mit WinAsm als IDE, und ich arbeite auf Windows 7. Ich habe viel Vorherige Erfahrung in der Programmierung in höheren Sprachen wie c++/java.
edit: Danke für die Hilfe an alle, sehr informativ wie immer! Tolle Sachen! Eine Letzte Sache, obwohl ich Frage mich, was der Unterschied ist zwischen der Stack-Pointer und der Base-pointer, oder ESP und EBP. Kann mir jemand helfen?
edit: ich denke ich verstehe es jetzt... ESP zeigt immer auf die Spitze des Stapels. Sie können jedoch Punkt EBP an, was Sie wollen. ESP wird automatisch behandelt, aber Sie können tun, was Sie wollen mit EBP. Zum Beispiel:
push 6
push 5
push 4
mov EBP, ESP
push 3
push 2
In diesem Szenario EBP verweist nun auf die Adresse halten 4, aber ESP zeigt nun auf die Adresse Betrieb 2.
In einer realen Anwendung 6, 5, und 4 hätte eine Funktion Argumente, während 3 und 2 können lokale Variablen innerhalb der Funktion.
InformationsquelleAutor der Frage Cam | 2010-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns versuchen zu beantworten, in der Reihenfolge!
Den Daten-Bereich enthält alles, was Sie wollen, werden automatisch initialisiert, die für Sie durch das system, bevor es ruft den Einstiegspunkt Ihres Programms. Du hast Recht, normalerweise Globale Variablen am Ende hier. Null-initialisierte Daten ist generell nicht inbegriffen in die ausführbare Datei ist, da es keinen Grund gibt, hier ein paar Richtlinien, um den Programm-loader sind alle, die erforderlich ist, um zu erzeugen, dass der Raum. Sobald Ihr das Programm gestartet ist, die ZI und Datenbereiche sind in der Regel austauschbar. Wikipedia hat viel mehr Informationen.
Variablen, die nicht wirklich existieren, wenn Montage-Programmierung, zumindest nicht in dem Sinne, Sie tun, wenn Sie das schreiben von C-code. Alles, was Sie haben, sind die Entscheidungen, die Sie gemacht haben darüber, wie Sie das Layout Ihrer Erinnerung. Variablen werden auf dem stack, irgendwo im Speicher, oder einfach nur Leben nur in Registern.
Register werden die internen Daten-Speicher des Prozessors. Sie können im Allgemeinen nur Operationen, die auf Werte in den Prozessor-Registern. Sie können laden und speichern Sie deren Inhalt in und aus dem Speicher, das ist die grundlegende operation, wie Ihr computer funktioniert. Hier ist ein schnelles Beispiel. Dieser C-code:
Vielleicht bekommen einige übersetzte (vereinfacht), Montage entlang der Linien von:
In diesem Fall kann man sich die Register wie Variablen, aber im Allgemeinen ist es nicht notwendig, dass einer Variablen immer in die gleichen register geführt wird; je nachdem, wie kompliziert deine routine ist, kann es auch nicht möglich sein. Sie müssen schieben einige Daten auf den stack, pop anderen Daten aus, und so weiter. Eine 'variable' ist, dass der logische Teil der Daten, nicht dort, wo es lebt in Speicher oder Register usw..
Wird ein array nur einen zusammenhängenden block von Speicher für ein lokales array ist, können Sie nur dekrementiert den stack-pointer entsprechend. Für ein globales array ist, können Sie erklären, dass der block, in dem Daten-Abschnitt.
Gibt es eine Reihe von Konventionen über die Register - überprüfen Sie Ihre Plattform, das ABI oder Aufrufkonvention Dokument für weitere details über, wie man Sie richtig zu verwenden. Ihre assembler-Dokumentation haben könnten, Informationen sowie. Überprüfen Sie die ABI-Artikel auf wikipedia.
Ihre Assembler-Programm kann die gleiche system-Aufrufe C Programm könnte, so können Sie rufen Sie einfach
malloc()
um Speicher aus dem heap.InformationsquelleAutor der Antwort Carl Norum
Möchte ich hinzufügen. Programme auf einem computer sind in der Regel aufgeteilt in drei Abschnitte, obwohl es andere gibt.
Code - Segment .code .text : http://en.wikipedia.org/wiki/Code_segment
Daten - Segment .Daten : http://en.wikipedia.org/wiki/Data_segment
BSS : http://en.wikipedia.org/wiki/.bss
Registriert werden, wie beschrieben von anderen, Einrichtungen der CPU zum speichern von Daten oder eine Speicheradresse. Operationen auf Registern, wie
add eax, ebx
und abhängig von der Montage-Dialekt, das bedeutet verschiedene Dinge. In diesem Fall bedeutet dies, hinzufügen den Inhalt von ebx nach eax und speichern Sie es in eax (NASM-syntax). Die äquivalente in den GNU-AS (AT&T):movl $ebx, $eax
. Verschiedene Dialekte der Montage haben unterschiedliche Regeln und Operatoren. Ich bin kein fan von MASM aus diesem Grund ist es sehr unterschiedlich, sowohl in NASM, YASM und GNU AS.Gibt es nicht wirklich eine Allgemeine Interaktion mit C. ABI zu bezeichnen, wie dies geschieht; zum Beispiel auf x86 (unix) finden Sie eine Methode, die die Argumente auf dem Stapel, während in der x86-64 auf Unix-die ersten Argumente werden in Registern positioniert. Beide ABIs erwarten, dass das Ergebnis der Funktion gespeichert werden, eax/rax-register.
Hier ist eine 32-bit-add-routine, die versammelt sowohl für Windows und Linux.
Hier kannst du sehen, was ich meine. Die "return" - Wert gefunden wird in eax. Durch Kontrast, ist die x64-version würde so Aussehen:
Gibt es Dokumente, die definieren, diese Art der Sache. Hier ist die UNIX-x64 ABI: http://www.x86-64.org/documentation/abi-0.99.pdf. Ich bin sicher, dass Sie könnte wahrscheinlich finden, dass ABIs für jede Prozessor-Plattform etc, die Sie benötigt.
Wie Sie Sie betreiben, auf eine Reihe in der Montage? Zeiger-Arithmetik. Gegeben eine Basis-Adresse an
eax
den nächsten gespeicherten integer wäre bei[eax+4]
wenn der integer ist 4 bytes groß. Man konnte in diesem Raum ruft malloc/calloc, oder rufen Sie die memory allocation system call, was auch immer das ist) auf Ihrem system.Was ist der 'Haufen'? Laut wikipedia wieder, es ist der Bereich des reservierten Speichers für die dynamische Speicherverwaltung. Sie sehen es nicht in Ihr Assembler-Programm, bis Sie rufen calloc, malloc oder die Zuweisung von Speicher-system nennen, aber es ist da.
Sorry für den Aufsatz.
InformationsquelleAutor der Antwort