x86-64 Assembly
Purpose
Guide agents through x86-64 assembly: reading compiler output, understanding the ABI, writing inline asm, and common patterns.
Triggers
- "How do I read the assembly GCC generated?"
- "What are the x86-64 registers?"
- "What is the calling convention on Linux/macOS?"
- "How do I write inline assembly in C?"
- "How do I use SSE/AVX intrinsics?"
- "This assembly uses
%rsp/%rbp— what does it mean?"
Workflow
1. Generate and read assembly
2. x86-64 registers
3. System V AMD64 ABI (Linux, macOS, FreeBSD)
Integer/pointer argument registers (in order):
%rdi, %rsi, %rdx, %rcx, %r8, %r9
Floating-point argument registers:
%xmm0–%xmm7
Return values:
- Integer:
%rax(low),%rdx(high if 128-bit) - Float:
%xmm0(low),%xmm1(high)
Caller-saved (scratch): %rax, %rcx, %rdx, %rsi, %rdi, %r8–%r11, %xmm0–%xmm15
Callee-saved (must preserve): %rbx, %rbp, %r12–%r15
Stack: 16-byte aligned before call; call pushes 8 bytes → 16-byte aligned at function entry after prologue.
Red zone: 128 bytes below %rsp may be used by leaf functions without adjusting %rsp. Not available in kernel/signal handlers.
4. Common instruction patterns
5. AT&T vs Intel syntax
GCC emits AT&T by default. Use -masm=intel for Intel syntax.
6. Inline assembly (GCC extended asm)
Constraint codes:
"r"— any general register"m"— memory operand"i"— immediate integer"a","b","c","d"— specific registers (%rax, %rbx, %rcx, %rdx)"="prefix — output (write-only)"+"prefix — read-write"memory"clobber — tells compiler memory may be modified (barrier)
7. SSE/AVX intrinsics (preferred over inline asm)
Check CPU support at compile time: -mavx2 or -march=native.
Check at runtime: __builtin_cpu_supports("avx2").
For a full register and instruction reference, see references/reference.md [blocked].
Related skills
- Use
skills/low-level-programming/assembly-armfor AArch64/ARM assembly - Use
skills/compilers/gccfor-S -masm=intelflag details - Use
skills/debuggers/gdbfor stepping through assembly (si,ni,x/i)


