AsAssembly · Lesson 10 of 10
x86-64 Assembly Cheatsheet
Registers, instructions, and calling convention on one page.
x86-64 ASM
; ── Registers (64-bit) ──────────────────
; rax return value / accumulator
; rdi rsi rdx rcx r8 r9 <- args 1-6 (System V ABI)
; rsp stack pointer rbp frame pointer
; rbx r12-r15 callee-saved (restore before ret)
; 32-bit halves: eax, edi... 16: ax 8: al
; ── Moving data ─────────────────────────
mov rax, 42 ; register <- constant
mov rax, rbx ; register <- register
mov rax, [rbx] ; load from memory at rbx
mov [rbx], rax ; store to memory
lea rax, [rbx + 8] ; compute address (no load)
; ── Arithmetic ──────────────────────────
add rax, 5 ; rax += 5
sub rax, rbx
imul rax, rbx ; signed multiply
inc rax ; rax++
neg rax
and/or/xor rax, rbx ; bitwise
xor rax, rax ; idiomatic: rax = 0
shl rax, 3 ; << 3 (×8)
shr rax, 1 ; >> 1 (÷2)x86-64 ASM
; ── Compare & jump ──────────────────────
cmp rax, rbx ; sets flags (subtract, discard)
je label ; == jne !=
jl label ; < signed jg > signed
jle jge ; <= >= jb/ja unsigned
jmp label ; unconditional
; if (rax == 0) goto done:
test rax, rax ; cheaper than cmp rax, 0
jz done
; a loop (for i = 5; i > 0; i--):
mov rcx, 5
loop_top:
; ... body ...
dec rcx
jnz loop_top
; ── Stack & functions ───────────────────
push rax ; rsp -= 8; store
pop rbx ; load; rsp += 8
call func ; push return addr; jump
ret ; pop return addr; jump back
func: ; standard prologue/epilogue
push rbp
mov rbp, rsp
sub rsp, 16 ; local space (keep 16-aligned)
; ... body: args in rdi, rsi...; result -> rax
leave ; mov rsp,rbp ; pop rbp
ret
; ── Syscalls (Linux) ────────────────────
; rax = number, args in rdi rsi rdx; then 'syscall'
; 0 read | 1 write | 2 open | 60 exit
mov rax, 60
xor rdi, rdi ; exit code 0
syscall
; nasm -felf64 prog.asm && ld prog.o -o prog
; gdb ./prog | objdump -d prog