x86-64
Registers
General Purpose Registers (64-bit)
- RAX, RBX, RCX, RDX
- RSI, RDI, RBP, RSP
- R8-R15
Segment Registers
- CS, DS, ES, FS, GS, SS
Index Registers
- RSI (Source Index)
- RDI (Destination Index)
Data Movement
MOV: Move data between registers or memory
- MOV reg, imm
- MOV reg, mem
- MOV mem, reg
Arithmetic and Logic
ADD, SUB, IMUL, IDIV, INC, DEC
- ADD dest, src
- SUB dest, src
- IMUL dest, src (signed multiplication)
- IDIV divisor (signed division)
- INC reg/mem, DEC reg/mem
AND, OR, XOR, NOT
- AND dest, src
- OR dest, src
- XOR dest, src
- NOT reg/mem
Control Flow
JMP, JE (Jump if Equal), JNE (Jump if Not Equal), JG, JL, JGE, JLE
- JMP label
- JE label
- JNE label
- JG label (greater)
- JL label (less)
- JGE label (greater or equal)
- JLE label (less or equal)
CALL, RET
- CALL procedure
- RET
Comparison
CMP: Compare two values
- CMP operand1, operand2
Stack
PUSH, POP
- PUSH reg/mem
- POP reg/mem
System Calls
SYSCALL
- Used for making system calls in x64 assembly.
Example Code
section .data
my_variable dq 42 ; Define a 64-bit variable with initial value 42
section .text
global _start
_start:
MOV RAX, my_variable ; Load my_variable into RAX
ADD RAX, 8 ; Add 8 to RAX
MOV RBX, 10 ; Load 10 into RBX
CMP RAX, RBX ; Compare RAX and RBX
JE equal_label ; Jump to equal_label if RAX equals RBX
JNE not_equal_label ; Jump to not_equal_label if RAX doesn't equal RBX
equal_label:
; Code to execute if RAX equals RBX
JMP end_label ; Jump to end_label
not_equal_label:
; Code to execute if RAX doesn't equal RBX
end_label:
; Code to execute at the end of the program
MOV RAX, 60 ; syscall: exit
XOR RDI, RDI ; status: 0
SYSCALL