2013-04-06 19 views
5

Hallo Ich lese eine Anleitung auf X 86 von der University of Virginia und es besagt, dass das Drücken und Öffnen des Stapels entfernt oder fügt ein 4-Byte-Datenelement zum Stapel.x86 Kann push/pop kleiner als 4 Bytes sein?

Warum ist dies auf 4 Bytes eingestellt? Kann dies geändert werden, könnten Sie Speicher auf dem Stack speichern, indem Sie auf kleinere Datenelemente drücken?

Der Leitfaden kann hier gefunden werden, wenn jemand es sehen will: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

Diese Aussage trifft nur im 32-Bit-Modus zu, und Sie können auch 2 Byte drücken Elemente. – harold

Antwort

7

Kurze Antwort: Ja, 16 oder 32 Bit. Und, für x86-64, 64 Bits.

Der Hauptgrund für einen Stapel besteht darin, von verschachtelten Funktionsaufrufen zurückzukehren und Registerwerte zu speichern/wiederherzustellen. Es wird normalerweise auch verwendet, um Parameter zu übergeben und Funktionsergebnisse zurückzugeben. Mit Ausnahme der kleinsten Parameter haben diese Elemente normalerweise die gleiche Größe durch das Design des Prozessors, nämlich die Größe des Befehlszeigerregisters. Für 8088/8086 ist es 16-Bit. Für 80386 und Nachfolger sind es 32 Bits. Daher ist es wenig sinnvoll, Stapelanweisungen zu verwenden, die auf anderen Größen funktionieren.

Es gibt auch die Berücksichtigung der Größe der Daten auf dem Speicherbus. Es dauert genauso lange, ein Wort wie ein Byte abzurufen oder zu speichern. (Außer 8088, die 16-Bit-Register, aber einen 8-Bit-Datenbus hat.) Alignment kommt auch ins Spiel. Der Stapel sollte auf Wortgrenzen ausgerichtet sein, so dass jeder Wert als eine Speicheroperation abgerufen werden kann. Die Abwägung wird normalerweise vorgenommen, um Zeit gegenüber dem Speichern von Speicher zu sparen. Um ein Byte als Parameter zu übergeben, wird normalerweise ein Wort verwendet. (Oder, abhängig von der Optimierung, die dem Compiler zur Verfügung steht, wird ein Register mit einer Wortgröße verwendet, wobei der Stack vollständig vermieden wird.)

+9

In x86-64 können Sie keine 32-Bit-Register oder Werte im Speicher, nur 16- oder 64-Bit-Register und gespeicherte Werte verschieben. 'push ax',' push rax', 'push word [rax]' und 'push qword [rax]' sind gültige x86-64 Befehle, aber 'push eax' und' push dword [rax] 'sind nicht gültig in x86-64. – nrz

+0

Historische Anmerkung, das (sehr selten verwendete) 80188 (16-Bit-Wort, 8-Bit-Datenbus) und (etwas zeitweise beliebt) 386SX (32-Bit-Wort, 16-Bit-Datenbus) befanden sich im selben Boot wie der 8088 hinsichtlich der Datenbusgröße nicht übereinstimmt. –

+0

Für "Der Stapel sollte an Wortgrenzen ausgerichtet sein, damit jeder Wert als eine Speicheroperation abgerufen werden kann.", Gilt dies für lokale Variablen innerhalb einer Funktion? – Thomson

Verwandte Themen