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