Moin,
Teil 3 handelt von den Segmentregistern und von der Addressierung im RAM.
Um die SR (SegmentRegister) zu verstehen ist es hilfreich mit der Addressierung im RAM (=Arbeitsspeicher) zu arbeiten.
Ein Speicherbereich wird als Segment bezeichnet im Programmieralltag... Also die CPU hohlt sich ihre Daten immer aus dem RAM um damit zu arbeiten.
Damit die CPU das unterscheiden kann gibt es das Datensegment (DS), also für Variablen etc, und das Codesegment (CS), indem alle Befehle ausgeführt werden.
Code:
Segmentregister | RAM | Offsetregister
| Ende |
Codesegment(CS) | Befehle | IP
Datensegment(DS) | Daten | SI / DI / BX
Extrasegment(ES) | m. Daten| SI / DI / BX
Stapelsp.-Segment(SS)| m. Prog. |
| speicher |
| Anfang |
| RAM |
oben alle Register für x86 CPUs
Im SR wird der Startpunkt für die Addressierung gesetzt, was innerhalb von 16Bit liegen muss (!). DH es können maximal 65.536 Punkte angesprochen werden. Diese nennt man Paragraphen.
Was nun wenn ich 20 Bit anpsrechen möchte?
Lösung: Das Offsetregister (OR). Das OR gibt den Endpunkt der Addressierung an, dh der Bereich zwischen SR und OS ist der bereich den wir ansprechen bzw addressieren wollen.
Will man den nun ansprechen muss man den Wert im SR mal 16 rechnen (bei hexadezimaler rechenart immer eine 0 anhängen).
Aus dem 16Bit SR wert 100h (h=hexadezimal) wird der 20bit wert 1000h. Dual gesehen wird die Addresse um 4Bit nach links geschoben was ein multiplikation mit 16 entspricht.
Nun SR + OR und schon haben wir 20Bit große Addresse. Da das OR nur 16Bit groß ist ist die maximale Variablengröße auf 64KByte begrenzt!
Beispiel:
Das Segment beginnt an stelle 176d (dezimal) und soll 78 Byte später enden.
Segmentaddresse = 176d = B0 = 10110000
Offsetadresse = 78d = 4E = 01001110
10110000 0000
+ 0100 1110
_____________
10110100 1110
__________________________________________________ _________________________________________
Es können beliebig viele Segmente definert werden, aber immer nur 4 gleichzeitig angesprochen werden.
CS: Codesegmet wo alle Befehle verarbeitet werden x86 bildet die 20Bit Addrese (CS:IP)
DS: Für Variablen, Konstaten etc... um die 20 Bit addresse zu bilden werden die OR SI,DI,BX verwendet
ES: Reicht der platz im DS nicht aus, dann ist das ES genau richtig... hier kommt alles rein was nicht ins DS reinpasst. Gleich OR wie im DS
SS: Schneller speicher zum zwischenspeichern von Daten. Die Addresse wird durch SS:SP gebildet (Stapelsegmentpointer)
__________________________________________________ _________________________________________
Der Befehlszeiger IP (Instruction Pointer)
Der IP zeigt im CS darauf welcher Befehl als nächstet verarbeitet werden soll.
Indexregister SI und DI
SI = Sourceindex, dieser gibt an wo die quelle ist wo Daten her kommen
DI = Destinationindex, gibt an wo die Daten hinsollen
Base Pointer (BP)
Will man im SS zugreifenbraucht man ihn um die sachen zu finden bzw dieser kann auch als Index verwenden.
Stapelspeicher- Pointer (SP)
Zeigt immer auf die Aktuelle Position im SS.
__________________________________________________ _________________________________________
Der Stapelspeicher (auch Stack,Stapel)
Läuft nach dem simplen prizip Last-In-First-Out (LIFO) also nach dem motto: was als letztes drin küt auch als erstes raus ;-)
Um sachen in den Stack zu schieben musst du pushen (=drücken) mit dem Befehl PUSH bzw um es rauszuhohlen poppen (xD) mit dem Befehl POP.
Bsp:
Code:
mov ax, wichtig
mov bx,wichtiger ;hab ich schonmal erklärt mit MOV
push ax ;yeah, AX ist im Stapel
push bx ; gleich mit BX
; iwas machen
;iwas machen
pop bx ; bx is back ;D
pop ax ; huch ax is auch :D => Werte sind unverändert
Es kann alles reingeschoben werden außer der IP!!!
Das wars erstmal, nächstes Thema STATUSREGISTER.
Viel Spaß beim Lesen und grübeln. Fragen etc
oder pmen