欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/6/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C语言与汇编语言相互调用原理以及实例 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
下面两个分别是一个foo.asm(汇编语言文件),bar.c(c语言文件) 首先来了解C语言为什么能调用汇编语言,以及汇编语言为什么能调用C语言。其实不管是C语言还是汇编语言想要执行都是最终编译链接成为二进制文件。 注意是编译链接这个两个步骤,编译产生的并不是可执行的二进制文件,链接之后才是可执行的二进制文件。 这里一定要明确编译和链接是两个步骤,生成的文件格式也是不一样的。 编译生成的文件是一定格式的,里面包括函数符号表、参数表...等信息,这些信息主要是提供给链接阶段使用,函数调用是怎么调用的?是不是指定利用的函数的符号?所以链接阶段就是将函数调用的符号变成相对地址(要特别注意这个阶段,因为这个过程使得C语言和汇编语言相互调用成为可能) gcc -m32 -c -o bar.o bar.c  生成了bar.o(是中间文件,不是可执行文件,带有符号表,参数表等) nasm -f elf -o foo.o foo.asm 生成foo.o(是中间文件,不是可执行文件,带有符号表,参数表等 既然都生成了相同格式的.o中间文件,那么ld链接器就可将两个中间文件链接成为二进制可执行文件了,ld主要做的工作是将bar.o foo.o中的相互引用的函数符号变成在二进制文件foobar中相对地址(相对地址在二进制文件装入内存运行的时候会被全部转换为绝对地址) ld -m elf_i386 -s -o foobar foo.o bar.o (链接成为二进制可执行文件了) 过程如图所示: 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 chooseadd esp,8mov ebx,0mov eax,1int 0x80; pop qword [num1st]; pop qword [num2nd] myprint:mov edx,[esp+8]mov ecx,[esp+4]mov ebx,1mov eax,4int 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\n",13);}else {myprint("the 2nd one\n",13);}return 0; }

总结

以上是生活随笔为你收集整理的C语言与汇编语言相互调用原理以及实例的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。