函数调用约定
编译器一般使用堆栈实现函数调用,每个进程都有自己的栈,用栈来传递参数,会带来以下问题:
- 参数存储在栈中,那么谁来负责回收参数所占的栈空间,是调用者?还是被调用者
- 当参数很多的时候后,主调函数将参数以什么样的顺序传递
高级语言有调用的约定:
举例:
1 | int sub(int a , int b){ // 被调 |
C & ASM 混合
C和汇编混合编程有两种方式:
- 用汇编和C单独写单独编译,然后链接在一起
- C代码嵌入汇编
C代码嵌入汇编:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15char* str = "C & ASM Code\n";
int count = 0;
int main()
{
asm("pusha;\
movl $4,%eax;\
movl $1,%ebx;\
movl str,%ecx;\
movl $13,%edx;\
int $0x80;\
movl %eax,count;\
popa;\
");
}
// gcc -m32 casm.c
内联汇编及其扩展
上面的例子是内联汇编的一个例子,基本的内敛汇编功能比较薄弱,在此基础上,GCC添加了扩展功能,在C语言里面用扩展汇编真的不舒服,相当于多了一种语言,需要依据其规则。