Linux汇编与C互相调用

一、简介

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

二、基础知识

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

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

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

对于第一种:

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

对于第二种:

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

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

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

参考:

三、实例

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

2、内嵌汇编

内嵌汇编格式

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

四、常见问题

1、如下

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

解决方法:

原文地址:https://www.cnblogs.com/274914765qq/p/4650788.html