文件名: b.s
.data
msg: .ascii "Hello World\n"
.text
.globl main
main:
movq $1, %rax
movq $1, %rdi
movq $msg, %rsi
movq $12, %rdx
syscall
movq $60, %rax
movq $0, %rdi
syscall
编译运行:
user_00@centos:asm> gcc -s b.s -o b
user_00@centos:asm> ./b
Hello World
int 0x80[edit]
On both Linux x86 and Linux x86_64 systems you can make a syscall by calling interrupt 0x80 using the int $0x80
command. Parameters are passed by setting the general purpose registers as following:
Syscall # | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 |
---|---|---|---|---|---|---|
eax | ebx | ecx | edx | esi | edi | ebp |
Return value |
---|
eax |
The syscall numbers are described in the Linux generated file $build/arch/x86/include/generated/uapi/asm/unistd_32.h
or $build/usr/include/asm/unistd_32.h
. The latter could also be present on your Linux system, just omit the $build
.
All registers are preserved during the syscall.
syscall[edit]
The x86_64 architecture introduced a dedicated instruction to make a syscall. It does not access the interrupt descriptor table and is faster. Parameters are passed by setting the general purpose registers as following:
Syscall # | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 |
---|---|---|---|---|---|---|
rax | rdi | rsi | rdx | r10 | r8 | r9 |
Return value |
---|
rax |
The syscall numbers are described in the Linux generated file $build/usr/include/asm/unistd_64.h
. This file could also be present on your Linux system, just omit the $build
.
All registers, except rcx
and r11
(and the return value, rax
), are preserved during the syscall.