Step 7 Frage zum Adressregister

borromeus

Level-1
Beiträge
2.271
Reaktionspunkte
329
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

also grundsätzlich habe ich mir indirekter Adressierung keine Probleme, aber im Zuge einer Mitarbeiterschulung bin ich nun doch auf einen Punkt gestossen:

Ich lade in einem FB das Adressregister mit einem Anypointer aus dem TEMP-Bereich.

Code:
LAR1 P##ZIEL
L      B#16#10
T     LB [AR1, P#0,0]

Warum kann ich in Zeile 3 beim Transferier-Befehl angeben, dass ich den Akku in das Lokalbyte LB schreiben will.
Im AR1 steht ja der Speicherbereich B#16#86 ja eigentlich schon drinnen und weiss daher, dass es sich um Lokaldaten handelt- was macht der Compiler oder die CPU mit diesen redundanten Information?
Oder was passiert eigentlich wenn ich statt LB DBB schreibe?

Code:
LAR1 P##ZIEL
L      B#16#10
T     B [AR1, P#0,0]
funktioniert natürlich auch tadellos.

Code:
LAR1 P##ZIEL
L      B#16#10
T     DBB [AR1, P#0,0]
funktioniert nicht,

aber was genau passiert da eigentlich im Hintergrund?
"DBB" gewinnt gegen AR1-Speicherbereich
"B" nimmt den AR1-Speicherbereich
"LB" funktioniert zufällig?

Gruß
Karl
 
Bei bereichsinterner registerindirekter Adressierung wird die eventuell in AR1/AR2 enthaltene Bereichskennung komplett ignoriert und durch den in der Operation angegebenen Bereich ersetzt.

Die Bereichskennung in AR1/AR2 wird nur bei bereichsübergreifender registerindirekter Adressierung benutzt.

PS: Beispiel

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Harald,

das heisst ja dann, dass

Code:
LAR1 P##ZIEL 
L      B#16#10 
T     B [AR1, P#0,0]

nur zufällig funktioniert?

Edit:
das Ganze Übungsprogramm hier, es kopiert einfach einen String STR_I auf einen String STR_O:

Code:
  LAR1  P##STR_I
      TAR1  
      T     #ADR1

      LAR1  P##Q
      L     B#16#10
      T     B [AR1,P#0.0]
      L     B#16#13
      T     B [AR1,P#1.0]
      L     W#16#1
      T     W [AR1,P#2.0]
      L     W#16#0
      T     W [AR1,P#4.0]
      L     #ADR1
      T     D [AR1,P#6.0]

      LAR1  P##STR_O
      TAR1  
      T     #ADR1

      LAR1  P##Z
      L     B#16#10
      T     B [AR1,P#0.0]
      L     B#16#13
      T     B [AR1,P#1.0]
      L     W#16#1
      T     W [AR1,P#2.0]
      L     W#16#0
      T     W [AR1,P#4.0]
      L     #ADR1
      T     D [AR1,P#6.0]

      CALL  "BLKMOV"
       SRCBLK :=#Q
       RET_VAL:=#RetVal
       DSTBLK :=#Z
 
Zuletzt bearbeitet:
Naja, Harald schreibt:
"Bei bereichsinterner registerindirekter Adressierung wird die eventuell in AR1/AR2 enthaltene Bereichskennung komplett ignoriert"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die bereichsinterne Adressierung kann nur in den in der Operation angegebenen Bereich zugreifen.
Bei bereichsübergreifender Adressierung ist in der Operation kein Bereich angegeben, der Bereich wird dem Pointer im Adressregister entnommen (ist flexibler).

Code:
L LW [AR1,P#0.0]   //bereichsinterne Adressierung auf TEMP-Bereich
L W [AR1,P#0.0]    //bereichsübergreifende Adressierung in Bereich aus AR1


das heisst ja dann, dass

Code:
LAR1 P##ZIEL 
L      B#16#10 
T     B [AR1, P#0,0]

nur zufällig funktioniert?
Nein, das ist bereichsübergreifende Adressierung (die Operation enthält keine Bereichskennung), die Bereichskennung wird aus AR1 entnommen:
Wenn #ZIEL an TEMP:2.0 liegt, dann: AR1 = P##ZIEL = P#L2.0
Wenn #ZIEL an STAT:2.0 liegt, dann: AR1 = P##ZIEL = P#DIX2.0

Harald
 
Code:
LAR1 P##ZIEL
L      B#16#10
T     LB [AR1, P#0,0]

Warum kann ich in Zeile 3 beim Transferier-Befehl angeben, dass ich den Akku in das Lokalbyte LB schreiben will.
Du bist der Programmierer, Du kannst angeben was du willst ;)

Bei der Operation "LAR1 P##ZIEL" wird eine absolute Adresse in AR1 geladen, der AWL-Compiler läßt Dich freundlicherweise die Adresse symbolisch angeben und ersetzt dann im Compilat das Symbol gegen die Adresse. Man kann danach versehentlich oder absichtlich "sicherheitshalber" bei "T (L)B [AR1, P#0,0]" die Bereichskennung L mit angeben oder weglassen - es funktioniert beides.
Code:
LAR1 P#[COLOR="#0000FF"][B]L[/B][/COLOR]2.0            //Adresse von P##ZIEL mit Bereichskennung L
L    B#16#10
T    [COLOR="#0000FF"][B]L[/B][/COLOR]B [AR1, P#0.0]   //benutzt Bereichskennung L aus Operation, Bereichskennung in AR1 wird ignoriert

T    B [AR1, P#0.0]    //benutzt Bereichskennung L aus AR1, funktioniert genauso

Du könntest aber auch schreiben:
Code:
LAR1 P#2.0            //Adresse(Offset) ohne Bereichskennung
L    B#16#10
T    [COLOR="#0000FF"][B]L[/B][/COLOR]B [AR1, P#0.0]  //die Operation muß eine Bereichskennung enthalten!

Harald
 
Zurück
Oben