函数调用和系统调用(一)

函数调用约定


调用约定从字面上理解,他是调用函数的一套约定。主要体现在一下三个方面

  • 参数的传递方式,参数是存放在寄存器中还是栈中
  • 参数的传递顺序,是从左到右传递还是从右到左传
  • 保存寄存器环境是调用者,还是被调用者保存

基于传参的数目不确定以及参数可能覆盖的问题,最后选用栈来存储参数

  • 每个进程都有自己的栈
  • 参数的内存地址不用花精力去维护,已经有栈机制自动帮我们维护

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与操作系统通信。
nasm −f [−o ] ld 用于把目标代码文件连接为可执行文件或者库文件 -s: 忽略来自输出文件的所有符号信息 -m: 模拟指定的连接器

http://www.360doc.com/content/19/0713/11/277688_848432523.shtml

https://blog.csdn.net/qq_37414405/article/details/84942067

posted @ 2020-06-27 23:23  zer0_1s  阅读(217)  评论(0)    收藏  举报