The operating system is responsible for
An application program makes a system call to get the operating system to perform a service for it, like reading from a file.
One nice thing about syscalls is that you don't have to link with a C library, so your executables can be much smaller.
eax
,
then its arguments, in order, in ebx
, ecx
, edx
,
esi
, edi
, and ebp
, then invoke int
0x80
.
eax
.
# ----------------------------------------------------------------------------------------
# Writes "Hello, World" to the console using only system calls. Runs on 64-bit Linux only.
# To assemble and run:
#
# gcc -c hello.s && ld hello.o && ./a.out
#
# or
#
# gcc -nostdlib hello.s && ./a.out
# ----------------------------------------------------------------------------------------
.global _start
.text
_start:
# write(1, message, 13)
mov $1, %rax # system call 1 is write
mov $1, %rdi # file handle 1 is stdout
mov $message, %rsi # address of string to output
mov $13, %rdx # number of bytes
syscall # invoke operating system to do the write
# exit(0)
mov $60, %rax # system call 60 is exit
xor %rdi, %rdi # we want return code 0
syscall # invoke operating system to exit
message:
.ascii "Hello, world\n"
rax
,
then its arguments, in order, in rdi
, rsi
, rdx
,
r10
, r8
, and r9
, then invoke syscall
.
rax
. A value in the range
between -4095 and -1 indicates an error, it is -errno.
There are hundreds of system calls in Linux. A good online source for 32-bit Linux is http://syscalls.kernelgrok.com/ . For 64-bit Linux, check out http://www.acsu.buffalo.edu/~charngda/linux_syscalls_64bit.html
Check those pages, and of course, the Linux source.