

Adressierung des Arbeitsspeichers:

Um den Arbeitsspeicher zu adressieren mu man sich die Funktion 
des Daten-, und Adrebusses klar machen.
Der Datenbus, bezeichnet die Menge aller Datenleitungen, mit 
denen die CPU aus dem Speicher liest, oder in ihn schreibt.
Fr die Adressierung von Bedeutung ist allerdings der Adrebus, 
also die Summe aller Adreleitungen ber die die CPU verfgt. Der 
Adrebus ist bei der 8088/86 CPU 20 Bit breit, d.h. die CPU kann
20 einzelne Adreleitungen nutzen.
Um Daten in den Arbeitsspeicher des Computers zu schreiben, 
oder aus ihm zu lesen, ist es notwendig, jede einzelne Speicher-
zelle zu nummerieren. Mit 20 Bit kann man 2^20 = 1.048.576 Bytes 
nummerieren. Die CPU-Register sind allerdings nur 16 Bit breit, 
d.h. es fehlen 4 Bit um den gesamten Arbeitsspeicher zu adres-
sieren.  
Deshalb segmentiert man den Arbeitsspeicher. Die Nummer einer 
Speicherzelle setzt sich aus dem Segmentanteil und dem Offset-
anteil zusammen. Das Segment legt einen Bezugspunkt im Arbeits-
speicher fest, whrend der Offsetanteil frei whlbar ist. Also 
kann ber den Offset jede Speicherzelle innerhalb des Segments 
angesprochen werden. 
Wenn man jetzt noch das Segmentregister ndert, kann man so den 
gesamten Arbeitsspeicher adressieren.
Die physikalische Adresse bildet sich nach folgender Formel: 
		    
Offset + Segmentadresse*16=physikalische Speicheradresse (20Bit)

Fr den Segmentanteil der Adresse sind die Segmentregister zu-
stndig. Der Offsetanteil wird aus einem Zeigerregister, oder aus 
einem allgemeinen CPU-Register geholt. Bedingt dadurch, da die 
CPU-Register allgemein 16 Bit breit sind, kann ein Segment maxi-
mal 65535 Byte gro werden.
Die Schreibweise zur Adressierung des Arbeitsspeichers sieht wie 
folgt aus: Segment:Offset. Durch Maschinensprachebefehle ist es 
mglich in jede beliebige Speicherzelle des Arbeitsspeichers 
eine Konstante zu laden, oder den Inhalt dieser Speicherzelle in 
eine Variable zu laden.

Die CPU-Register der Intel-Prozessoren im Real-Mode:

Die CPU verwaltet insgesamt 14 interne Register,die man wie eine 
Speicherzelle im Arbeitsspeicher ansprechen kann. Jedes dieser 14 
Register hat eine besondere Funktion. Die 14 Register sind aufge-
teilt in vier Allgemeine-Register, vier Segment-Register, drei 
Zeiger-Register, zwei Index-Register und ein Status-, bzw. Flag-
Register. Jedes dieser Register ist 16 Bit breit und die vier 
Allgemeinen-Register knnen bei Bedarf  als zwei acht Bit Regis-
ter genutzt werden.
Bei 32Bit-CPU's sind die Register 32 Bit breit, was dadurch ge-
kennzeichnet ist, da die Registernamen ein 'E', fr Extended, 
vorangestellt haben.

Allgemeine CPU-Register:

Zu den vier Allgemeinen Registern zhlen das AX, BX, CX und DX 
Register. Jedes dieser Register ist 16 Bit breit, die Register 
knnen aber auch als jeweils zwei acht Bit breite Register ge-
nutzt werden. Dabei wird ein 16 Bit Register aufgeteilt in ein 
hherwertiges ('H' fr High) und ein niederwertiges ('L' fr Low) 
Byte.
Die Register knnen also auch als AH,AL,BH,BL,CH,CL,DH und DL Re-
gister angesprochen werden.

Die Hauptaufgabe des AX-Registers ist die Ein-/Ausgabe Steuerung, 
z.B. die Zwischen- speicherung von Interrupt-Funktionen und Port-
adressen, es wird zustzlich auch als Zwischenspeicher bei Multi-
plikationen und Divisionen genutzt (Akkumulator-Register). Wenn 
das Register nicht gerade fr eine der obengenannten Funktionen 
gebraucht wird kann es frei verwendet werden.

Das BX-Register wird hauptschlich fr die indirekte Adressierung 
benutzt, ansonsten ist auch dieses Register frei verwendbar 
(Base-Register).

Das CX-Register wird als Zhlregister fr Programmschleifen ein-
gesetzt, bei Stringbefehlen und nach Vergleichen (Counter-Re-
gister). Ansonsten kann auch dieses Register frei verwendet 
werden.

Das DX-Register vollzieht eine Zwischenspeicherung von Daten die 
zur Berechnung in Anwendungen bentigt werden (Data-Register).

Segment-Register:

