2010-04-06 4 views
11

Ich bin gekommen, um zu erfahren, dass Sie ein Byte nicht direkt auf den Intel Pentium-Stack schieben können, kann mir das bitte jemand erklären?Warum ist es nicht möglich, ein Byte auf einen Stapel auf Pentium IA-32 zu schieben?

Der Grund, der mir gegeben wurde, ist, weil das ESP-Register wortadressierbar ist (oder, das ist die Annahme in unserem Modell) und es muss eine "gerade Adresse" sein. Ich hätte angenommen, dass die Dekrementierung des Wertes einer 32-Bit-Binärzahl nicht mit der Ausrichtung des Registers verwechselt werden würde, aber anscheinend verstehe ich nicht genug.

Ich habe einige NASM-Tests versucht und komme, dass, wenn ich eine Variable deklariere (Bite db 123) und es auf den Stapel schieben, ESP um 4 dekrementiert wird (anzeigend, dass es 32-Bits geschoben?). Aber "Push-Byte-Biss" (sorry für meine Wahl der Variablennamen) wird in einer Art Fehler führen:

test.asm: 10: Fehler: Nicht unterstützen Nicht-32-Bit-ELF Verlagerung

Jedes Wort von Weisheit würde in dieser unruhigen Zeit sehr geschätzt werden. Ich bin Student im ersten Studienjahr so ​​leid für meine Naivität in diesem Fall.

Antwort

4

Sein basiert auf, wie der Stapel erstellt wurde:

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

In non-64-bit modes: if the address-size and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is decremented by 4. If both attributes are 16, the 16-bit SP register (stack pointer) is decremented by 2.

Quelle: http://www.intel.com/Assets/PDF/manual/253667.pdf

pg. 4-320 Vol.

2B

bearbeiten

Ich wollte nur noch darauf hinweisen, dass eine interessante Lektüre der Abschnitt über die Stapel in der Anleitung ist, werden erklären, sie weiterhin ein Stapelsegment zu schaffen.

http://www.intel.com/Assets/PDF/manual/253665.pdf

Kapitel 6.2

+0

Sehr informativ, aber leider immer noch über dem, was ich mit meinem derzeitigen Wissen erfassen kann. –

+0

@Tim - verständlich. Vielleicht noch eine kurze Lektüre wert. –

+0

Warte, warte. Jeder Speicherplatz ist 32 Bit breit. Wenn Sie also einen Wert drücken, wird der Stapel um 4 Byte dekrementiert, weil 4 * 8 32 Bit ist und wenn er um 2 dekrementiert wird, würde er versuchen, einen nicht ausgerichteten Wert zu erreichen lesen, das Universum implodieren? Ist das richtig? Wenn ja, bekommst du die Punkte, dass PDF super war (2.). –

0

Der Stapelzeiger muss (aus Gründen der Optimierung) 4B ausgerichtet sein -> er sollte durch 4 teilbar sein (und daher die letzten 2 Bits Null haben).

+0

Während dies sinnvoll ist, Antwort Yully das erklärt es von unten nach oben. Danke trotzdem :) –

8

Dadurch wird der Stapelzeiger in manchen Fällen nicht in der Lage sein, seine Aufgabe zu erledigen. Nehmen wir zum Beispiel an, Sie hätten eine Funktion, die ein Byte auf den Stack geschoben hat und dann eine andere Funktion aufruft. Der Aufruf wird am Ende versuchen, eine falsch ausgerichtete Rücksprungadresse auf den Stapel zu schreiben, was zu einem Fehler führt.

+0

Perfekt, danke :) –

0

was Sie tun möchten, ist die Verwendung der Bit-Rotation Opcodes, um durch jede 32-Bit-Speicherstelle zu drehen, 8 Bits auf einmal in das Register, bis Sie zu den Start-Bit-Positionen zurückgedreht haben. Jetzt sollten Sie 4 8-Bit-Mengen nebeneinander in Ihrem 32-Bit-Register aufgereiht haben. Jetzt schieb das auf den Stapel und du bist fertig.

+0

Sorry, das macht mir nicht viel Sinn. –

Verwandte Themen