Skizzieren Sie in den folgenden Grafiken die Funktionsweisen der unterschiedlichen Schiebeoperationen der x86-Architektur. Welche mathematische Bedeutung haben die einzelnen Operationen?
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:
rax = rdx * 256
mov rax, rdx
shl rdx, 8
r12d = r12d / 65536
shr r12d, 16
rdi = -3 * rsi
mov rdi, rsi
shl rsi, 2 // Annahme, dass rsi nicht mehr benötigt wird
sub rdi, rsi