设为首页 加入收藏

TOP

Linux汇编与C互相调用
2014-11-24 11:45:27 来源: 作者: 【 】 浏览:1
Tags:Linux 汇编 互相 调用

一. 概述


汇编通过call指令调用C函数,call指令主要有两个功能:1.将下一条指令的地址保存在栈顶;2.设置eip指向被调用程序代码的开始处。汇编使用ret指令返回,ret的功能是把返回地址从桟里弹出,并转到该地址去执行。


编程序调用C函数时,函数的入口参数使用堆栈来传送。


C函数调用时,输入参数采用堆栈方式传递,参数的传递顺序是从右到左,调用者负责清除参数占用的堆栈空间。


C函数的返回值如果是32位整数则存在eax寄存器,如果是64位整数,则存在edx:eax寄存器。


二. 实现


下面的程序由2个文件组成,一个是assembly.s,另外一个是gnuc.c。程序的功能是:在gnuc.c里定义一个全局变量i,在main()函数里调用assembly.s文件里的a_add()函数,将变量i的地址作为参数传进去,在a_add()函数里将变量i的值加1,然后调用gnuc.c文件里的c_add()函数,参数也是变量i的地址,在c_add()函数里将参数所指的值加1,最后main()里打印变量i的值。


gnuc.c的代码:


#include

static int i = 0;


void c_add(int *k)
{
(*k)++;
}

int main(void)
{
a_add(&i);
printf("%d\n",i);

return 0;
}


assembly.s的代码:


.section .text
.type a_add,@function
.globl a_add
a_add:
pushl %ebp #现场保护
movl %esp,%ebp

movl 8(%ebp),%eax #取得C函数传过来的参数
pushl %ecx #保护ecx,用作临时变量
movl (%eax),%ecx #取得指针所指的内容
addl $1,%ecx #将内容+1
movl %ecx,(%eax) #将内容放回指针所指的地方
popl %ecx #恢复ecx
pushl %eax #压桟,以便传参给C函数
call c_add #调用C函数

addl $4,%esp #清理局部变量
popl %ebp #恢复现场
ret #返回


运行结果:



可见程序输出2,符合预期效果。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux内核中的双向循环链表学习 下一篇Linux系统调用过程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)
·【总结】100个最常用 (2025-12-27 08:52:22)
·有没有哪些高效的c++ (2025-12-27 08:20:57)
·Socket 编程时 Accep (2025-12-27 08:20:54)