Dint Vorzeichen immer minus einstellen

bludie

Level-2
Beiträge
45
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich würde gerne bei einem Dint-Wert immer das Vorzeichen auf minus einstellen. Egal ob dieser schon auf minus steht oder nicht.
Allerdings habe ich für den benötigten Programmcode nicht das Wissen des Befehlsvorrats.
Sicherlich wisst ihr hierfür eine Lösung.
Gruß bludie
 
Hallo,
einfach per Vergleich überprüfen, ob die Zahl kleiner 0 ist. Wenn ja, dann nichts machen, wenn nein, dann mit -1 multiplizieren ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bei den Zahlenformat DINT kannst du das höchste Bit 2^31 immer auf "1"
setzen, das könnte vlt wie folgt aussehen. Der wert 8000 0000 hex ist das
Vorzeichen Bit und wird einfach mit deiner Var "oder" genommen und deiner
Variabel zurückgeschrieben.

Code:
L "Variabel"
L DW#16#8000 0000
OD
T "Variabel"
 
@Helmut:
ich bin mit deiner Lösung nicht so recht einverstanden.
Vergleich doch im Hex-Format mal den Wert von 1 und -1 - der Unterschied ist dabei NICHT das Vorzeichenbit ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Helmut: einfach das Vorzeichen-Bit setzen ist nicht korrekt.

So wird's was (optimierter Code):
Code:
      L     MD   100
      NEGD                  // * -1
      SPMZ  M001            // wenn jetzt negativ oder 0 -> dann übernehmen
      NEGD                  // war jetzt positiv -> nochmal * -1
M001: T     MD   100

Gruß
Harald
 
@Helmut
Das oberste Bit ist schon das Vorzeichenbit. Nur werden die Zahlen nicht einfach mit dem gesetzten Bit sondern als Zweierkomplement dargestellt. -1 entspricht dabei 0xFFFFFFFF, -2 entspricht 0xFFFFFFFE etc.
Das Zwierkomplement bekommst Du durch negieren aller Bits und addieren von 1
Beispiel:
Ausgang 0x00000001
Negieren 0xFFFFFFFE
Addieren 0xFFFFFFFF
 
Ich wäre nie auf die Idee gekommen, das Vorzeichen mit dem NEGD-Befehl zu ermitteln.
Als alter Z80- und 80x86-Assembler-Programmierer bin ich es gewohnt mit möglichst wenig Akku-Registern auszukommen.
Deshalb arbeite ich auch gern mit den Statusbits als Operations-Ergebnis statt zusätzliche Vergleiche anzustellen.
Extra eine 0 zu laden und dann zu vergleichen ist mir für diese Aufgabe zu langweilig. ;)

Gruß
Harald
 
Danke für die schnelle und unkomplizierte Hilfe

Hallo,
erst mal ein dickes Lob an das Forum. So schnelle Hilfe hatte ich gar nicht erwartet.
@Harald
Super einfacher Code. Funzt bestens.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Als alter Z80- und 80x86-Assembler-Programmierer ...
insofern bin ich von dem 6502 sehr verwöhnt worden. Der hat die Flags bereits beim Ladebefehl gesetzt.
http://www.htu.tugraz.at/~herwig/6502/lda.php
Als ich dann mit der 80er-Welt in Berührung kam, war das natürlich erstmal lästig, dass diese Prozessoren in dieser Hinsicht recht faul waren. Gut - ich hab mich daran gewöhnt. Und hätte hinter dem NEGD-Befehl halt nicht vermutet, dass der die Flags beeinflusst. Aber klar - NEGD wirft die ALU an, so wie OD z.B. auch. Und das geht auf die Flags (Statuswort).
 
Hallo bludie,

auch wenn es LL nicht gern sieht, daß gleich die Komplett-Lösung geantwortet wird ;)
hier mal zum Vergleich die verstehbare Programmlösung für Deine Aufgabe (so wie von LL und Bienenkönig empfohlen):
Code:
// V2: normal verständlicher Programmcode:
      L     MD   100
      L     0               // (exakt wäre "L L#0", ist aber länger)
      <=D                   // ist MD100 schon negativ oder 0 ?
      SPB   M002            // ja -> kann so bleiben
      POP                   // nein -> MD100 zurück in AKKU1 (TAK geht auch)
      NEGD                  // * -1
      T     MD   100        // MD100 mit -(MD100) überschreiben
M002: NOP   0

// V3: 1 Operation kürzer:
      L     0
      L     MD   100
      >=D                   // ist MD100 schon negativ oder 0 ?
      SPB   M003            // ja -> kann so bleiben
      NEGD                  // nein -> * -1
      T     MD   100        // MD100 mit -(MD100) überschreiben
