Shiften und Rotation: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 11: Zeile 11:
<syntaxhighlight lang="asm">  
<syntaxhighlight lang="asm">  
LSL Rd, Rn, #shift
LSL Rd, Rn, #shift
<\syntaxhighlight>
</syntaxhighlight>


* `Rd`: Zielregister   
* `Rd`: Zielregister   
Zeile 21: Zeile 21:
<syntaxhighlight lang="asm">  
<syntaxhighlight lang="asm">  
LSL X0, X1, #3  // X0 = X1 << 3
LSL X0, X1, #3  // X0 = X1 << 3
<\syntaxhighlight>
</syntaxhighlight>
Dies verschiebt die Bits in `X1` um 3 Stellen nach links.
Dies verschiebt die Bits in `X1` um 3 Stellen nach links.


Zeile 32: Zeile 32:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
LSR Rd, Rn, #shift
LSR Rd, Rn, #shift
<\syntaxhighlight>
</syntaxhighlight>


==== Beispiel ====
==== Beispiel ====
Zeile 38: Zeile 38:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
LSR X0, X1, #2  // X0 = X1 >> 2
LSR X0, X1, #2  // X0 = X1 >> 2
<\syntaxhighlight>
</syntaxhighlight>
Dies verschiebt die Bits in `X1` um 2 Stellen nach rechts.
Dies verschiebt die Bits in `X1` um 2 Stellen nach rechts.
---


=== Arithmetic Shift Right (ASR) ===
=== Arithmetic Shift Right (ASR) ===
Zeile 50: Zeile 48:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
ASR Rd, Rn, #shift
ASR Rd, Rn, #shift
<\syntaxhighlight>
</syntaxhighlight>


==== Beispiel ====   
==== Beispiel ====   
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
ASR X0, X1, #2  // X0 = X1 arithmetisch >> 2
ASR X0, X1, #2  // X0 = X1 arithmetisch >> 2
<\syntaxhighlight>
</syntaxhighlight>
Dies eignet sich für signierte Division durch Potenzen von 2.
Dies eignet sich für signierte Division durch Potenzen von 2.


Zeile 66: Zeile 64:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
ROR Rd, Rn, #shift
ROR Rd, Rn, #shift
<\syntaxhighlight>
</syntaxhighlight>


==== Beispiel ====   
==== Beispiel ====   
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
ROR X0, X1, #4  // X0 = X1 rotierte 4 Bits nach rechts
ROR X0, X1, #4  // X0 = X1 rotierte 4 Bits nach rechts
<\syntaxhighlight>
</syntaxhighlight>
Wenn `X1 = 0b1101_0001`, wird es zu `0b0001_1101`.
Wenn `X1 = 0b1101_0001`, wird es zu `0b0001_1101`.



Aktuelle Version vom 8. April 2025, 12:23 Uhr

In der ARM64-Assemblerprogrammierung spielen Shift- und Rotationsoperationen sowie der Umgang mit dem Carry-Flag eine wichtige Rolle für die Manipulation von Bits in Registern. Hier ist eine detaillierte Übersicht:

Shiften (Bitverschiebung)

Logical Shift Left (LSL)

  • Verschiebt die Bits eines Registers nach links.
  • Mit jedem Shift-Schritt wird rechts eine `0` eingefügt.
  • Kann verwendet werden, um Werte zu multiplizieren (z. B. mit Potenzen von 2).

Syntax:

 
LSL Rd, Rn, #shift
  • `Rd`: Zielregister
  • `Rn`: Quellregister
  • `#shift`: Anzahl der Bitverschiebungen

Beispiel

 
LSL X0, X1, #3  // X0 = X1 << 3

Dies verschiebt die Bits in `X1` um 3 Stellen nach links.

Logical Shift Right (LSR)

  • Verschiebt die Bits eines Registers nach rechts.
  • Mit jedem Shift-Schritt wird links eine `0` eingefügt.
  • Kann verwendet werden, um Werte zu dividieren (z. B. durch Potenzen von 2).

Syntax:

LSR Rd, Rn, #shift

Beispiel

LSR X0, X1, #2  // X0 = X1 >> 2

Dies verschiebt die Bits in `X1` um 2 Stellen nach rechts.

Arithmetic Shift Right (ASR)

  • Verschiebt die Bits eines Registers nach rechts, behält aber das Vorzeichen bei.
  • Das höchstwertige Bit (Sign-Bit) wird aufgefüllt, um den Wert konsistent zu halten (z. B. bei negativen Zahlen im Zweierkomplement).

Syntax:

ASR Rd, Rn, #shift

Beispiel

ASR X0, X1, #2  // X0 = X1 arithmetisch >> 2

Dies eignet sich für signierte Division durch Potenzen von 2.

Rotation

Rotate Right (ROR)

  • Verschiebt die Bits eines Registers nach rechts und "dreht" die herausfallenden Bits zurück auf die linke Seite.
  • Die Bitanzahl bleibt unverändert.

Syntax:

ROR Rd, Rn, #shift

Beispiel

ROR X0, X1, #4  // X0 = X1 rotierte 4 Bits nach rechts

Wenn `X1 = 0b1101_0001`, wird es zu `0b0001_1101`.

Carry-Flag und Rotation mit Carry

Der Carry-Flag wird bei Shifts oder Rotationen verwendet, wenn:

  1. Ein Bit aus dem Register "herausfällt".
  2. Dieses Bit in das Carry-Flag geschrieben wird.

Einsatz von Carry-Flag

  • Wird vor allem für Mehrwort-Arithmetik (z. B. 128-Bit-Operationen mit zwei 64-Bit-Registern) oder für rotierende Operationen verwendet.

Zusammenfassung der Unterschiede

Operation Verhalten Auffüllung links/rechts
LSL Linksverschiebung, rechts `0` Rechts `0`
LSR Rechtsverschiebung, links `0` Links `0`
ASR Rechtsverschiebung mit Vorzeichenbit Links Vorzeichenbit
ROR Rotation nach rechts, wieder einfügen -