Shiften und Rotation

Aus C und Assembler mit Raspberry
Version vom 8. April 2025, 07:45 Uhr von Satyria (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „ 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. -…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
   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. **1. Shiften (Bitverschiebung)**
        1. **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.

---

        1. **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.

---

        1. **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.

---

      1. **2. Rotation**
        1. **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`.

---

      1. **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.

        1. **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.

---

      1. 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 | - |