Code:
TAR2 // Lade Adressregister in den AKKU 1 (Offset)
UD DW#16#FFFFFF // Ausblenden der Bereichskennung
L P##variable // Lade Adresse der Variablen
+D // Addiere Offset und Variablenadresse
LAR1 // Speichere das Ergebnis im Adressregister AR1
So herum ist sichergestellt, daß AR1 eine Adresse erhält, die sich auf den Instanz-DB bezieht (Bereichskennung 16#85).
Eine nachfolgende
bereichsübergreifende registerindirekte Operation
L W [AR1,P#0.0] greift dann auf den IDB zu.
Beachte:
Das AR2 enthält eine Adresse mit der Bereichskennung 16#84 = DB
P##inparameter ist eine Adresse mit der Bereichskennung 16#85 = DI
Die Übergabeparameter liegen im Instanz-DB, also sollte ein registerindirekter Zugriff über das DI-Register adressieren oder das DB-Register muß die Nummer des IDB enthalten.
Ganz sicher geht man mit einem
bereichsinternen registerindirekten Zugriff (der Inhalt des DB-Registers in dann beliebig):
L DIW [AR1,P#0.0]
So wird Dein Code funktionieren:
Code:
LAR1 P##Host_Exchange // Lade Adresse des Parameters in dieser Instanz 85... (DI)
TAR2 // Lade den Offset dieser Instanz im IDB aus dem AR2 in den AKKU1
+AR1 // Addiere Variablenadresse und Offset --> 85... (DI)
//bereichsübergreifend registerindirekt - AR1 muß eine DI-Adresse 85... enthalten!
L W [AR1,P#0.0] // 'Host_Exchange' DataBlock
T #AuxDb
//bereichsintern registerindirekt - die Bereichskennung in AR1 wird ignoriert, es wird DI verwendet
L DIW [AR1,P#0.0] // 'Host_Exchange' DataBlock
T #AuxDb
siehe auch:
Bei welchen Operationen überschreibt STEP 7 den Akku-Inhalt bzw. den Inhalt von Registern?
Harald