Seite 3 von 6

Verfasst: 14.08.2008 22:32
von AND51
Signed Shifts?
Was ist das? Heißt das, wenn das Vorzeichenbit (das ganz links) 1 ist, wird das Ergebnis beim rechts-shifting nicht vorgenullt, sondern "vorge-einst"?

Was macht das für einen Sinn, bringt das Vorteile?

Wenn das nämlich ein zusätzliches &1 erfordert, bedeutet das ja für die CPU einen zusätzlichen Arbeitsschritt mehr, sodass sich die Arbeit hier gar nicht lohnt...?

Verfasst: 14.08.2008 22:39
von ZeHa
Das erfordert eben kein zusätzliches &1, weil es auch hierfür wieder eine fertige Operation gibt (SAR, zusätzlich zum normalen SHR).

Man darf da nicht denken daß jeder einzelne Schritt berücksichtigt werden muß, es gibt für vieles mehrere Operationen. Genau wie bei den Jump-Befehlen, da käme man theoretisch auch mit weitaus weniger aus, und dennoch gibt's da für jede erdenkliche Kombination einen eigenen Befehl.

Verfasst: 14.08.2008 22:51
von AND51
OK, funktionieren tut's ja auch ohne &1, ich bekomme ja wie gewünscht -1 für negative und 0 für positie Zahlen.
Aber der Term 1<<31>>31 hat mich schon überrascht, weil das ja nach "normalem" Verständnis wieder 1 ergeben soll(te).

Ich wusste das mit den Signed Shifts nicht, sonst hätte ich das Kaeru Gaman sofort erklären können.

@ Kaeru:

Code: Alles auswählen

v=-5
sign = 1|v>>31
Ich erkläre es dir: :)

Zunächst wird das Vorzeichenbit (jenes ganz links) ganz nach rechts verschoben.
Normalerweise wäre das Ergebnis in PB-Schreibweise jetzt %1.
Durch den erwähnten signed Shift wird %1 aber nicht vorgenullt, sondern mit Einsen aufgefüllt.
Das bedeutet, dass das Ergebnis %11111111111111111111111111111111 (32 Einsen) ist.
Das Vorzeichenbit ganz links bleibt also 1. Und wenn das Vorzeichenbit TRUE ist, dann ist die Zahl negativ.

Zum Schluss wird noch |1 angewendet. Das bitweise Oder. Da das ganz rechte Bit im Ergebnis aber 1 ist, hat das |1 keine Wirkung, das Ergebnis bleibt TRUE.

Somit erhalten wir als Resultat -1.



Zum besseren Versändnis mit einer positiven Zahl:
5 = %101 = %00000000000000000000000000000101
Zunächst der Rechtsschift:
%00000000000000000000000000000101>>31 = %0.
Mit anderen Worten: die Null, also das Vorzeichenbit wird nach rechts geholt. Das Ergebnis ist 0. Hier kommt das singed Shifting nicht zum Tragen, da das Vorzeichenbit beim Rechtsshifting FALSE ist.

Zum Schluss noch |1 drüberziehen: 0|1 ergibt 1.



Alles ok?
q.e.d. :allright:

Verfasst: 14.08.2008 23:07
von Kaeru Gaman
ja ich hab nicht ans signed shift gedacht (hatte das vor ner weile schon mal),
sonst wär ich auch so drauf gekommen.

...kann ich mich irgendwie nicht dran gewöhnen, dass PB nicht unsigned shiftet...

sollte mir endlich mal ausgiebig aktuellen Assembler reinziehn...
seit dem 6502 / 6510 hab ich kein Assembler mehr geproggt.
hatte mal ne Befehlsreferenz für nen 80286 durchgeblättern, das ist nicht ganz dasselbe... :lol:

für FASM gibts doch bestimmt umsonstig ne Doku runterzuladen, gelle?

Verfasst: 14.08.2008 23:09
von ZeHa
Hehe, ich mach zur Zeit an der FH ein C64-Projekt mit dem 6502 bzw. 6510 :mrgreen:

Zum Thema signed/unsigned shiften: unter Java gibt's dafür 3 Operatoren, nämlich <<, >> und >>>. Möglicherweise könnte man sowas für PB ja auch einführen.

Verfasst: 14.08.2008 23:20
von AND51
Assembler?
Ich hoffe, das wird nicht zu offtopic, aber gibt es Arbeitsmaterial bzw. Tutorials, mit denen ich ASM auch kennen und nutzen lernen kann?
Speziell dann auch, wie man (F)ASM in PB einsetzen kann.
Ich habe schon mal einen derartigen EInstieg probiert, hängen geblieben ist nur noch was mit den EAX bis EDX Registern, sowie INC und DEC... :oops:
Lohnt sich die Mühe überhaupt bzw. kann man ASM evtl. sogar im Beruf gebrauchen?

Verfasst: 15.08.2008 04:23
von Helle
Bin grad ausser Kneipe zurück und schau hier mal wieder rein. Jungs, seid ihr sicher zu wissen, von was ihr redet :mrgreen: ?

Gruß
Helle

Verfasst: 15.08.2008 06:52
von Danilo
ZeHa hat geschrieben:Das erfordert eben kein zusätzliches &1, weil es auch hierfür wieder eine fertige Operation gibt (SAR, zusätzlich zum normalen SHR).
Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51:
AND51 hat geschrieben:// Edit:
Hilfe, was ist hier los?

Code: Alles auswählen

one=1
Debug Bin(one<<31>>31)
Hier müsste doch 1 das Ergebnis sein?
Da PB nur signed Variablen kennt, nimmt es eben auch bei der
Rechtsverschiebung SAR, wo das oberste Bit nicht mit 0 aufgefüllt
wird, sondern mit dem Vorzeichenbit des Operanden.
War das Vorzeichenbit 1, wird auch wieder mit 1 aufgefüllt.

Was AND51 wollte, war allerdings wieder was ganz anderes -
ich dachte er möchte 1 für Zahlen <0 raushaben, sonst 0.

Code: Alles auswählen

Macro SignL(a)
  ((a>>31)&1)
EndMacro

a = -10
x = SignL(a)
...wäre halt eine Abkürzung für:

Code: Alles auswählen

a = -10
If a < 0
  x = 1
Else
  x = 0
EndIf

Verfasst: 15.08.2008 09:16
von ZeHa
Wir redeten von PB, nicht von ASM. Und ich bezog mich nur auf AND51:
Hab doch gar nix anderes behauptet. Aber AND51 hat ja gefragt ob ein Right Shift mit Vorzeichen ein zusätzliches &1 benötigt (und somit länger dauert), und ich habe ihm lediglich gesagt, daß die CPU dafür eine eigene Operation kennt. Hat doch mit PB oder ASM nix zu tun, wenn PB nur mit Vorzeichen shiften kann, dann wird es wohl SAR benutzen und nicht SHR. So war das gemeint.

Verfasst: 15.08.2008 10:42
von rolaf
Helle hat geschrieben:Bin grad ausser Kneipe zurück und schau hier mal wieder rein. Jungs, seid ihr sicher zu wissen, von was ihr redet :mrgreen: ?

Gruß
Helle
Tja, nen Bierdeckel auszurechnen ist einfacher. :mrgreen: Mir ist das auch zu hoch, was aber völlig egal ist. Solange man auch ohne Verknotungen und Verrenkungen im Kopf zum Ziel kommt.

Aber nun weiter den Spezies lauschen... <)