Linux汇编与C互相调用
来源:互联网 发布:剑与魔法翅膀升阶数据 编辑:程序博客网 时间:2024/05/28 22:07
转自:http://www.cnblogs.com/lknlfy/archive/2012/07/18/2598074.html
一. 概述
汇编通过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<stdio.h> 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汇编与C互相调用
- Linux汇编与C互相调用
- Linux汇编与C互相调用
- C与C++互相调用
- c与c++互相调用
- c++与c互相调用
- 汇编和C代码之间的互相调用
- C和arm的汇编的互相调用
- Linux C语言调用汇编
- linux下c和c++互相调用
- linux下c和c++互相调用
- C与C++文件互相调用
- TCL与c/c++的互相调用
- Java与C互相调用实例详解
- Java与C互相调用实例详解
- C/C++与Python互相调用
- C/C++与Lua互相调用
- TCL与c/c++的互相调用
- 用Homebrew替换MacPorts
- No result defined for action jsp_entity.SysLog and result success
- 动态设置不同的行字体颜色
- ubuntu 看迅雷电影的方法
- Android开机启动流程初探
- Linux汇编与C互相调用
- IOS CLLocationManager和中国地图偏移(China Shift)
- linux-2.6.26内核中ARM中断实现详解
- Matrix Chain Multiplication(栈的简单应用)
- shell 创建文件夹,并在文件夹中创建空文件
- 考研小结
- 输出流效率测试
- Android警告错误搜集
- PHP学习-----文件操作/上传和下载