6.1 函数调用约定简介
C 语言遵循的调用约定是 cdecl:
- 调用者将所有参数从右到左入栈
- 调用者清理参数所占的栈空间
6.2 汇编语言和 C 语言混合编程
6.2.1 浅析 C 库函数与系统调用
汇编语言和 C 语言混合编程可分为两大类:
- 单独的汇编代码文件与单独的 C 语言文件分别编译成目标文件后,一起链接成可执行程序
- 在 C 语言中嵌入汇编代码,直接编译生成可执行程序
系统调用是 Linux 内核提供的一套子程序。
系统调用的入口只有一个,即 0x80 号中断,子功能号在寄存器 eax 中单独指定。
调用“系统调用”有两种方式:
- 将系统调用指令封装为 C 库函数,通过库函数进行系统调用
- 不依赖任何库函数,直接通过汇编指令 int 与操作系统通信
当输入的参数小于等于 5 个时,Linux 用寄存器传递参数;当参数个数大于 5 个时,把参数按照顺序放入连续的内存区域,并将该区域的首地址放到 ebx 寄存器。
6.2.2 汇编语言和 C 语言共同协作
在汇编语言中导出符号名用 global 关键字。
在 C 代码中只要将符号定义为全局便可被外部引用,引用外部符号时用 extern 声明即可。