文件名: 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.