Welche Funktion haben die Push / Pop-Anweisungen für Register in der x86-Assembly?
Beim Lesen über assembler habe ich oft über Menschen schreiben, dass Sie push eine bestimmte register des Prozessors und pop es später erneut, um es wieder den vorherigen Zustand.
- Wie können Sie schieben, ein register? Wo ist es her? Warum ist dies nötig?
- Macht das einkochen ein single-Prozessor-Anweisung, oder ist es eher Komplex?
InformationsquelleAutor der Frage Ars emble | 2011-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
schieben einen Wert (nicht unbedingt gespeichert in einem register) bedeutet das schreiben auf den stack.
knallen bedeutet das wiederherstellen, was auf der Spitze des Stacks in ein register. Das sind grundlegende Hinweise:
InformationsquelleAutor der Antwort Linus Kleen
Hier ist, wie Sie drücken Sie ein register. Ich nehme an, wir reden über x86.
Schieben Sie Sie auf den Stapel. Der Wert von
ESP
- register wird dekrementiert, um die Größe geschoben, Wert als stack wächst nach unten in die x86-Systeme.Es ist notwendig, um die Erhaltung der Werte. Die Allgemeine Verwendung ist
Einen
push
ist eine einzelne Anweisung in "x86", das macht zwei Dinge intern.ESP
registrieren.ESP
registrieren, um die Größe geschoben, Wert.InformationsquelleAutor der Antwort Madhur Ahuja
Wo ist es her?
esp - 4
. Genauer:esp
wird subtrahiert) von 4esp
pop
Umgekehrt.System-V-ABI sagt Linux zu machen
rsp
Punkt, um eine sinnvolle stack-Position, wenn das Programm beginnt zu laufen: https://stackoverflow.com/a/32967009/895245 das ist, was Sie sollten in der Regel verwenden.Wie können Sie schieben, ein register?
Minimal GNU-GAS Beispiel:
Den oben mit Behauptungen.
Warum ist dies nötig?
Es ist wahr, dass diese Anweisungen können leicht implementiert werden, die über
mov
add
undsub
.Sie Grund, warum Sie existieren, ist, dass diese Kombinationen von Anweisungen so Häufig, dass Intel sich dazu entschlossen, Sie für uns.
Den Grund, warum diese Kombinationen sind so Häufig, ist, dass Sie machen es einfach zu speichern und wiederherzustellen, die Werte von Register zu Speicher, so dass Sie nicht überschrieben werden.
Das problem zu verstehen, versuchen, kompilieren von C-code von hand.
Einer großen Schwierigkeit, zu entscheiden, wo die einzelnen Variablen gespeichert werden.
Idealerweise alle Variablen, die passen würde in Registern, das ist der Schnellste Speicher-Zugriff (derzeit über 100x schneller als RAM).
Aber natürlich können wir einfach mehr Variablen als Register, die speziell für die Argumente von verschachtelten Funktionen, so dass die einzige Lösung ist, um zu schreiben in den Speicher.
Könnten wir schreiben auf alle Speicher-Adresse, aber da die lokalen Variablen und Argumente der Funktion Aufrufe und gibt passen in einen schönen Stapel-Muster, die verhindert, dass Fragmentierung des Speichersdas ist der beste Weg, damit umzugehen. Vergleichen Sie das mit dem Wahnsinn des Schreibens ein heap-allocator.
Dann lassen wir den Compiler optimieren, das register allocation für uns, da das NP-vollständige, und einer der schwierigsten Teile beim schreiben eines Compilers. Dieses problem nennt sich register allocationund es ist isomorph zu graph-Färbung.
Wenn der compiler die Zuweisung ist gezwungen, Dinge zu speichern in Speicher statt nur registriert, dass bekannt ist wie eine spill.
Macht das einkochen ein single-Prozessor-Anweisung, oder ist es eher Komplex?
Alles, was wir sicher wissen ist, dass Intel Dokumente ein
push
und einpop
Unterricht, so dass Sie eine Anweisung in diesem Sinne.Intern, könnte es erweitert werden, um mehrere microcodes, einen zu ändern
esp
und einem zu tun, der Speicher IO und mehrere Zyklen.Aber es ist auch möglich, dass eine einzelne
push
ist schneller als eine gleichwertige Kombination von Instruktionen, da es spezifischer ist.Dies ist meist un(der)dokumentiert:
push
undpop
nehmen Sie eine einzige Mikro-operation.InformationsquelleAutor der Antwort Ciro Santilli 新疆改造中心 六四事件 法轮功
Fast alle CPUs verwenden-stack. Die Programm-stack ist LIFO Technik mit hardware-unterstützt zu verwalten.
Stack ist eine Menge von Programm - (RAM -) Speicher normalerweise zugewiesen, an der Spitze der CPU-Speicher auf dem heap und wachsen (bei PUSH-Befehl der stack-pointer wird verringert), in die entgegengesetzte Richtung. Ein standard-Begriff für das einfügen in den stack PUSH und für "aus Stapel entfernen" ist POP.
Stack verwaltet wird via stack vorgesehen, der CPU-register, die auch als stack-pointer, also wenn die CPU durchführen POP oder PUSH der stack-pointer laden/speichern, ein register oder eine Konstante in die stack-Speicher, und der stack-pointer wird automatisch verringert xor erhöhte sich nach Anzahl der Wörter oder geschoben poped in den (vom) stack.
Über assembler-Anweisungen, die wir speichern können, um stack:
Verfahren
Variablen
Variablen.
InformationsquelleAutor der Antwort GJ.
Schieben und knallen registriert sind hinter den kulissen entspricht:
Hinweis: dies ist x86-64-At&t-syntax.
Als ein paar, so können Sie speichern, ein register auf den stack legen und Sie später wiederherstellen. Es gibt andere Verwendungen, auch.
InformationsquelleAutor der Antwort gowrath