Assembly
x86 vs x86-64
Syscall register conventions
32-bit syscalls go through int 0x80, 64-bit through syscall. Number in eax/rax, the rest of
the args in completely different registers:
| Purpose | 32-bit (int 0x80) | 64-bit (syscall) |
|---|---|---|
| Syscall number | eax | rax |
| Arg 1 | ebx | rdi |
| Arg 2 | ecx | rsi |
| Arg 3 | edx | rdx |
| Arg 4 | esi | r10 |
| Arg 5 | edi | r8 |
| Arg 6 | ebp | r9 |
| Return value | eax | rax |
| Instruction | int 0x80 | syscall |
Remember: arg 4 is r10, not rcx — syscall clobbers (overwrites) rcx (and r11) itself.
Common syscall numbers
The same call has a different number in each mode:
| System Call | 32-bit | 64-bit |
|---|---|---|
| read | 3 | 0 |
| write | 4 | 1 |
| open | 5 | 2 |
| close | 6 | 3 |
| exit | 1 | 60 |
Examples
write hello world, 32-bit:
asm
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg ; buffer
mov edx, len ; length
int 0x80write hello world, 64-bit:
asm
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg ; buffer
mov rdx, len ; length
syscallexit, 32-bit:
asm
mov eax, 1 ; sys_exit
mov ebx, 0 ; exit code
int 0x80exit, 64-bit:
asm
mov rax, 60 ; sys_exit
mov rdi, 0 ; exit code
syscallStuff to remember
eprefix vsrprefix, plus 64-bit gets extrar8-r15- args land in different registers entirely — can't just copy-paste a 32-bit syscall
- numbers differ per mode (write: 4 vs 1)
- instruction changes too:
int 0x80<->syscall