M003: NOP   0

// will man den Programmablauf genau beobachten, 
// dann das "NOP 0" durch "L MD100" (oder "T MD100") ersetzen
Welche Variante gefällt Dir nun am Besten?
(EDIT: ich sehe schon: die erste "Super einfache" kommt gut an)

insofern bin ich von dem 6502 sehr verwöhnt worden. Der hat die Flags bereits beim Ladebefehl gesetzt.
Ja, das wäre perfekt, wenn der S7-Akku das auch täte.
Immer diese "überflüssigen" Befehle, nur damit die Flags auswertbar werden ...

Gruß
Harald
 
auch wenn es LL nicht gern sieht, daß gleich die Komplett-Lösung geantwortet wird ;)

Nan-na Harald,
so schlimm bin ich doch auch nicht.
In dem fall kann man m.E. schon die Komplett-Lösung liefern. Für mich erschien es nur einfacher, das zu beschreiben als den Code hier einzustellen ... ;)
Dein Code-Beispiel fand ich übrigens auch gut - es ist ja um Einiges einfacher :)

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Optimierung

Wenn schon der Perfektionist hier reinschaut, dann will ich zugeben, daß mein Programmcode
aus #6 doch tatsächlich noch verbessert werden kann: ;)
Code:
// V4: schnellere Variante:

      L     MD   100
      NEGD                  // * -1
      SPPZ  M004            // wenn jetzt >= 0 -> dann nichts tun
      T     MD   100        // ist jetzt negativ -> übernehmen
M004: NOP   0
Dieser Code dürfte auf S7-300 ca. 0,1µs schneller sein und beschreibt MD100 nur wenn nötig.

MD100 kann vor diesem Programmstück nur positiv sein, wenn er irgendwo geändert wird.
In den allermeisten Zyklen muß die CPU bei meinem Programmcode in #6 1x NEGD und 1x T MD100
überflüssigerweise ausführen (muß also alle 5 Operationen ausführen).
Nun müssen meistens nur noch 3 Operationen ausgeführt werden (das NOP nicht mitgerechnet).

Gruß
Harald
 
Wenn schon der Perfektionist hier reinschaut, dann will ich zugeben, daß mein Programmcode
aus #6 doch tatsächlich noch verbessert werden kann: ;)
Code:
// V4: schnellere Variante:
 
      L     MD   100
      NEGD                  // * -1
      SPPZ  M004            // wenn jetzt >= 0 -> dann nichts tun
      T     MD   100        // ist jetzt negativ -> übernehmen
M004: NOP   0
Dieser Code dürfte auf S7-300 ca. 0,1µs schneller sein und beschreibt MD100 nur wenn nötig.

MD100 kann vor diesem Programmstück nur positiv sein, wenn er irgendwo geändert wird.
In den allermeisten Zyklen muß die CPU bei meinem Programmcode in #6 1x NEGD und 1x T MD100
überflüssigerweise ausführen (muß also alle 5 Operationen ausführen).
Nun müssen meistens nur noch 3 Operationen ausgeführt werden (das NOP nicht mitgerechnet).

Gruß
Harald

harald,
das ist Perfekt, ich denke sogar für den Perfektionisten :ROFLMAO:

Heute wieder einiges gelernt :D
 
aber warum negieren, wenn schon negativ?

Code:
      L     MD   100      
      SP[B][COLOR=Red]M[/COLOR][/B]Z  M004
      NEGD                        
M004: T     MD   100
Hallo 4L,
wenn ich jetzt (zu vorgerückter Stunde) S7 griffbereit hätte, würde ich jetzt zunächst die Hilfe zum Lade-Befehl bemühen. Ich bin mir aber dennoch zu 99% sicher, dass bei S7 der Ladebefehl nicht die Flags (Statuswort) beeinflusst. Ich befürchte, der SPMZ wird nicht Rücksicht auf den Wert in MD100 nehmen.
 
Hallo 4L,
wenn ich jetzt (zu vorgerückter Stunde) S7 griffbereit hätte, würde ich jetzt zunächst die Hilfe zum Lade-Befehl bemühen. Ich bin mir aber dennoch zu 99% sicher, dass bei S7 der Ladebefehl nicht die Flags (Statuswort) beeinflusst. Ich befürchte, der SPMZ wird nicht Rücksicht auf den Wert in MD100 nehmen.

hab es ebenso wenig griffbereit, aber die OP-liste und natürlich hast du recht, leider ... aber man wird doch mal träumen dürfen :rolleyes:
 
Zurück
Oben