Stack Verständnis
-
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.