Stack initialisieren
-
Hallo,
ich hab da mal ne ganz blöde Frage: Wie muss ich denn beim booten des PCs (8086er CPU) den stack initialisieren? Also ich hab das bisher z.B. immer so gemacht:
mov ax,0x0070 mov ss,ax mov sp,0x1FF
Damit hab ich dann also nen stack der bei 0x0070:0x01FF anfängt und bei 0x0070:0x0000 aufhört (weil ja beim pushen sp verringert wird). Demzufolge wäre er dann 512 bytes groß... (Wenn ich mich irre, sagen!!)
Jetzt hab ich aber in einem Beitrag hier gelesen, dass man bp auch initialisieren muss... (http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=17&t=000544) Also hab ich mal gegoogelt aber überall wird der stack nur so initialisiert wie ich es mache...
--> Frage 1: Muss ich bp initialisieren oder net und wenn ja wie?
Ich hab festgestellt, dass das "normale" benutzen des stacks also mit push und pop wunderbar funktioniert... Sobald ich aber einen far call (nur bei far!) mache, berechnet ret die rücksprungaddresse irgendwie falsch... call und ret benutzen ja bekanntlich den stack...
--> Frage 2: Woran könnte das liegen?
Danke jetzt schonmal!
CU
[ Dieser Beitrag wurde am 06.04.2003 um 15:28 Uhr von Crax editiert. ]
-
Original erstellt von Crax:
**--> Frage 1: Muss ich bp initialisieren oder net und wenn ja wie?
**Nein, nur wenn du BP benutzen willst, musst dus auch initialisieren.
-
Hi.
Wie Du den stack initialisierst ist schon richtig. Wie bereits gesagt wurde, muss Bp nicht unbedingt "initialisiert" werden.
Aber ich wuerde empfehlen, einen geraden Wert in sp zu laden! Da koennten die Fehler mit dem far call und ret herruehren. (Dein Stack waere bei 01FFh auch hoechstens 511 Byte gross... und einzelne Byte-Werte nimmt der Stack ja bekanntlich net so gern auf)
-
Danke erstmal,
aber ich dachte die 0 zählt mit, daher wäre 1FF schon richtig... Also: 0 bis 511 sind 512 Zahlen... Deshalb sind die Segmente ja auch max 65536 Bytes (0x10000) groß und nicht 65536-1 (=0xFFFF), weil eben offset 0 mitzählt...
Oder stimmt das net und wenn ja warum?
CU
[ Dieser Beitrag wurde am 06.04.2003 um 19:20 Uhr von Crax editiert. ]
-
Ich habs eben trotzdem grad mal mit 0x200 probiert -> funktioniert auch net...
Und nochmal zu bp: wie müsste ich es denn initialisieren, ich meine wozu braucht man es eigentlich im Zusammenhang mit dem stack?
[ Dieser Beitrag wurde am 06.04.2003 um 19:26 Uhr von Crax editiert. ]
-
Den bp kannst du benutzen, um dir bestimmte Positionen aufm Stack zu merken, z.B. für irgendwelche Rückgabewerte aus einer Unterfunktion
mov bp, sp
mov bp, ax
...
-
Original erstellt von Crax:
**Danke erstmal,aber ich dachte die 0 zählt mit, daher wäre 1FF schon richtig... Also: 0 bis 511 sind 512 Zahlen... Deshalb sind die Segmente ja auch max 65536 Bytes (0x10000) groß und nicht 65536-1 (=0xFFFF), weil eben offset 0 mitzählt...
Oder stimmt das net und wenn ja warum?
CU
[ Dieser Beitrag wurde am 06.04.2003 um 19:20 Uhr von [qb]Crax** editiert. ][/QB]
Ich glaub da war ich geistig net ganz anwesend sry... Zwar sind 0 bis 1FF schon 512 zahlen, aber man kann schlecht von 1FF immer 2 abziehen ohne auf 1 zu kommen... Daher: 0x200 is besser
@geyken: THX
[ Dieser Beitrag wurde am 06.04.2003 um 19:41 Uhr von Crax editiert. ]
-
Original erstellt von Crax:
**Ich hab festgestellt, dass das "normale" benutzen des stacks also mit push und pop wunderbar funktioniert... Sobald ich aber einen far call (nur bei far!) mache, berechnet ret die rücksprungaddresse irgendwie falsch... call und ret benutzen ja bekanntlich den stack...--> Frage 2: Woran könnte das liegen?**
Es lag wohl doch nicht am stack sondern daran, dass man bei farcalls wohl besser retf benutzen sollte...