Step 7 Pointer kurze Frage

EMZ

Level-2
Beiträge
232
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

habe eine kurze Frage zu Pointer:(bei Sprungmarke load:) Warum wird dort "4" geladen und multipliziert ? "Schiebereg".Auswurf hat Format Word. Ich würde dies wenn dann mal 2 machen.
Kann mir das einer anhand des Bitmusters erklären ? Warum mal 4 bzw. 2 ?



Vielen Dank im Voraus

Gruß
EMZ


Code:
      AUF   "Schiebereg"
      L     "Schiebereg".Auswurf    //Pos. -  DBW
      L     0
      ==I   
      SPB   zero


      L     "Schiebereg".Auswurf     //Pos. -  DBW
      SPA   load


zero: L     5
      T     "Schiebereg".Auswurf     //Pos. -  DBW
      L     5


load: L     4                           // Pointer
      *I    
      SLW   3
      LAR1  
      L     DBD [AR1,P#0.0]


      AUF   "Schiebereg2"
      T     DBD [AR1,P#0.0]
 
Es wird x4 gerechnet, weil dein Pointer auf einen Doppelwortbereich zeigt. Ein Doppelwort hat 4 Bytes. Es wird also der Offset zur Startadresse berechnet ( P#0.0 )
Würde dein Pointer auf einen Wordbereich zeigen, so müsste x2 multipliziert werden.
 
Hallo,

vielen Dank für die schnelle Antwort. Das heisst dass wenn z.B. Schiebereg.Auswurf den Wert 30 hat der x4 multipliziert (120) wird dann in Pointerformat umgewandelt. Dann wird der zb DBD 30 geladen der 2. Schiebereg2 geöffnet und dort in den DBD30 reingeladen.

Das heisst wenn mein Pointer als Quell und Zielbereich Doppelword hat dann x4 wenn ich im Quellbereich Word und im Zielbereich aber Doppelword dann x2?

LG
EMZ
 
z.B. Schiebereg.Auswurf den Wert 30 hat der x4 multipliziert (120) wird dann in Pointerformat umgewandelt. Dann wird der zb DBD 30 geladen der 2. Schiebereg2 geöffnet und dort in den DBD30 reingeladen.

Der Wert 30 wird mit 4 multipliziert ( = 120 ) Zugegriffen wird dann auf DBD 120
 
Heisst das x4 benötige ich hier in dem Fall nicht um in Pointerformat zu wandeln.

—> L Schiebereg.Auswurf
SLW 3
LAR 1
L DBD [....

wie würdest du es ändern. Also meinst du andere Sprache ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Heisst das x4 benötige ich hier in dem Fall nicht um in Pointerformat zu wandeln.

—> L Schiebereg.Auswurf
SLW 3
LAR 1
L DBD [....
Nein ... wie schon beschrieben :
mit x4 berechnest du die Byte-Adresse deines DBD im Datenbaustein.
Das anschließende SLW 3 macht daraus dann die Bit-Adresse mit der der Pointer dann arbeitet (Pointer arbeiten auf Bit-Basis).

wie würdest du es ändern. Also meinst du andere Sprache ?
Zeitgemäßer wäre ein Array und hier dann mit dem Index (bei dir dann das "Schiebereg".Auswurf) auf die einzelnen Elemente zugreifen.
Ganz schick wäre, wenn andere Sprache denn auch eine Option ist, es in SCL zu machen ...

Gruß
Larry
 
Zugriff auf einem DBD also Datentyp DWord muss mein Zeiger/Pointer auch vom Datentyp DWord sein, deshalb x4 da 4x8 =32

SLW 3 ist ja der Befehl um das Pointerformat ....bbbbbbbbbbbbbxxx (byteadresse16bit.bitadresse3bit) zu erreichen.

Soweit sogut, ich würde jetzt allerdings wenn Schiebereg.Auswurf = 30 ist,
dann auch auf DBD30 zugreifen. Das erreiche ich doch in dem Fall wenn das x4 wegbleibt so wie auch TP-Inc beschrieben oder ? Weil wenn ich Schiebereg.Auswurf = 30 habe und dann dies mit x4 multipliziere greife ich ja wie oben erwähnt auf DBD120 zu.

welche ist jetzt richtig mit oder ohne 4 ☺️🙏🏽

Vielen Dank im Voraus

Gruß
EMZ
 
Es ist egal wohin der Pointer zeigt, er sollte immer ein Double sein. Denn wie du selbst schreibst 16 bit für die Bytesdresse, 3 für die Bits. Das geht sich in einem 16 Bit Wort nicht immer aus. Deshalb sollte man immer Doppelwörter zur Pointerberechnung verwenden. Also auch SLD 3 anstatt SLW 3. Ansonsten kannst du nur Adressen bis Byte 8191.0 berechnen.

Und ja einfach die 4 weg...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit sogut, ich würde jetzt allerdings wenn Schiebereg.Auswurf = 30 ist,
dann auch auf DBD30 zugreifen. Das erreiche ich doch in dem Fall wenn das x4 wegbleibt so wie auch TP-Inc beschrieben oder ? Weil wenn ich Schiebereg.Auswurf = 30 habe und dann dies mit x4 multipliziere greife ich ja wie oben erwähnt auf DBD120 zu.

Diese Frage beantwortest du dir lieber selber wenn du mal einen Blick auf deinen DB wirfst.
Das erste DBD darin ist DBD 0, gefolgt von DBD 4, gefolgt von DBD 8 ... usw. - es gibt kein DBD 1 usw. - das DBD was du für den Index 30 benötigst ist vollkommen richtig das DBD 120 ...
Beantwortet das deine Frage ?

Gruß
Larry
 
Soweit sogut, ich würde jetzt allerdings wenn Schiebereg.Auswurf = 30 ist,
dann auch auf DBD30 zugreifen. Das erreiche ich doch in dem Fall wenn das x4 wegbleibt so wie auch TP-Inc beschrieben oder ? Weil wenn ich Schiebereg.Auswurf = 30 habe und dann dies mit x4 multipliziere greife ich ja wie oben erwähnt auf DBD120 zu.

welche ist jetzt richtig mit oder ohne 4
Willst Du den Code aus #1 nur verstehen oder willst Du ihn ändern damit er anders funktioniert? Wenn Du auf DBD30 zugreifen willst, dann darfst Du natürlich nicht mit 4 multiplizieren. Dann musst Du direkt die 30 von Schiebereg.Auswurf nehmen und ins Pointerformat P#30.0 umwandeln.

In dem Code wird DBD 120 adressiert, weil der Index Schiebereg.Auswurf = 30 mit 4 multipliziert wird. Das scheint so auch logisch richtig zu sein, weil da DWORDS (4 zusammenhängende Bytes) in den adressierten Bereichen kopiert werden. Da ist nur eine Unschönheit, daß eine eigentlich falsche Anweisung SLW anstatt SLD verwendet wird, was aber bei kleinen Zahlen funktioniert.

Oder liegt hier ein Verständnisproblem vor? DBD 30 ist nicht das 30. DBD, sondern das DBD was bei der Byteadresse 30 anfängt. Hier wird die Byteadresse 120 errechnet und mittels "SLW 3" ins Pointerformat (Bitadresse) gebracht: 120 --> P#120.0, und dann das mit P#120.0 adressierte DBD120 kopiert.

Harald
 
Hallo,

vielen Dank für eure Hilfe

habe es jetzt verstanden. Hatte nur einen kleinen Denkfehler in der Sache... Stichwort: Index hat mir auf die Sprünge geholfen.
Habe die Position mit dem "Index/Pointer" einbisschen durcheinander gebracht.
30 als Eingabe wäre dann meine Position 30 (schiebereg.auswurf) welches die Adresse DBD120 hat.


Viele Grüße
EMZ
 
Zurück
Oben