Zu den vier Segmentregistern zhlen das SS, DS, CS und das ES-Re-
gister. Jedes dieser Register ist 16 Bit breit.
Die Verwendung der Segmentregister ist, bis auf das ES-Register, 
fest vorgegeben, kann aber mit Hilfe eines Segment-Override-Pre-
fix gendert werden.
Die Segmentregister werden eingesetzt um den Arbeitsspeicher zu 
adressieren, worauf spter noch eingegangen wird.

Das SS-Register ist fr die Adressierung des Stack-Segments zu-
stndig. In diesem Register ist die Segment Adresse des Stacks 
abgelegt.

Das DS-Register ist fr die Adressierung des Datensegments zu-
stndig. In diesem Register ist die Segment-Adresse des Daten-
segments festgelegt.

Das CS-Register ist fr die Adressierung des Codesegments zu-
stndig. In diesem Register ist die Segment-Adresse des Code-
segments festgelegt.

Das ES-Register ist frei verwendbar, es kann z.B. als zweites 
Datensegment benutzt werden.

Zeiger-Register:

Zu den vier Zeigerregistern zhlen das IP, SP und das BP-Regis-
ter. Jedes dieser Register ist 16 Bit breit.
Die Verwendung der Zeigerregister ist, wie die der Segmentre-
gister, fest vorgegeben. Zu jedem Segmentregister gehrt ein 
Zeigerregister.

Das IP-Register dient zur Adressierung des Code-Segments, es ar-
beitet also mit dem CS-Register zusammen.
Ein Machinenspracheprogramm beginnt bei der Segmentadresse, die 
im CS-Register abgelegt ist und beim Offset 0000hex.
Das IP-Register bildet den Offset fr das Codesegment, d.h. 
durch ndern des IP-Registers ist es mglich jeden Machinen-
sprachebefehl innerhalb dieses Programms anzusprechen. Beim Ab-
lauf eines Maschinenspracheprogramms wird das IP-Register nach 
jedem aus- gefhrten Befehl erhht, d.h. das IP-Register zeigt 
auf den Befehl der als nchstes aus- gefhrt werden soll (In-
struction Pointer).
Die Adressierungsart CS:IP ist festgelegt.

Das SP-Register dient zur Adressierung des Stacksegments, es ar-
beitet also mit dem SS-Register zusammen.
Der Stack beginnt bei der Segmentadresse, die im SS-Register ab-
gelegt ist und bei einem beliebig gewhlten Offset, z.B. 0100hex.
Das SP-Register stellt den Offset des Stacksegments dar, d.h. 
durch laden des IP-Registers mit einem Wert, wird der Stack um 
diesen Wert erniedrigt.
Der Stack wchst in Richtung immer kleinerer Adressen,  damit 
ein berlauf verhindert wird. Das SP-Register zeigt somit also 
immer auf das unterste Stackelement, also das Stackelement, da 
als nchstes vom Stack geholt werden soll.
Der Stack arbeitet nach dem LIFO-Prinzip, d.h. das Element das 
zuletzt abgelegt wurde wird als erstes wieder ausgelesen (Last 
In First Out).
Die Adressierungsart SS:SP ist fest vorgegeben.

Das BP-Register kann frei zur indirekten Adressierung genutzt 
werden, z.B. zum adressieren von Tabellen und Feldern. Das BP-
Register kann auch als Zeiger fr das Datensegment genutzt 
werden, d.h. es zeigt auf die Speicherzelle im Arbeitsspeicher, 
die bearbeitet werden soll (Base Pointer).

Index-Register:

Zu den zwei Index-Registern zhlen das SI und das DI-Register. 
Jedes dieser Register ist 16 Bit breit. Die Indexregister werden 
bei Stringoperationen verwendet.

Das SI-Register wird verwendet, um bei String-Operationen den 
Offset fr den Quellstring im Datensegment anzugeben (Source 
Index).

Das DI-Register wird verwendet, um bei String-Operationen den 
Offset fr den Zielstring im Datensegment anzugeben (Desti-
nation Index).

Status-Register (Flag-Register):

Das Statusregister ist ebenfalls 16 Bit breit. Im Gegensatz zu 
den anderen Registern stellt das Flagregister aber eine Ansam-
mlung von Bits mit individueller Bedeutung dar. Jedes einzelne 
Bit sagt etwas ber den aktuellen Status der CPU aus, aller-
dings sind nicht alle Bits genutzt, so da der Anwender die 
Mglichkeit hat, die nicht verwendeten Bits fr eigene Prfalgo-
rithmen zu verwenden und sie explizit zu setzen.

Das Statusregister der 8086/88 CPU:
 
 15  14  13  12  11  10  09  08  07  06  05  04  03  02  01  00
 --  --  --  --  O   D   I   T   S   Z   --  A   --  P   --  C

O = Overflow Flag                       Z = Zero Flag
D = Direction Flag                      A = Auxiliary Flag
I = Interrupt Enable Flag               P = Parity Flag
T = Trap-, oder Single Flag             C = Carry Flag
S = Sign Flag


						 Gabriel

