Shiften und Rotation
mov x0, #0b00000011 // Lege 3 nach x0 (GDB p /t $x0)
lsl x0,x0,#4
// -> 00110000
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:
---
- **1. 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:**
```asm LSL Rd, Rn, #shift ``` - `Rd`: Zielregister - `Rn`: Quellregister - `#shift`: Anzahl der Bitverschiebungen
- Beispiel:**
```asm 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:**
```asm LSR Rd, Rn, #shift ```
- Beispiel:**
```asm 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:**
```asm ASR Rd, Rn, #shift ```
- Beispiel:**
```asm ASR X0, X1, #2 // X0 = X1 arithmetisch >> 2 ``` Dies eignet sich für signierte Division durch Potenzen von 2.
---
- **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:**
```asm ROR Rd, Rn, #shift ```
- Beispiel:**
```asm ROR X0, X1, #4 // X0 = X1 rotierte 4 Bits nach rechts ``` Wenn `X1 = 0b1101_0001`, wird es zu `0b0001_1101`.
---
- **3. 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 | - |