Programmieren Sie die folgenden kleinen Funktionen in x86-64-Assembler auf einem Blatt Papier oder in einem digitalen Notizbuch. Ziehen Sie auch das Intel SDM heran.
Der Wert des Registers ax
soll verdoppelt werden.
imul ax, ax, 2
— oder — add ax, ax
— oder — shl ax, 1
. Die letzen zwei Möglichkeiten sind effizienter als die Multiplikation.
rax
soll den Konstanten Wert 0x56
erhalten.
mov rax, 0x56
Alle Bits von eax
sollen invertiert werden.
xor eax, 0xffffffff
— oder — not eax
rcx = (eax > edx ? 1 : 0)
xor ecx, ecx
cmp eax, edx
jle .Lless
mov ecx, 1
.Lless:
Man beachte: Das Beschreiben von ecx
setzt die oberen 32 Bits von rcx
auf 0, sodass xor ecx, ecx
das gesamte Register rcx
auf 0 setzt. (xor ecx, ecx
ist in der Codierung ein Byte kürzer als xor rcx, rcx
und wird daher auch von Compilern bevorzugt.)
Alternativlösung ohne Sprung
xor ecx, ecx
cmp eax, edx
setg cl
Man beachte: Das xor
kann nicht entfernt werden, weil cl
nur die untersten 8 Bits beschreibt und den Rest unverändert lässt.