函数调用和系统调用(一)
函数调用约定
调用约定从字面上理解,他是调用函数的一套约定。主要体现在一下三个方面
- 参数的传递方式,参数是存放在寄存器中还是栈中
- 参数的传递顺序,是从左到右传递还是从右到左传
- 保存寄存器环境是调用者,还是被调用者保存
基于传参的数目不确定以及参数可能覆盖的问题,最后选用栈来存储参数
- 每个进程都有自己的栈
- 参数的内存地址不用花精力去维护,已经有栈机制自动帮我们维护
x86平台下常用的有三种调用约定,__cdecl、__stdcall、__fastcall
- __cdecl是C/C++的默认调用约定,__cdecl参数从右至左入栈,然后由调用者(caller)清理栈区。
- _stdcall是Windows API默认调用约定,从右至左入栈,被调用者(callee)清理栈区。
- _fastcall是32位下一种特殊的调用约定,__fastcall参数还是从右至左入栈,但是不同的是前两个参数被分别放进了ecx、edx寄存器,如果少于或等于两个参数,会先将参数放入寄存器。同样由被调用者(callee)清理栈区。
详见看雪论坛
https://bbs.pediy.com/thread-216755.htm
系统调用
系统调用是linux内核提供的一套子程序,主要是为了实现在用户态不能实现的功能,比如说最常见的读写硬盘文件,这些读写的方法肯定不能由用户程序来编写,而且用户程序也没有权限去直接操控硬件,这就需要操作系统的支持,需要操作系统提供读写硬盘的接口
系统调用的入口只有一个,即第0x80号中断,通过eax指定子功能号。在linux中,系统调用是定义在 /usr/include/asm-generic-unistd.h
- 将系统调用指令封装为 c库函数,通过库函数进行系统调用,操作简单。
- 不依赖任何库函数,直接通过汇编指令 int 0x80与操作系统通信。
zer0_1s

浙公网安备 33010602011771号