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. Fr die Adressierung von Bedeutung ist allerdings der Adreábus, also die Summe aller Adreáleitungen ber die die CPU verfgt. 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) Fr 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', fr 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' fr High) und ein niederwertiges ('L' fr 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 fr eine der obengenannten Funktionen gebraucht wird kann es frei verwendet werden. Das BX-Register wird haupts„chlich fr die indirekte Adressierung benutzt, ansonsten ist auch dieses Register frei verwendbar (Base-Register). Das CX-Register wird als Z„hlregister 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 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 fr die Adressierung des Stack-Segments zu- st„ndig. In diesem Register ist die Segment Adresse des Stacks abgelegt. Das DS-Register ist fr die Adressierung des Datensegments zu- st„ndig. In diesem Register ist die Segment-Adresse des Daten- segments festgelegt. Das CS-Register ist fr 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 fr 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- gefhrten Befehl erh”ht, d.h. das IP-Register zeigt auf den Befehl der als n„chstes 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 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 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 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 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 M”glichkeit 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