Assembly Reference
x86, x64 and ARM instruction references, registers and calling conventions.
Virtual CPU
Step through x86-64 assembly and watch registers, flags and the stack change.
Architecture
44 results
Instructions28
Opcode-level reference: data movement, arithmetic, control flow and more.
x86-64
Add-with-carry and subtract-with-borrow. The carry flag is folded into the operation, which is exactly how the CPU chains arithmetic across multiple words.
x86-64
Bit-counting instructions: find the first or last set bit, count leading or trailing zeros, or count how many bits are set. The hardware behind ffs, clz and popcount.
x86-64
Test, set, reset or complement a single bit selected by index, capturing the old value in the carry flag. The compact way to manipulate bitfields and flags.
x86-64
Branchless conditional move: copies the source to the destination only when a flag condition holds. The compiler's favourite way to compile a ternary without a jump.
x86-64
Integer division: DIV is unsigned, IDIV is signed. Both read an implicit double-width dividend and return quotient and remainder in fixed registers — and both can fault.
x86-64
Increment and decrement by one. Smaller than ADD/SUB and almost identical — except they deliberately leave the carry flag (CF) untouched.
x86-64
Two's-complement negation — computes 0 minus the operand. Useful for unary minus, absolute value, and as a quick 'is it zero?' carry test.
x86-64
Writes 1 or 0 to a byte operand based on a flag condition. The idiomatic way to turn a comparison into a boolean value without branching.
x86-64
The accumulator-widening instructions that replicate the sign bit before signed division — and the family that explains MOVSX-style behaviour.
x86-64
Atomically exchange two operands. Harmless between registers — but with a memory operand it carries an implicit LOCK, making it a foundational synchronization primitive.
arm64
Core ARM64 instructions — MOV, LDR/STR, B/BL/BLR, CMP, ADD/SUB, and RET — with their encodings and reverse-engineering patterns.
x86-64
x86 string instructions operate on data pointed to by RSI/RDI and are typically combined with REP prefixes to implement bulk memory copy, fill, and scan.
x86-64
x86-64 uses the SYSCALL instruction to enter the kernel; the older INT 0x80 is the 32-bit Linux interface — confusing them leads to incorrect syscall number mapping.
x86-64
The single-byte INT3 instruction (0xCC) raises exception #BP, making it the universal software breakpoint mechanism used by all x86 debuggers.
x86-64
The single-byte 0x90 NOP and its multi-byte variants do nothing except consume cycles and bytes — critical for recognising padding, patching, and anti-analysis.
x86-64
MUL is unsigned widening multiply; IMUL is the signed (and most compiler-used) form with one-, two-, and three-operand variants.
x86-64
Zero-extending and sign-extending moves that widen a smaller source operand into a larger destination — essential for understanding type promotions in decompiler output.
x86-64
Bitwise logical instructions used for masking, flag testing, and bit manipulation; AND and OR set flags while NOT does not.
x86-64
Logical and arithmetic shifts move bits left or right; rotates wrap bits around — all appear heavily in crypto, hashing, and compiler optimisations.
x86-64
ADD computes the sum and SUB the difference of two operands, storing the result and updating all arithmetic flags.
x86-64
Bitwise exclusive-OR; the xor reg,reg idiom is the canonical way to zero a register and is shorter and faster than mov reg,0.
x86-64
CMP subtracts operands and discards the result to set flags; TEST ANDs them and discards the result — both are the standard way to condition a Jcc.
x86-64
The Jcc family transfers control based on EFLAGS bits set by prior CMP, TEST, or arithmetic instructions — the source of all if/loop control flow.
x86-64
CALL pushes the return address and transfers control; RET pops it and jumps back — the backbone of the x86-64 call stack.
x86-64
Unconditionally transfers control to a target address — direct, indirect via register, or indirect via memory.
x86-64
Computes an address expression and stores the result in a register — no memory access occurs, making it a fast arithmetic shortcut.
x86-64
Pushes a value onto the stack (decrements RSP, then writes) or pops one off (reads, then increments RSP).
x86-64
The fundamental data-transfer instruction: copies a value between registers, memory and immediates without affecting flags.
Registers5
General-purpose, flags, segment and SIMD registers and how they alias.
arm64
ARM64 provides 31 general-purpose registers (X0–X30) with 32-bit W-aliases, plus SP, LR, PC, and PSTATE — each with a defined ABI role.
x86-64
Overview of the x86-64 SIMD register file — XMM (128-bit, SSE), YMM (256-bit, AVX), and ZMM (512-bit, AVX-512) — and their aliasing relationship.
x86-64
In 64-bit user mode FS and GS are repurposed as thread-local and process-local base pointers — FS on Linux points to the TLS block, GS on Windows to the TEB.
x86-64
The 64-bit RFLAGS register holds status, control, and system flags that arithmetic and logical instructions set — conditional jumps and SETcc read these bits.
x86-64
The 16 general-purpose registers (RAX–R15) with their byte, word, and dword sub-register aliases — and their conventional roles in the System V and Microsoft ABIs.
Calling Conventions3
How arguments, return values and saved registers cross function calls.
arm64
How AArch64 passes arguments and return values: x0–x7 for the first eight integer args, x8 for indirect results, and the link register x30 for the return address.
x86
cdecl, stdcall, fastcall and thiscall — the stack-based 32-bit ABIs you still meet in legacy Windows binaries, malware and DLLs. Who passes args where, and who cleans up.
x86-64
How arguments, return values and registers are passed across function calls in the System V (Linux/macOS) and Microsoft x64 ABIs.
Concepts8
The stack, addressing modes, flags, endianness and instruction encoding.
general
How ELF programs call functions in shared libraries: the Procedure Linkage Table trampolines, the Global Offset Table holds resolved addresses, and lazy binding fills them in on first call.
general
Page permissions — read, write, execute — and the W^X rule that no page is both writable and executable. The mitigation that turned simple shellcode injection into ROP.
general
Why modern binaries load at a random base address every run, how position-independent code uses RIP-relative addressing to cope, and what that means for reversing and exploitation.
x86-64
x86-64 instructions are variable-length, built from up to six fields: prefixes, opcode, ModRM, SIB, displacement, and immediate — understanding this is critical for disassembly and shellcode analysis.
general
Endianness describes the byte order in which multi-byte values are stored in memory — x86/x64 is little-endian while network protocols and many file formats are big-endian.
general
Two's complement is the universal encoding of signed integers on x86-64 — understanding it explains why negation is ~x+1, and how overflow and sign extension work.
x86-64
x86-64 memory operands follow the base + index*scale + displacement formula, encoded in the ModRM and SIB bytes — understanding them is essential for reading any memory access.
general
The call stack is a LIFO region of memory managed by RSP where function frames, saved registers, return addresses, and local variables live.