Probleme mit Stack-Segment
-
Hallo,
ich habe ein Problem, wenn ich ein Stack-Segment setze:mov ax, 0xF000 mov ss, ax mov sp, 0xFFFF push 0x1 pop ax
Nach push 0x1 steht eben dieser Wert nicht auf dem Stack. Nach pop ax enthaelt ax den vermutlich zufaelligen Wert 0xfc00. Setze ich das Stack Segment ss auf 0 funktioniert hingegen alles korrekt und wie erwartet.
Ist alles 16bit und RealMode; getestet mit Bochs. Mit dem A20-Gate kann das doch nicht zu tun haben? Und 0xFFFFF sollte doch auch so in Ordnung sein als Beginn für einen Stack?
Jemand 'ne Idee?stackloser
-
Wenn, wie ich annehme, Bochs ROM korrekt, emuliert dürftest du hier versuchen, das BIOS für den Stack zu verwenden. Das muss natürlich schiefgehen.
Selbst wenn eine nicht-PC-Architektur verwendet würde, sollte es nicht funktionieren. FFFF:0000 ist die Einsprungadresse bei reset, also dürfte sich in diesem Bereich immer ein ROM befinden.
-
Zunaechst mal sind unausgerichtete Adressen im Stack-Pointer denkbar unguenstig (ineffizienter Speicherzugriff) und daher im Speziellen ungerade Adressen zudem auch reichlich sinnfrei, da das kleinste Datum auf dem Stack wenigstens 16Bit hat.
Wenn du den Stapel anfangs an das obere Ende eines 64K-Segments haengen willst, setze sp auf 0. Da beim Ablegen von Daten auf dem x86-Stack immer zuerst sp dekrementiert und dann gespeichert wird, landet das erste Datum nach Ueberlauf von sp am oberen Ende des Segments. Ansonsten ziehe ein Word ab und initielisiere sp zB. mit FFFE.
Zu deiner darueber hinaus speziellen Platzierungsidee hat camper schon genug gesagt. Normalerweise geht der nutzbare RAM im Realmode von 00400 (davor ist die IVT) bis a0000 (dahinter ist der VGA-Speicher der Grafikkarte und dahinter shadows vom BIOS, bzw. das ROM).
-
Danke für die Antworten.
-
Ist zwar auf englisch, aber eventuell für dich interessant.
http://wiki.osdev.org/Memory_Map_(x86)#Overview
Das ist die Memorymap für x86, also dem PC. Da stehen die Bereiche, welche du benutzen kannst, welche nicht, und welche unter bestimten Voraussetzungen benutzbar sind.