一、简介

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'

解决方法:

Linux汇编与C互相调用的更多相关文章

  1. linux 汇编 - 函数调用

    Linux 汇编-函数调用 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !i ...

  2. Linux/Unix shell 脚本中调用SQL,RMAN脚本

    Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...

  3. Linux汇编教程01: 基本知识

    在我们开始学习Linux汇编之前,需要简单的了解一下计算机的体系结构.我们不需要特别深入的了解,理解了一些基本概念对与我们理解程序会很有帮助.现在计算机的结构体系都是采用冯诺依曼体系结构的基础上发展过 ...

  4. linux 汇编

    nasm的语法和大学教材上8086的汇编伪指令有些差别,指令都是一样的. 编辑器就是普通的编辑器,vim,emacs,gedit,kate源文件类型为ascii码的plain text 编译用gcc或 ...

  5. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  6. Linux下手动获取当前调用栈

    被问到如何手动获取当前的调用栈,之前碰到过一时没记起来,现在回头整理一下. 其原理是:使用backtrace()从栈中获取当前调用各层函数调用的返回地址,backtrace_symbols()将对应地 ...

  7. Linux内核监控模块-3-系统调用的截获

    上一章,我们获取了系统调用表的地址,这里我们来搞点所谓“截获”的事情.所谓“截获”即是将系统调用表里的地址指向我们自己写的一个函数,系统调用先执行我们自己写的函数,处理完后,再返回原来系统调用的执行函 ...

  8. Linux内核监控模块-2-系统调用表地址的获取(Linux内核版本3.13)

    那么在Linux内核2.6之后,不能直接导出sys_call_table的地址后,我们要如何获得系统调用表的地址,从而实现系统调用的截获呢. 先贴上我实现好的代码,然后再来讲解吧. modu.c #i ...

  9. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

随机推荐

  1. 7-17 Hashing(25 分)

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  2. DesignPattern(二) 创建型模式

    创建型模式 创建型模式就是用来创建对象的模式,抽象了实例化的过程.所有的创建型模式都有两个共同点.第一,它们都将系统使用哪些具体类的信息封装起来:第二,它们隐藏了这些类的实例是如何被创建和组织的.创建 ...

  3. HP-Mercury SiteScope安装及监控Weblogic操作

    1.Mercury SiteScope简介Mercury SiteScope是一款无代理监测解决方案,可确保分布式IT基础架构——如服务器.操作系统.网络设备.网络服务.应用和应用组件的可用性和性能. ...

  4. servlet深探

    在spring4下面使用的是ServletContext作为容器,这个是servlet规范里面设置的:加载了默认的servlet(在spring 4之前都是web.xml中做的),但是在spring ...

  5. Oracle SYS_CONTEXT用法

    1. USERENV(OPTION) 返回当前的会话信息. OPTION='ISDBA'若当前是DBA角色,则为TRUE,否则FALSE. OPTION='LANGUAGE'返回数据库的字符集. OP ...

  6. H5页面获取openid,完成支付公众号(未关注公众号)支付

    一.页面授权 // 进入页面获取权限code function initAuthorizeCode() { var appid = $("#appid").val();//公众号a ...

  7. 机房用ROS创建时间服务器

    发现机房里的服务器时间老是不同步,虽然都设置为time-a.nist.gov和time-b.nist.gov,仍然有失败的概率.可能是因为国外服务器的缘故.所以打算在机房里创建一个时间服务器.正好RO ...

  8. Codeforces Round #474-E(树形dp)

    一.题目链接 http://codeforces.com/contest/960/problem/B 二.题意 给定一棵$N$个节点的树,每个节点的权值$V$.定义树中两点$u_1$和$u_m$的权值 ...

  9. 生成式对抗网络(GAN)

    生成对抗网络(GAN),是深度学习模型之一,2014年lan Goodfellow的开篇之作Generative Adversarial Network, GAN概述 GAN包括两个模型,一个是生成模 ...

  10. Conv

    folly/Conv.h folly/Conv.h is a one-stop-shop for converting values across types. Its main features a ...