Adressierung des Arbeitsspeichers:

Um den Arbeitsspeicher zu adressieren muá man sich die Funktion 
des Daten-, und Adreábusses klar machen.
Der Datenbus, bezeichnet die Menge aller Datenleitungen, mit 
denen die CPU aus dem Speicher liest, oder in ihn schreibt.
Fr die Adressierung von Bedeutung ist allerdings der Adreábus, 
also die Summe aller Adreáleitungen ber die die CPU verfgt. Der 
Adreábus ist bei der 8088/86 CPU 20 Bit breit, d.h. die CPU kann
20 einzelne Adreáleitungen 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, w„hrend der Offsetanteil frei w„hlbar 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)

Fr den Segmentanteil der Adresse sind die Segmentregister zu-
st„ndig. 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 
m”glich 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 k”nnen 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', fr Extended, 
vorangestellt haben.

Allgemeine CPU-Register:

Zu den vier Allgemeinen Registern z„hlen das AX, BX, CX und DX 
Register. Jedes dieser Register ist 16 Bit breit, die Register 
k”nnen aber auch als jeweils zwei acht Bit breite Register ge-
nutzt werden. Dabei wird ein 16 Bit Register aufgeteilt in ein 
h”herwertiges ('H' fr High) und ein niederwertiges ('L' fr Low) 
Byte.
Die Register k”nnen 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 zus„tzlich auch als Zwischenspeicher bei Multi-
plikationen und Divisionen genutzt (Akkumulator-Register). Wenn 
das Register nicht gerade fr eine der obengenannten Funktionen 
gebraucht wird kann es frei verwendet werden.

Das BX-Register wird haupts„chlich fr die indirekte Adressierung 
benutzt, ansonsten ist auch dieses Register frei verwendbar 
(Base-Register).

Das CX-Register wird als Z„hlregister fr 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 ben”tigt werden (Data-Register).

Segment-Register:

Zu den vier Segmentregistern z„hlen 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 ge„ndert werden.
Die Segmentregister werden eingesetzt um den Arbeitsspeicher zu 
adressieren, worauf sp„ter noch eingegangen wird.

Das SS-Register ist fr die Adressierung des Stack-Segments zu-
st„ndig. In diesem Register ist die Segment Adresse des Stacks 
abgelegt.

Das DS-Register ist fr die Adressierung des Datensegments zu-
st„ndig. In diesem Register ist die Segment-Adresse des Daten-
segments festgelegt.

Das CS-Register ist fr die Adressierung des Codesegments zu-
st„ndig. 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 z„hlen 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 geh”rt 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 fr das Codesegment, d.h. 
durch „ndern des IP-Registers ist es m”glich jeden Machinen-
sprachebefehl innerhalb dieses Programms anzusprechen. Beim Ab-
lauf eines Maschinenspracheprogramms wird das IP-Register nach 
jedem aus- gefhrten Befehl erh”ht, d.h. das IP-Register zeigt 
auf den Befehl der als n„chstes aus- gefhrt 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 gew„hlten 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 w„chst 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 n„chstes 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 fr 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 z„hlen 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 fr den Quellstring im Datensegment anzugeben (Source 
Index).

Das DI-Register wird verwendet, um bei String-Operationen den 
Offset fr 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 
M”glichkeit hat, die nicht verwendeten Bits fr eigene Prfalgo-
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