您的位置:首页 > 运维架构 > Linux

Linux汇编与C互相调用

2015-07-16 11:44 603 查看
一、简介

C语言调用汇编有两种方式:1、通过内嵌汇编 2、通过编译链接。

二、基础知识

对于C和汇编语言的接口主要有两个问题需要解决

1、调用者与被调用者的参数传递

正常的,定义一个函数总是希望它完成某些功能,一个毫无用处的函数将毫无意义。这些功能有常常是更大的功能的一部分,而函数完成这些功能或多或少都要与外界联系(一个完全不与外界联系的函数也是一个毫无意义的函数)(延时函数也要消耗时间,时间也属于外界的一种资源),比如要传递一些数据给其处理,处理过后返回处理的结果。这种数据的传递可以形象的通过两种方式来实现,第一种是外界直接把数据给函数,第二种是函数自己去外界取数据。

对于第一种:

这种数据传递通过堆栈完成,是一种隐性方式,隐含操作是:在执行调用时从调用程序参数表中的最后一个参数开始 ,自动依次压入堆栈;将所有参数压入堆栈后,再自动将被调用程序执行结束后的返回地址 (断点)压入堆栈,以使被调程序结束后能返回主调程序的正确位置而继续执行。

对于第二种:

对于第二种模型,必须开辟一个公共的区域,调用者及被调用者都必须能访问此区域。


2、说明和建立调用者与被调用者间的联系

为了建立调用与被调用模块间的连接关系,被调用的汇编程序应用global,说明其可被外部模块调用;而调用程序则应预先说明要引用的外部模块名。


参考:

http://blog.chinaunix.net/uid-20797642-id-2495231.html http://www.cnblogs.com/shenlian/archive/2011/05/17/2049441.html[/code] 
三、实例

1、32位:Linux汇编与C互相调用

http://www.linuxidc.com/Linux/2012-07/65757.htm

2、内嵌汇编

内嵌汇编格式

asm ( assembler template
: output operands                   (optional)
: input operands                    (optional)
: clobbered registers list          (optional)
);


http://blog.csdn.net/scotthuang1989/article/details/39497903
http://blog.chinaunix.net/uid-25436678-id-3076218.html
http://blog.chinaunix.net/uid-9185047-id-465761.html

四、常见问题

1、如下

Linux AT&T汇编错误:Error: invalid instruction suffix for `push'

解决方法:

http://www.2cto.com/os/201310/253276.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: