博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux汇编与C互相调用
阅读量:5827 次
发布时间:2019-06-18

本文共 1254 字,大约阅读时间需要 4 分钟。

一. 概述

          汇编通过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的代码:

1 #include
2 3 static int i = 0; 4 5 6 void c_add(int *k) 7 { 8 (*k)++; 9 } 10 11 int main(void)12 { 13 a_add(&i);14 printf("%d\n",i);15 16 return 0;17 }

assembly.s的代码:

1 .section .text 2 .type a_add,@function 3 .globl a_add 4 a_add: 5     pushl %ebp        #现场保护 6     movl %esp,%ebp 7  8     movl 8(%ebp),%eax #取得C函数传过来的参数 9     pushl %ecx        #保护ecx,用作临时变量10     movl (%eax),%ecx  #取得指针所指的内容11     addl $1,%ecx      #将内容+112     movl %ecx,(%eax)  #将内容放回指针所指的地方13     popl %ecx         #恢复ecx14     pushl %eax        #压桟,以便传参给C函数15     call c_add        #调用C函数16 17     addl $4,%esp      #清理局部变量18     popl %ebp         #恢复现场19     ret               #返回

运行结果:

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

转载于:https://www.cnblogs.com/lknlfy/archive/2012/07/18/2598074.html

你可能感兴趣的文章
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>