Maschinensprache

Hallo,

Warum werden in der Maschinensprache arithmetische-Versionen der Schiebebefehle shift left logical (sll)und shift left logical variable (sllv) nicht gebraucht ? Irgendwie komm ich nicht ganz hinter. Wäre echt super wenn mir das jemand etwas ausführlicher beschreiben könnte, weil mein Buch hier etwas verbal ist.

Danke

Hallo Nick

Warum werden in der Maschinensprache arithmetische-Versionen
der Schiebebefehle shift left logical (sll)und shift left
logical variable (sllv) nicht gebraucht ? Irgendwie komm ich
nicht ganz hinter. Wäre echt super wenn mir das jemand etwas
ausführlicher beschreiben könnte, weil mein Buch hier etwas
verbal ist.

sal ist iirc identisch zu shl , aber sar ist *nicht*
identisch zu shr , daher kann es Situationen geben, wo
man mit sar einen Taktzyklus einspart. Oder so.

Grüße

CMБ

Hi,

Warum werden in der Maschinensprache arithmetische-Versionen
der Schiebebefehle shift left logical (sll)und shift left
logical variable (sllv) nicht gebraucht ?

Was verstehst Du unter „der“ Maschinensprache? Jeder Prozessortyp hat seine eigene. Wenn ich den guten alten Motorola 6510 aus dem C64 betrachte, so kennt er die Befehle

ASL Arithmetic shift left
LSR Logical shift right

Beim 68000 haben wir dann schon ASL, ASR, LSL, LSR.

Auch die Intel-Prozessoren können logisch und arithmetisch shiften (SAL/SAR, SHL/SHR).

Vielleicht wäre zu diesem Punkt wie auch zum Gesamtkontext Deiner Frage eine etwas genauere Angabe hilfreich:

weil mein Buch hier etwas verbal ist.

Welches ist denn „Dein“ Buch? (Ich hab sogar mehrere :smile:

Gruß
Ralf

Es handelt sich um Assemblersprache. Wir nehmen zur Zeit SPIM durch.
Aber die Antworten sind jetzt auch nich gerade präzise :wink:

OK, eine Simulation zu Trainigszwecken also. Da kann der Grund durchaus der sein, dass arithmetischer und logischer Links-shift sich gleich verhalten, im Gegensatz zum Rechts-shift.

Siehe zett Be in der englischen Wikipedia:

http://en.wikipedia.org/wiki/Logical_shift
http://en.wikipedia.org/wiki/Arithmetic_shift

Das Bild zur Illustration von „arithmetic shift left“ ist dieselbe (sic!) Grafik wie zur Illustration von „logical shift left“.

Bei beiden Operationen wird eine 0 ins LSB nachgeschoben. Beim Rechts-shift dagegen wird beim „logischen“ Schieben eine 0 ins MSB geschoben, während die arithmetische Variante das MSB (= Vorzeichen) nach rechts kopiert.

Gruß,
Ralf

…und warum braucht man das jetzt nicht ? :smile:

Hallo Fragewurm,

Das arithmetische Shiften bezieht sich auf Zahlen im 2er-Komplement.

Das Vorzeichen befindet sich dabei im MSB.

ASR entspricht eine Division durch 2. Das Vorzeichen muss also erhalten bleiben, was dem Kopieren des alten MSB ins Resultat entspricht.

ASL entspricht einer Multiplikation mit 2.
Dabei ist das Resultat IMMER eine gerade Zahl, also ist das LSB auch immer 0.

Um beliebig lange Zahlen mit 2 zu Multiplizieren, muss man also das das MSBit des LSByte zwischenspeichern und das LSBit des LSByte mit einer 0 auffüllen. Bei den weiteren Bytes muss dann das zwischengespeicherte MSBit des vorhergenden Bytes in das LSBit einschieben und das MSBit wieder zwischenspeichern.

Praktisch wird meist als Zwischenspeicher das Carry-Bit verwendet.

Die Multiplikation einer beliebig langer Zahl kann dann folgendermassen bewerkstelligt werden:

ASL Byte1
ROL Byte2
ROL Byte3
usw. …
Hie spielt es dann ekine Rolle ob die Zahl mit oder ohne Vorzeichen ist, es kann aber einen Überlauf geben und das Resultat mit endlicher Länge ist dann ungültig.

Bei der Division durch 2 sieht es etwas anders aus, hier muss man vorher wissen ob mit Zahlen mit oder ohne Vorzeichen gerechnet wird!
Bei 4 Bytes MIT Vorzeichen sieht es so aus:

ASR Byte4 ; Das Vorzeichen muss dupliziert werden
ROR Byte3
ROR Byte2
ROR Byte1

Mit OHNE Vorzeichen:
LSR Byte4 ; es gibt kein Vorzeichen
ROR Byte3
ROR Byte2
ROR Byte1

MfG Peter(TOO)