一、linux系统调用
系统调用定义在:/usr/include/asm/unistd.h
通常可以在man页的第二部分查看说明。


二、使用系统调用
1、系统调用的格式
启动系统调用需要使用INT指令,Linux系统调用位于中断0x80。执行INT指令时,所有操作转移到内核中的系统调用处理程序,系统调用完成时,执行转移回INT指令后的下一条指令。
2、系统调用值
EAX寄存器用于保存系统调用值



3、系统调用输入值
系统调用期望的输入值顺序:
- EBX 第一个参数
- ECX 第二个参数
- EDX 第三个参数
- ESI 第四个参数
- EDI 第五个参数
当输入参数超过6个时,EBX用于保存指向输入参数内存 位置的指针,输入参数按照堆栈顺序存放
4、系统调用返回值
系统调用返回值存放在EAX寄存器中,程序员负责检查EAX寄存器的值。
5、使用复杂数据类型
有时系统调用返回涉及C样式结构的复杂数据。在汇编语言程序中使用它们时,有时候难以决定如何处理返回的C结构,以及如何把它转换为汇编语言能够处理的数据类型。
必须在内存位置创建这个结构,以便值可以被函数返回。















系统调用system的系统调用值116被存放在EAX寄存器中,标签result的内存位置存储在EBX寄存器中作为输入值。执行INT指令之后,返回值被加载到这个内存位置中,各个内存标签可以用于引用每个单独的值
三、跟踪系统调用
使用strace程序


四、系统调用和C库
1、使用C库函数
C库函数包含在libc库中,使用c库函数时必须把libc连接到汇编程序中


2、系统调用和c库的比较
使用原始Linux系统调用的主要原因
- 可以创建尽可能短的代码
- 可以创建尽可能快的代码
- 连接后的可执行文件独立于任何外部库
使用c库的主要原因
- c库包含很多函数,模拟它们需要大量汇编代码
- c库在操作系统间是可以移植的
- c库在可以在程序间利用共享库,减少内存需求