x86-Programmierung und -Betriebsarten (Teil 2)

Beispiel

Displacement, Basisregister, Indexregister und Skalierungsfaktor können Sie in beliebiger Kombination verwenden. Damit können Sie eine sehr ausgeklügelte und mehrdimensionale Adressierung beispielsweise von Feldelementen definieren.

Beispiel: Gegeben sei ein Feld mit zehn Elementen, das zehn verschiedene Körper bezeichnet; jedes Element besitzt den Aufbau Höhe:Breite:Tiefe:Querschnitt. Die Teilelemente Höhe et cetera umfassen jeweils 1 Byte. Das Feld beginnt bei 0c224h. Durch das folgende Programmfragment können die Tiefen der Elemente in den Akkumulator EAX geladen werden:

MOV EBX, 0c224h ;Laden der Basisadresse in EBX
MOV ESI, nr ;Laden der Elementnummer in ESI
MOV EAX, [EBX+ESI*4+2] ;Tiefe (Displacement 2 gegenüber dem Beginn) des Elementes
;nr (Elementgröße=4 Byte, daher Skalierung 4)
;des Feldes (beginnend bei der Basisadresse in EBX)
;in den Akkumulator EAX laden

Beim oben angeführten Beispiel verwendet der Prozessor standardmäßig das Segmentregister DS (beziehungsweise SS im Fall von EBP als Basisregister). Der 80386 besitzt aber noch die drei Extrasegmentregister ES bis GS und das Codesegmentregister CS.

Anstelle dieser Segmentregister können auch sie benutzt werden, wenn man den Wert von ES oder CS beispielsweise in das Register DS lädt. Eine weitere Möglichkeit, das Register ES zu benutzen, ist die Segmentüberschreibung (Segment-Override). Der Assembler erkennt eine solche Überschreibung, indem man die Bezeichnung des zu verwendenden Segments dem Speicheroperanden, abgetrennt durch einen Doppelpunkt, voranstellt. Wenn wir im oben angeführten Beispiel ein Feld in einem Segment ansprechen wollen, das durch den Wert im Segmentregister ES definiert wird, müssen wir folgenden Befehl benutzen:

MOV EAX, ES:[EBX+ESI*4+2]

Eine Segmentüberschreibung ist vor allem dann vorteilhaft, wenn ein Segment nur selten angesprochen werden soll. Greifen dagegen viele aufeinander folgende Befehle auf das ES-Segment zu, dann ist es besser, den Wert von ES in DS zu laden. Nun wird der in DS abgelegte Wert von ES standardmäßig benutzt, und Sie können sich (und dem Prozessor) die ständigen Overrides ES: ersparen.