Stack Verständnis



  • wenn ich beispielsweise folgendes schreibe

    mov ss, 100h
    

    oder meinetwegen aush so:

    .STACK 100h
    

    Wo befindet sich dan der Stack?
    - Von 0h bis 100h?
    - Oder von 100h bis 200h?

    In meinem Buch steht nähmlich, das der Befehl push den SP dekrementiert (verringert) und pop den sp inkrementiert (erhöht). Dann müste der sp anfänglich ja den wert 100h haben. und wenn er voll ist den Wert 00h.



  • Hi.

    Erstmal:
    Deine beiden Codebeispiele haben nicht viel miteinander zu tun.

    Beim Ersten wird ss - wozu auch immer - auf 100h gesetzt. Dabei veraendert sich zumindest nichts an der Groesse des Stacks...
    Auf deine Frage, wo sich der Stack dann befindet: irgendwo zwischen 0100:0000 und 0100:FFFF (kommt auf den Wert von sp an).

    Beim 2. Codebeispiel weist du einen MASM-kompatiblen Assembler an, ein Stacksegment anzulegen, das 100h Byte fasst.
    Je nach gewaehltem Speichermodell wird MASM der Einfachheit halber nun beim Programmstart zB. sp auf 100h initialisieren (hast du ja schon richtig erkannt) und ss so setzen, dass es auf ein Speichersegment zeigt, dessen ersten 100h Byte ungenutzt sind.
    So kann dann im Programm ss:0000 bis ss:0100 vom Stack belegt werden.

    (PS: ich gehe davon aus, dass du im RealMode arbeitest, dh. unter DOS)



  • Mal sehen, ob ich es verstanden habe. Würde folgendes Codebeispiel den Stack auf eine größe von 256 Bytes setzen? Und währe das zweite Codebespiel mit dem ersten identisch?

    Code 1:

    org 00h
    cli
    mov ss, 00h
    mov sp, 100h
    sti
    

    Code 2:

    org 00h
    .stack 100h
    


  • .stack reserviert in einem extra-stack segment 256 Bytes und beim Programmstart werden SS und SP entsprechend initialisiert. beim zweiten setzt du SS und SP einfach ins blaue hinaus, gefährlich!! dann setzt die wenigstens auf einen existierenden bereich (stack DW 256 Dup(0) glaube ich), der so groß ist, allerdings SP dann auf das Ende davon, da der ja dekrementiert wird...

    scheiße erklärt, hab aber jetzt keine zeit... in 2 Minuten muss ich in CHemie sitzennn 🙂



  • Tjo, da hat Todo schon recht...
    Ich versuche es nur noch mal etwas ausfuehrlicher. 😃

    In beiden Beispielen haettest du nachher einen 256Byte grossen Stack - insofern stimmem die Codes ueberein, aber in Bsp 1 wuerdest du mit deinem Stack die InterruptVectorTabelle (von 0000:0000 bis 0000:0400) ueberschrieben. => solltest du besser sein lassen. 😉

    In deinem 2. Beispielcode wird dagegen gleich Speiche fuer ein Stacksegment reserviert.
    Linkst du den Code dann als .exe oder .com werden ss und sp zudem beim Programmstart vom Betriebssystem schon gesetzt, so dass du dich gar nicht mehr darum kuemmern musst.

    Zum besseren Verstaendnis:
    aequivalent zu deinem 2. Code waere ungefaehr dieses:

    Segment Stapel ;beliebiger Name: Stapel
    db 100h dup (?) ;100h uninitialisierte Byte in diesem Segment
    ends Stapel
    
    ;...
    ;Im Code dann:
    mov ax, Stapel
    mov ss, ax ;bei mov ss, ... wird automatisch das IF geloescht (cli), bis die naechste Instruction verarbeitet wurde
    mov sp, 0100h ;auf Segmentende...
    ;hier hat das IF wieder den alten Wert
    


  • genauso meinte ich das, danke für deine hilfe 😉



  • Gehört die InterruptVectorTabelle zum Betriebssystem oder zum Bios?



  • gehört zum BIOS, ist standard bei jedem IBM-kompatiblen PC... willst du noch wissen, was dort steht??



  • todo schrieb:

    willst du noch wissen, was dort steht??

    Klar.



  • hmmm... ok, also in der IVT stehen sozusagen pointer zu den interrupt-handlern 0-255, die adressen, die dort stehen werden angesprungen, wenn der entsprechende int ausgelöst wird... wenn du dort was ändern willst, musst du die nummer des interrupts mit 4 multiplizieren und dann kommst du an die stelle, wo du die adresse in der form von Segment:Offset setzen/lesen kannst...



  • Und worauf zeigen diese Pointer? auf weitere Stellen im Speicher, wo dann der Code steht, oder direkt auf das Bios?



  • Sven2 schrieb:

    Und worauf zeigen diese Pointer?

    =>

    todo schrieb:

    in der IVT stehen sozusagen pointer zu den interrupt-handlern 0-255

    (KA, ich find's einleuchtend... 😉 )

    Sven2 schrieb:

    auf weitere Stellen im Speicher, wo dann der Code steht, oder direkt auf das Bios?

    =>Sinnvollerweise liegt bei den Einsprungsadressen funktionierender Interrupt-Handler (Dahin zeigen die Pointer in der IVT) ausfuehrbarer Code.
    Der kann zu einem der BIOSe im PC oder zum Betriebssystem, einem Treiber, oder wasauchimmer gehoeren...
    Das BIOS ist auch nichts anderes als ein Haufen Code/Daten, der im Speicher liegt, von daher verstehe ich deine Unterscheidung zwischen Code und BIOS nicht so wirklich.


Anmelden zum Antworten