was macht eigetnlcich sra wernn da z.b. sra %l2, 31, %l0 steht?
Ich kann es mir denken, vielleicht eine arithmetische verschiebung, aber was passiert da genau, wenn z. b. %l2, weiss ich nicht, vielleicht 50 ist oder 20 ?
sra %l2, 31, %l0
Dieser Befehl kopiert das Vorzeichenbit von %l2 in alle Bits von %l0.
%l2 positiv: %l0 = 0x00000000
%l2 negativ: %l0 = 0xFFFFFFFF
Sieht aus, als wenn das als Bitmaskenerstellung genutzt wird… in welchem Kontext tritt der Befehl auf?
vielleicht eine arithmetische verschiebung
Richtig. Bei einer arithmetischen Rechtsverschiebung werden die oberen Bits mit dem Vorzeichenbit gefüllt. Bei einer logischen Rechtsverschiebung mit 0.
aber was passiert da genau, wenn z. b. %l2, weiss ich nicht, vielleicht 50 ist oder 20 ?
Wenn die Zahl positiv ist unterscheidet sich der arithmetische Shift ja gar nicht vom logischen.
Sieht aus, als wenn das als Bitmaskenerstellung genutzt wird… in welchem Kontext tritt der Befehl auf?
Der Sun-CC übersetzt "foo = (a >> b)" in sra…
in welchem Kontext tritt der Befehl auf?
Der Sun-CC übersetzt "foo = (a >> b)" in sra…
Naja, der ">>" ist ja auch der Rechtsschiebeoperator. Ob daraus nun ein srl oder sra wird entscheidet dann der Typ von a; vorzeichenbehaftete Zahlen müssen natürlich mit sra behandelt werden, vorzeichenlose mit srl.
EDIT: Falls b eine Variable ist wird das zweite Argument des Shift Befehls natürlich kein Immediate sein sondern ein Register.
EDIT: Chris, inwiefern beantwortet eigentlich Dein Posting meine Frage nach dem Kontext? Ein Shift ist für sich alleine betrachtet ja erstmal bedeutungslos. Ich will wissen, was vor und nach dem foo = … steht [img]
http://www.fb18.de/gfx/25.gif[/img]
Ob daraus nun ein srl oder sra wird entscheidet dann der Typ von a; vorzeichenbehaftete Zahlen müssen natürlich mit sra behandelt werden, vorzeichenlose mit srl.
<edit>
If E1 has a signed type and negative value, the resulting value is implementation-defined.
(c99, 6.5,7, Absatz 5)
</edit>
Sprich: Der Compiler kann auch einfach alles mit srl übersetzen. Oder er kann auch shifts von negativen Werten mit or übersetzen. Oder Dein Haus abfackeln. Er muss es nur dokumentieren.[img]
http://www.fb18.de/gfx/15.gif[/img]
Aha, das hatte ich mich auch schon gefragt. Noch mehr Kopfzerbrechen bereitet mir allerdings, was das "and &l0,-2,%l1" in
ld [%fp+68],%l2
sra %l2,31,%l0
and %l0,1,%l1
add %l2,%l1,%l0
and %l0,-2,%l1
sub %l2,%l1,%i5
zu bedeuten hat.
Setzt das least significant bit auf 0.
ld [%fp+68],%l2 ! "x" nach %l2 laden
sra %l2,31,%l0 ! %l0 = 0 falls x positiv, -1 sonst
and %l0,1,%l1 ! %l1 = 0 falls x positiv, +1 sonst
add %l2,%l1,%l0 ! %l0 = x falls x positiv, x+1 sonst
and %l0,-2,%l1 ! %l1 = auf gerade Zahl abgerundetes %l0
! also x Richtung 0 gerade abgerundet
sub %l2,%l1,%i5 ! %i5 = Divisionsrest von x/2 (Richtung 0 gerundet)
Es hat also den Anschein, dass jemand den Divisionrest bei der Division einer vorzeichenbehafteten Zahl durch 2 erhalten wollte (mit der Rundung Richtung 0 statt zur niedrigeren Zahl)… oder?
vorzeichenbehaftete Zahlen müssen natürlich mit sra behandelt werden, vorzeichenlose mit srl.
If E1 has a signed type and negative value, the resulting value is implementation-defined.
Sprich: Der Compiler kann auch einfach alles mit srl übersetzen. Oder er kann auch shifts von negativen Werten mit or übersetzen.
Halte ich für Unsinn. Das "implementation-defined" wird sich auf die Rundung beziehen (sieht man ja sehr schön an dem geposteten Code), sprich: soll -1 geteilt durch 2 bei -1 bleiben (die -0.5 wird zur nächstniedrigeren Zahl gerundet) oder 0 werden (die -0.5 wird Richtung 0 gerundet)?
Setzt das least significant bit auf 0.
Das hat jetzt sicherlich jeder auf Anhieb verstanden [img]
http://www.fb18.de/gfx/16.gif[/img]
Wenn man mit bitweise-and arbeitet, dann gibt man ja als Bitmaske immer in Form von Einsen an, welche Stellen man BEHALTEN möchte. Falls man aber lieber angeben möchte, welche Stellen man LÖSCHEN möchte, so muss man natürlich die Bitmaske gedanklich per XOR invertieren (x ^ 0xFFFFFF). Dies entspricht aber gerade der Subtraktion von -1 (man überlege sich noch einmal, wie das Zweierkomplement funktioniert).
EDIT: Wenn man also das unterste Bit löschen möchte, subtrahiert man die 1 von der -1 und kommt auf -2.
If E1 has a signed type and negative value, the resulting value is implementation-defined.
Sprich: Der Compiler kann auch einfach alles mit srl übersetzen. Oder er kann auch shifts von negativen Werten mit or übersetzen.
Halte ich für Unsinn. Das "implementation-defined" wird sich auf die Rundung beziehen
Die englische Sprache ist da eigentlich recht eindeutig. "the resulting value is implementation-defined". Vor allem, wenn im Satz vorher der Wert von E1 >> E2 definiert wird, aber nur für die Fälle, dass E1 entweder unsigned, oder signed und nicht-negativ ist.
Dann zeige mir bitte den Compiler, der mein Haus anzündet, wenn ich -128 durch 2 teilen möchte [img]
http://www.fb18.de/gfx/23.gif[/img]
gib mir eine hardware die die funktion "haus anzünden" implementiert [img]
http://www.fb18.de/gfx/28.gif[/img]
Und alle:
And it burns, burns, burns
The C-Compiler
The C-Compiler
ld [%fp+68],%l2 ! "x" nach %l2 laden
sra %l2,31,%l0 ! %l0 = 0 falls x positiv, -1 sonst
and %l0,1,%l1 ! %l1 = 0 falls x positiv, +1 sonst
add %l2,%l1,%l0 ! %l0 = x falls x positiv, x+1 sonst
and %l0,-2,%l1 ! %l1 = auf gerade Zahl abgerundetes %l0
! also x Richtung 0 gerade abgerundet
sub %l2,%l1,%i5 ! %i5 = Divisionsrest von x/2 (Richtung 0 gerundet)
Es hat also den Anschein, dass jemand den Divisionrest bei der Division einer vorzeichenbehafteten Zahl durch 2 erhalten wollte (mit der Rundung Richtung 0 statt zur niedrigeren Zahl)… oder?
Irgendwie habe ich das Gefühl, dass der Compiler mehr macht, als ich eigentlich von ihm wollte… [img]
http://www.fb18.de/gfx/3.gif[/img]
Und alle:
And it burns, burns, burns
The C-Compiler
The C-Compiler
Hey, das Lied kommt auch auf die FB18-Hit-CD. [img]
http://www.fb18.de/gfx/10.gif[/img]
(Ich hoffe nur, niemand hat das Informatikum per ssh abgefackelt. [img]
http://www.fb18.de/gfx/8.gif[/img])
gib mir eine hardware die die funktion "haus anzünden" implementiert [img]http://www.fb18.de/gfx/28.gif[/img]
Alte Trommel(?)-Drucker. Die sind der Grund warum noch heute im Linux-Kernel das ON_FIRE-Flag vorhanden ist [img]
http://www.fb18.de/gfx/24.gif[/img]
gib mir eine hardware die die funktion "haus anzünden" implementiert [img]http://www.fb18.de/gfx/28.gif[/img]
Zum Atari XL gab es die Urban Legend, man könne mit entsprechenden Anweisungen die (nicht modifizierte) Hardware überhitzen und zerstören.
Es hat also den Anschein, dass jemand den Divisionrest bei der Division einer vorzeichenbehafteten Zahl durch 2 erhalten wollte (mit der Rundung Richtung 0 statt zur niedrigeren Zahl)… oder?
Irgendwie habe ich das Gefühl, dass der Compiler mehr macht, als ich eigentlich von ihm wollte… [img]http://www.fb18.de/gfx/3.gif[/img]
Hast Du denn mit einer vorzeichenbehafteten oder vorzeichenlosen Zahlen gearbeitet?
Hey, das Lied kommt auch auf die FB18-Hit-CD. [img]http://www.fb18.de/gfx/10.gif[/img]
(Ich hoffe nur, niemand hat das Informatikum per ssh abgefackelt. [img]http://www.fb18.de/gfx/8.gif[/img])
Dann mach ich den Refrain noch vollständig:
I logged in for my burning C-Compiler
X went down, down, down
And the flames went higher
And it burns, burns, burns
My C-Compiler
My C-Compiler
[img]
http://www.fb18.de/gfx/10.gif[/img]