Wenn ich über Assembler lese, stoße ich oft auf Leute, die schreiben, dass sie ein bestimmtes Register des Prozessors pushen und später wieder pop, um den vorherigen Zustand wiederherzustellen.
Das Pushen eines Wertes (der nicht unbedingt in einem Register gespeichert ist) bedeutet, dass er auf den Stack geschrieben wird.
popping bedeutet, dass der Wert, der sich oben auf dem Stack befindet, in ein Register zurückgeschrieben wird. Das sind die grundlegenden Anweisungen:
push 0xdeadbeef ; push a value to the stack
pop eax ; eax is now 0xdeadbeef
; swap contents of registers
push eax
mov eax, ebx
pop ebx
Hier sehen Sie, wie Sie ein Register schieben. Ich nehme an, wir sprechen über x86.
push ebx
push eax
Es wird auf den Stack geschoben. Der Wert des `ESP'-Registers wird auf die Größe des gepushten Wertes dekrementiert, wenn der Stack in x86-Systemen nach unten wächst.
Dies ist notwendig, um die Werte zu erhalten. Die allgemeine Verwendung ist
push eax ; preserve the value of eax
call some_method ; some method is called which will put return value in eax
mov edx, eax ; move the return value to edx
pop eax ; restore original eax
Ein "push" ist ein einzelner Befehl in x86, der intern zwei Dinge tut.
ESP
-Registers.ESP
-Registers auf die Größe des gepushten Wertes.Fast alle CPUs verwenden Stack. Der Programmstapel ist eine LIFO-Technik mit hardwaregestützter Verwaltung.
Der Stack ist ein Teil des Programmspeichers (RAM), der normalerweise am oberen Ende des CPU-Speicherheaps zugewiesen wird und in entgegengesetzter Richtung wächst (bei der PUSH-Anweisung wird der Stack-Zeiger verringert). Ein Standardbegriff für das Einfügen in den Stack ist PUSH und für das Entfernen vom Stack ist POP.
Der Stapel wird über das für den Stapel vorgesehene CPU-Register verwaltet, das auch als Stapelzeiger bezeichnet wird. Wenn die CPU also POP oder PUSH ausführt, wird der Stapelzeiger ein Register oder eine Konstante in den Stapelspeicher laden/speichern, und der Stapelzeiger wird automatisch entsprechend der Anzahl der Wörter, die in den Stapel geschoben oder aus dem Stapel entfernt werden, verringert oder erhöht.
Mit Assembler-Befehlen können wir auf dem Stack speichern: