Common Patterns in JIT-generated Assembly Code

Hier findet sich eine Sammlung einiger wiederkehrender Muster, die sich im vom JIT-Compiler generierten Code finden lassen. Die Liste ist keineswegs vollständig, und wird immer mal wieder aktualisiert.

NullPointerException-Check

  test   %rbp,%rbp
  je     <label/line>

test führt ein bitweises AND mit beiden Werten durch und setzt entsprechende Flags, relevant ist hierbei das ZERO-FLAG. Dieses wird genau dann gesetzt, wenn beide Werte 0 sind, in diesem Fall also, wenn %rbp (oder andere Register) 0 ist.

je führt einen Sprung genau dann aus, wenn das ZERO-FLAG gesetzt ist, und springt in diesem Fall zu Code, der eine NullPointerException auslöst.

Gleichen Code gibt es natürlich auch unabhängig von NullPointerExceptions, ob es sich dabei um etsprechenden Code handelt, ist am Kontext und am Sprungziel erkennbar.

NOP

  0x000000011da13a98: data16 xchg %ax,%ax

xchg %ax,%ax ist effektiv eine Operation, die nichts macht (eben einen Wert mit sich selbst tauschen). data16 ist ein “instruction prefix”, und dient in diesem Fall nur als Padding. Zusammen ist das also ein 3-Byte großes nop