Pointerformat

Uwe16

Level-2
Beiträge
100
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe da ein kleines Problem.
Ich will einen Merker laden über indirekte Adressierung.
Ich habe ein Datenwort in dem ein Wert steht.
Wenn z.B. 0 drin steht soll der Merker 50.0 geladen werden. Wenn 6 drin steht M50.6. Wenn allerdings 14 drin steht bräuchte ich den Merker 51.5.
Ich habe mal so angefangen:
L "Aktueller Schritt".Impulse //Wert
SLW 3
LAR1
U M [AR1,P#0.0]
= "MDEIMPULS" // aktueller Merker auf den der aus dem DW ermittelten Merker übernommen wird.

Bin leider ein bisschen aus der Übung mit Pointeradressierung. Aber es gibt da bestimmt fittere.... :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
*lach* das ging aber echt schnell.
Ich habe nur ein Datenwort (kein Datendoppelwort)ist es dann richtig wenn ich +D schreibe? Und muss ich nicht mein Datenwort erst umrechnen in Bit und Byteadresse?
 
*lach* das ging aber echt schnell.
Ich habe nur ein Datenwort (kein Datendoppelwort)ist es dann richtig wenn ich +D schreibe? Und muss ich nicht mein Datenwort erst umrechnen in Bit und Byteadresse?

+D bezieht sich auf den Pointer, der als 32bit-Datenraumbeansprucher daher kommt

@Larry: schön!

warum mach ich das dann immer so umständlich?

Code:
*
      L     #iBitNumber
      L     50
      +I
      L     8
      /I    
      T     #dTemp

      L     P##dTemp
      LAR1  

      L     W [AR1,P#2.0]
      SLD   3
      L     W [AR1,P#0.0]
      +D    
      LAR1  

      U     M [AR1,P#0.0]

achso ... damit es keiner versteht *ROFL*
 
Vielen Dank erstmal. Ich werde es am Montag probieren. Im moment ist das Wetter einfach zuuuu schön.

Schönes Wochenende
 
Code:
L P#50.0
L #dein_Index
+D
LAR1
[COLOR=royalblue]AUF DB81[/COLOR]
[COLOR=royalblue]U DBX [AR1,P#0.0][/COLOR]
Gruß
Harald


Vielen Dank!!
Jetzt aber noch eine Frage....
Wenn ich aud ein DW schreiben will geht dass dann so in der richtung?

L P#00.0
L #dein_Index
+D
LAR1
AUF DB81
T DBW [AR1,P#0.0][/CODE]
 
... dann müßtest du deinen Index bloss immer mit 16 multiplizieren oder um 4 verschieben - also :
Code:
L #dein_Index
SRD 4
LAR1
[COLOR=royalblue]AUF DB81[/COLOR]
[COLOR=royalblue]T DBW [AR1,P#0.0][/COLOR]
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... dann müßtest du deinen Index bloss immer mit 16 multiplizieren oder um 4 verschieben - also :
Code:
L #dein_Index
SRD 4
LAR1
[COLOR=royalblue]AUF DB81[/COLOR]
[COLOR=royalblue]T DBW [AR1,P#0.0][/COLOR]
Gruß
LL


und wann lade ich den Wert den ich in das DW schreiben will?
L #dein_Index
SRD 4
LAR1
AUF DB81
l -1????
T DBW [AR1,P#0.0][/CODE]
 
und wann lade ich den Wert den ich in das DW schreiben will?
L #dein_Index
SRD 4
LAR1
AUF DB81
l -1????
T DBW [AR1,P#0.0][/CODE]

Wenn dein Wert nicht aus einem anderen DB kommt funktioniert das so. Wenn die Quelle ein anderer DB ist musst du die Zeilen mit dem DB öffnen und dem Ladebefehl vertauschen.
Code:
[COLOR=#4169e1]l DB70.DBW 0
[/COLOR][COLOR=royalblue]AUF DB81[/COLOR]
[COLOR=royalblue]T DBW [AR1,P#0.0][/COLOR]
 
Ganz genau müßte der Code etwa so aussehen:
Code:
//Beispiel: DB81.DBB10 Datenfeld ARRAY[0..99] OF INT

      L     #dein_Index         // 0 .. 99 (0 .. Array_maxIndex)
      SLD   4                   // bei Byte: 3 / Word/Int: 4 / DWord/DInt: 5
      L     P#10.0              // Anfangsadresse Datenfeld im DB (DB81.DBB10)
      +D                        // dazuaddieren -> P#Datenfeld[dein_Index]
      LAR1                      // -> Pointer

      L     #dein_Wert
      AUF   DB    81
      T     DBW [AR1,P#0.0]     // in Datenfeld[dein_Index] schreiben

// oder auch so:
      L     #dein_Index
      SLD   4
      LAR1

      L     #dein_Wert
      AUF   DB    81
      T     DBW [AR1,P#10.0]    // <- P#10.0 = Anfangsadresse Datenfeld im DB
Je nachdem, wie groß die Struktur eines Datenfeldes ist, kann die Adressberechnung bis zum LAR1 auch anders gemacht werden.

Gruß
Harald
 
SLD3 ist korrekt, wenn du deinen Adress-Pointer immer um die richtige Anzahl von Bytes erhöhst - also um 1 erhöhen für Byte-Zugriffe, um 2 erhöhen für Wort-Zugriffe und um 4 erhöhen für Doppelwort-Zugriffe.
Erhöhst du den Index aber immer nur um 1, so ist für Bytes wieder SLD3 richtig, für Wortes dann aber schon SLD4 und entsprechend für Doppelworte SLD5.

Gruß
LL
 
Zurück
Oben