P#0.1 vom AR subtrahieren

godi

Level-1
Beiträge
1.460
Reaktionspunkte
185
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Gibt es einen Befehl mit dem ich einen Pointer vom Adressregister subtrahieren kann? Beim addieren gehts ja mit +AR1.

Habs jetzt mal so gemacht:
TAR1
SLD 4
DEC 1
SRD 4
LAR1
Es funktioniert zwar nur ist das sicher? Nicht das ich mal die falsche Adresse bekomme.

Godi
 
Moin;

Einfachster Weg ist direkt mit Adressen zu arbeiten.

Bsp:

TAR1 //Adresse von ADR1 in AKKU1 transferieren
L P#0.1 //Adressoffset in AKKU1 laden
-D //AKKUS subrahieren
LAR1 //Ergebnis nach ADR1 laden

Du kannst direkt den Adressoffset abziehen. Einen Adressregister-Befehl
für Subtraktion gibt es nicht.

Das Adressregister1 kannst Du ansich immer benutzen. Ausnahme ist nur, wenn Du Zugriff auf Operanden höherer Ordnung, wie Strukturen oder UDT's hast, dann nimmt Siemens das AR1 selbst wieder her.
Mit dem ADR2 muss man mehr aufpassen, wg. Multiinstanzoffset.

Sollte Du mehr wissen wollen, frag einfach nach.
Schönen Gruss
Nils
 
Zuviel Werbung?
-> Hier kostenlos registrieren
godi schrieb:
Hallo!

Gibt es einen Befehl mit dem ich einen Pointer vom Adressregister subtrahieren kann? Beim addieren gehts ja mit +AR1.

Habs jetzt mal so gemacht:
TAR1
SLD 4
DEC 1
SRD 4
LAR1
Es funktioniert zwar nur ist das sicher? Nicht das ich mal die falsche Adresse bekomme.

Godi

Hi Godi
ein bisschen sprachlos bin ich schon
TAR1. ok jetzt ist der Wert von AR1 im AKKU, aber dann??
SLD 4, ---- 4 Bits nach links schieben?? Was soll das? von rechts werden NULLEN nachgeschoben! Um 4 Bit links schieben ist gleichbedeutend einer Multiplikation mit 16! Da stimmt doch was nicht oder ist das tricky?
DEC 1, verändert NUR das niederwertigste Byte des AKKUS!!!!!!!!! Nicht aber die anderen höherwqertigen Bytes des AKUS. Mit TAR1 hast du ein DWORD in den AKKU geladen und DEC kann auf ein DWORD nicht angewendet werden!!!!!
Also IMHO läuft da ganz kräftig was schief.

Was soll dein Code nach deiner Ansicht bewirken?

Gruß Barnee
 
ein wenig zu tricky

Hallo godi

dein Code ist ein klein wenig zu trickreich!

Wenn schon schieben, dann wäre in diesem Fall rotieren angesagt gewesen, damit die geschobenen Bits nicht einfach verschwinden (ROL/ROR).
Abgesehen davon, DEC auf Doppelworte anzuwenden ist absolut tabu.
 
Hallo!

Naja mein Gedankengang war der das ich den Pointer im Akku 1 um 4 Stellen nach links verschiebe damit ich im LL Byte nur die Bitadresse stehen habe. Der Pointer ist, glaub ich, ja so aufgebaut (Im Akku):
yyyyyyyyyyyyxxx
y für Byteadresse und x für Bitadresse
Nachdem ich jetzt nur mehr im untersten Byte die Bitadresse stehen habe, habe ich mir gedacht ich kann das Dekrementieren. Naja ist wohl nicht die bessere Lösung

Danke für eure Hilfe.
Mfg Godi
 
Hallo!

Ist der P#8191.7 der maximalwert der im AR stehen kann?
Also wenn das AR überläuft dann fängt er bei null wieder an und schreibt die Differenz die noch fehlt ins AR?

Godi
 
Nur der Vollstätigkeit halber...

Wenn du das mit schieben machst, dann nur mit 3 Stellen. Und auch nur wenn du vom Pointer eine Byteadresse abziehen möchtest. Wenn du ein Bit abziehen möchtest, kannst du einfach das Doppelwort -1 rechnen. Wie oben schon geschrieben solltest du das aber nicht mit "inc" machen, da das nur auf ein Byte wirkt.

Torsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
godi schrieb:
Hallo!

Ist der P#8191.7 der maximalwert der im AR stehen kann?
Also wenn das AR überläuft dann fängt er bei null wieder an und schreibt die Differenz die noch fehlt ins AR?

Godi

Nein. Alle Werte größer als 4095.7 werden als negativen Adresswerte interpretiert, und zwar im 2er-Komplement.

Gruß
Ernie ohne Bert
 
Zurück
Oben