Kurzprogramme

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.

  1. Der Wert des Registers ax soll verdoppelt werden.

    Lösung

    imul ax, ax, 2 — oder — add ax, ax — oder — shl ax, 1. Die letzen zwei Möglichkeiten sind effizienter als die Multiplikation.

  2. rax soll den Konstanten Wert 0x56 erhalten.

    Lösung

    mov rax, 0x56

  3. Alle Bits von eax sollen invertiert werden.

    Lösung

    xor eax, 0xffffffff — oder — not eax

  4. rcx = (eax > edx ? 1 : 0)

    Lösung
      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.