Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cjreek am 03. June 2009, 23:25

Titel: Stack funktioniert nicht (rmode)
Beitrag 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

 :?
Titel: Re: Stack funktioniert nicht (rmode)
Beitrag von: Krendor am 03. June 2009, 23:38
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
Titel: Re: Stack funktioniert nicht (rmode)
Beitrag von: Jidder am 03. June 2009, 23:40
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.
Titel: Re: Stack funktioniert nicht (rmode)
Beitrag von: Cjreek am 03. June 2009, 23:45
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
Titel: Re: Stack funktioniert nicht (rmode)
Beitrag von: Cjreek am 03. June 2009, 23:51
Sorry für den Doppelpost..

Aber seltsamerweise funktioniert [sp+2] nicht. allerdings auch nur beim stackpointer. Erhalte beim compilieren folgende Meldung von nasm

Zitat
boot.asm:39: error: invalid effective address
Titel: Re: Stack funktioniert nicht (rmode)
Beitrag von: Jidder am 03. June 2009, 23:59
Jo, dann musst du sp in ein anderes Register laden.  bp bietet sich dafür an, weil es ebenfalls relativ zum Stacksegment (SS) adressiert.