Shifts

Skizzieren Sie in den folgenden Grafiken die Funktionsweisen der unterschiedlichen Schiebeoperationen der x86-Architektur. Welche mathematische Bedeutung haben die einzelnen Operationen?

shl (Shift Left) 31 0 0000 shr (Shift Right) 31 0 sar (Shift Arithmetic Right) 31 0 x

Lösung

shl (Shift Left) 31 0 0000 shr (Shift Right) 31 0 0000 sar (Shift Arithmetic Right) 31 0 x xxxx

  • shl ..., X ist gleichbedeutend mit einer Multiplikation mit 2X.

  • shr ..., X ist gleichbedeutend mit einer vorzeichenlosen Division durch 2X.

  • sar ..., X ist gleichbedeutend mit einer Division durch 2X mit dem zusätzlichen Vorteil, dass vorzeichenbehaftete Zahlen in Zweierkomplementdarstellung korrekt dividiert werden: das Vorzeichen bleibt erhalten.

    Aber: Im Unterschied zu einer Division wird nicht Richtung 0 gerundet, sondern Richtung −∞, d.h. (−1)/2 ist bei einer normalen Division 0, bei einem sar hingegen −1!

Nutzen Sie nun Schiebeoperationen, um folgende Berechnungen möglichst effizient auszuführen:

  1. rax = rdx * 256

    Lösung
    mov rax, rdx
    shl rdx, 8
    
  2. r12d = r12d / 65536

    Lösung
    shr r12d, 16
    
  3. rdi = -3 * rsi

    Lösung
    mov rdi, rsi
    shl rsi, 2   // Annahme, dass rsi nicht mehr benötigt wird
    sub rdi, rsi