编译器一般使用堆栈实现函数调用,每个进程都有自己的栈,用栈来传递参数,会带来以下问题:
高级语言有调用的约定:
举例:
int sub(int a , int b){ // 被调
return a-b;
}
int s = sub(3,2); // 调用
调用:
push 2
push 3
call sub
被调:
push ebp
mov ebp,esp
mov eax,[ebp+8]
sub eax,[ebp+12]
pop ebp // 恢复 ebp
C和汇编混合编程有两种方式:
C代码嵌入汇编:
char* 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语言里面用扩展汇编真的不舒服,相当于多了一种语言,需要依据其规则。