| Zeile 1: | Zeile 1: | ||
| − | Der Stack (=Kellerspeicher oder Stapel) ist eine der wichtigsten Datenstrukturen sowohl für Software als auch Hardware, da dieser | + | Der Stack (=Kellerspeicher oder Stapel) ist eine der wichtigsten Datenstrukturen sowohl für Software als auch Hardware, da dieser u. a. Parameter und Rücksprungadressen speichert. |
=== Funktionsweise === | === Funktionsweise === | ||
| Zeile 12: | Zeile 12: | ||
Die CPU bietet zwei Register zum Arbeiten mit dem Stack: | Die CPU bietet zwei Register zum Arbeiten mit dem Stack: | ||
*'''das SS-Register''' speichert das Stacksegment (im [[Real Mode]]) bzw. den Stackselektor (im [[Protected Mode]]). | *'''das SS-Register''' speichert das Stacksegment (im [[Real Mode]]) bzw. den Stackselektor (im [[Protected Mode]]). | ||
| − | *'''das ESP-Register''' (=StackPointer) zeigt auf das oberste Element des aktuellen Stacks. Die [[Real Mode]]Variante dieses Registers ist das SP-Register. | + | *'''das ESP-Register''' (=StackPointer) zeigt auf das oberste Element des aktuellen Stacks. Die [[Real Mode|Real-Mode]]-Variante dieses Registers ist das SP-Register. |
Zudem sind die Befehle PUSH und POP in die CPU integriert. Dabei ist zu beachten, '''dass der Stack von den höheren zu den niedrigeren Adressen wächst'''. | Zudem sind die Befehle PUSH und POP in die CPU integriert. Dabei ist zu beachten, '''dass der Stack von den höheren zu den niedrigeren Adressen wächst'''. | ||
| − | *Der PUSH-Befehl | + | *Der PUSH-Befehl vermindert den Wert von ESP um die Größe des Operanden und schreibt diesen an die Stelle, auf die das Register dann zeigt |
*Der POP-Befehl liest das Element, auf das ESP zeigt und erhöht das Register um die Operandengröße. | *Der POP-Befehl liest das Element, auf das ESP zeigt und erhöht das Register um die Operandengröße. | ||
| − | Das bedeutet, dass der Stack seine maximale Größe erreicht hat, wenn der Wert | + | Das bedeutet, dass der Stack seine maximale Größe erreicht hat, wenn der Wert 0 im ESP-Register steht. In diesem Fall wird ein [[Stackfault]] ausgelöst. |
=== Das EPB-Register === | === Das EPB-Register === | ||
| Zeile 42: | Zeile 42: | ||
|popf | |popf | ||
|liest das EFLAGS-Register vom Stack | |liest das EFLAGS-Register vom Stack | ||
| + | |- | ||
| + | |pusha | ||
| + | |legt alle "allgemeinen" Register (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) auf den Stack | ||
| + | |- | ||
| + | |popa | ||
| + | |Holt diese Register wieder vom Stack, wobei ESP übersprungen wird | ||
|- | |- | ||
|call | |call | ||
| Zeile 47: | Zeile 53: | ||
|- | |- | ||
|ret | |ret | ||
| + | | | ||
|- | |- | ||
|int | |int | ||
| Zeile 52: | Zeile 59: | ||
|- | |- | ||
|iret | |iret | ||
| + | | | ||
| + | |- | ||
| + | |enter | ||
| + | | | ||
| + | |- | ||
| + | |leave | ||
| | | | ||
|} | |} | ||