Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cjreek am 03. June 2009, 23:25
-
Hi,
Ich bins mal wieder :-D
Ich hab irgendwie ein Problem mit meinem Stack.... Beim poppen bekomm ich nur scheiße zurück -.-
Ich zeig euch mal etwas Code:
mov ax, 0 ; etwas ungünstig aber andere segmente gehn auch nicht
mov ss, ax
mov sp, 0xFFFF
jetzt der eigentliche Code:
mov dx,1
mov al,1
call floppy_read
; ...
floppy_read:
xor cx,cx
mov es,cx
mov bx,0x7E00
push dx
call lba_to_chs
; ...
ret
lba_to_chs:
pop ax
; Hier kommt nur müll raus ==> 0x7C5A statt 0x0001
; ...
ret
:?
-
Hihi, den Fehler hatte ich auch schon gemacht. :-D
Bei einem call wird die Rücksprungadresse auf den Stack gelegt.
Den Rest kannst du dir ja zusammen reimen...
Viele Grüße
Sebastian
-
0x7C5A ist die rücksprungadresse. Die wird von dem call auch auf den Stack gelegt.
Du kannst also mit pop nicht (brauchbar) auf den Parameter zugreifen, weil diese im Weg ist.
Stattdessen solltest du indirekt über sp auf den Stack zugreifen. In [sp] sollte die Rücksprungadresse liegen, und in [sp + 2] dann dein Parameter.
-
Argh -.-^^
Danke für die Aufklärung... 0x7C5A kam mir schon irgendwie verdächtig vor. Hat mich irgendwie an die Startadresse meines Codes erinnert :roll:
Auf die Idee mit der Rücksprungadresse bin ich natürlich nicht gekommen :-P
-
Sorry für den Doppelpost..
Aber seltsamerweise funktioniert [sp+2] nicht. allerdings auch nur beim stackpointer. Erhalte beim compilieren folgende Meldung von nasm
boot.asm:39: error: invalid effective address
-
Jo, dann musst du sp in ein anderes Register laden. bp bietet sich dafür an, weil es ebenfalls relativ zum Stacksegment (SS) adressiert.