程序员人生 网站导航

C语言与汇编语言相互调用原理以及实例

栏目:php教程时间:2015-04-13 08:54:18
下面两个分别是1个foo.asm(汇编语言文件),bar.c(c语言文件)
首先来了解C语言为何能调用汇编语言,和汇编语言为何能调用C语言。其实不论是C语言还是汇编语言想要履行都是终究编译链接成为2进制文件。
注意是编译链接这个两个步骤,编译产生的其实不是可履行的2进制文件,链接以后才是可履行的2进制文件。
这里1定要明确编译和链接是两个步骤,生成的文件格式也是不1样的。
编译生成的文件是1定格式的,里面包括函数符号表、参数表...等信息,这些信息主要是提供给链接阶段使用,函数调用是怎样调用的?是否是指定利用的函数的符号?所以链接阶段就是将函数调用的符号变成相对地址(要特别注意这个阶段,由于这个进程使得C语言和汇编语言相互调用成为可能)
gcc -m32 -c -o bar.o bar.c  生成了bar.o(是中间文件,不是可履行文件,带有符号表,参数表等)
nasm -f elf -o foo.o foo.asm 生成foo.o(是中间文件,不是可履行文件,带有符号表,参数表等
既然都生成了相同格式的.o中间文件,那末ld链接器便可将两个中间文件链接成为2进制可履行文件了,ld主要做的工作是将bar.o foo.o中的相互援用的函数符号变成在2进制文件foobar中相对地址(相对地址在2进制文件装入内存运行的时候会被全部转换为绝对地址)
ld -m elf_i386 -s -o foobar foo.o bar.o (链接成为2进制可履行文件了)
进程如图所示:
foo.asm
extern choose; [section .data] num1st dq 3 num2nd dq 4 [section .text] global main global myprint main: push qword [num2nd] push qword [num1st] call choose add esp,8 mov ebx,0 mov eax,1 int 0x80 ; pop qword [num1st] ; pop qword [num2nd] myprint: mov edx,[esp+8] mov ecx,[esp+4] mov ebx,1 mov eax,4 int 0x80 ; pop qword [num1st] ; pop qword [num2nd] ret
bar.c
void myprint(char * msg ,int len);
int choose(int a,int b) 
{ 
  if (a>=b){
    myprint("the 1st one
",13);}
  else {
    myprint("the 2nd one
",13);}
  return 0;
}

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