Linux汇编GAS调用C语言函数实例

Blum的书上只讲了C语言调用汇编,没讲汇编调用C语言。我自己尝试了下。

最终试验成功了,在此写出与大家分享。期间历经无数错误,无数异常,我不是醉了,而是跪了。。。好在最后好了。

程序实现一个换值功能,在main.s里定义a=10,b=20,然后调用C语言函数把a,b换值。

新建两个文件分别为main.s的汇编文件,还有pro.c的C语言函数文件。

main.s的代码如下:

.section .data

a:

.int 10

b:

.int 20

.section .text

.globl main

.type main,@function    #别忘了这句,因为main汇编函数也是被crt0.s调用的,main本质上也是个函数

main: 

movl $a,%eax

movl $b,%ebx

pushl %ebx

pushl %eax

call swapint    #不要写成 _swapint

movl $1,%eax

movl $0,%ebx

int $0x80

pro.c的代码如下:

#include<stdio.h>

int swapint(int *a,int *b)

{

int c;

char *str="success!!";;

c=*a;

*a=*b;

*b=c;

puts(str);                #用puts可以输出

puts("end!");            #用puts可以输出

printf("output??");        #用printf会造成此句无输出,原因:缓冲区没满                                  #用\n清空缓冲区即可造成输出。

return 0;

}

在汇编函数里先把a,b的地址压栈,注意按照C语言函数参数从右往左的顺序压栈。即先压栈b,后搞a。

之后直接调用即可,CPU会自动把返回地址压栈,然后控制权移交C语言函数,之后就是C语言函数自动取参数,你就不用管了。【其实C语言函数所做的就是8(%ebp)取出堆栈中压入的a的地址(我们压栈的是地址),然后再12(%ebp)取出堆栈中压入的b的地址,然后开始运算换值。。。不神秘】

讲完了,一开始被printf无输出纠结了一会儿,不过以前学过Linux下C语言编程,还专门研究过缓冲区问题。

编译过程如下:

之后可以用GDB调试下。【此处没输出"output??",因为我没有清空缓冲区!】

就这些。

有问题欢迎讨论。

时间: 2024-10-07 08:28:33

Linux汇编GAS调用C语言函数实例的相关文章

从linux0.11中起动部分代码看汇编调用c语言函数

上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一段代码(linux0.11的启动分析部分会在另一部分中再分析,由于此文仅涉及c与汇编代码的问题,). after_page_tables: pushl $0 # These are the parameters to main :-) pushl $0 pushl $0 pushl $L6 # re

Matlab调用C语言函数

Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在Matlab中使用它,比如输入:>> a = add(1.1, 2.2)                                                     3.3000要得出以上的结果,那应该怎样做呢?解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matl

借助动态代码生成技术在基于Webkit引擎的HTML5网页JS内调用易语言函数

作者:庄晓立(Liigo) 日期:2015年3月3日夜 原创链接:http://blog.csdn.net/liigo/article/details/44045177 版权所有,转载请注明出处:http://blog.csdn.net/liigo 前两天我协助解决了一个技术问题,在此稍作记录和总结. 具体来说,就是在使用基于Webkit引擎的封装组件wke的过程中,需要把一个易语言函数注册给JavaScript引擎,让它可以在网页里被调用(就像在网页里调用普通JavaScript函数一样).如

linux的子进程调用exec( )系列函数

exec( )函数族 : 以下我们来看看一个进程怎样来启动还有一个程序的运行.在Linux中要使用exec函数族.系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其參数包含文件名称(filename).參数列表(argv)以及环境变量(envp).exec函数族当然不止一个.但它们大致同样,在Linux中,它们各自是:execl,execlp.execle,execv,execve和execvp,以下我仅仅以execlp为例,其他函数到底与execlp有何差别,请通过mane

在linux下Lua调用C语言的两种方法

一.c语言作为应用程序的一部分 #include <stdio.h>#include <string.h>#include <lua.hpp>#include <lauxlib.h>#include <lualib.h> //待Lua调用的C注册函数.static int add2(lua_State* L){ //检查栈中的参数是否合法,1表示Lua调用时的第一个参数(从左到右),依此类推. //如果Lua代码在调用时传递的参数不为number

Go语言调用C语言函数的坑

最近在看人民邮电出版社 许式伟 吕桂华编著的<Go语言编程>,看到[1.2.9 语言交互性]小节的cprint.go.未按照书中源代码格式编写,而是把 import "C" 和 import "unsafe" 合并放入小括号中并和注释结束符 */ 间隔了一行,这也是大多数Go语言学习和开发者经常使用的代码风格,我修改后的代码如下: package main /*#include <stdio.h>#include <stdlib.h&g

R调用C语言简单实例

新建目录C:/D_package/work_source/R_work/convolve,并创建convolve.c 文件 打开R(32bit,64bit的会报错和安装环境有关) > setwd('C:/D_package/work_source/R_work/convolve') > system("R CMD SHLIB convolve.c") gcc -m32 -I"C:/PROGRA~1/R/R-31~1.2/include" -DNDEBUG

SDRAM和重定位(二)---开始在汇编代码中调用 C 语言

前面的点亮led的代码由于比较简单,所以全部用汇编代码完成,但是随着代码越来越多,逻辑关系越来越复杂,想要完全用汇编代码来写程序不太现实,必须要借助 c 语言程序,那么就会有从汇编语言到 c 语言的一个过渡阶段. ======================================================= 如何在汇编语言中调用 c 语言? 在汇编中调用 c语言程序的方法很简单,只需利用汇编代码:bl xxx(函数名)即可,但是重点不是如何调用 c 程序,而是汇编代码要为运行 c

在 SPSS Statistics 和 Modeler 中调用 R 语言的实现和应用

http://www.ibm.com/developerworks/cn/data/library/ba/ba-1401spss-r/index.html 登录 | 注册   IBM 技术主题 软件下载 社区 技术讲座 搜索 developerWorks 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Delicious Linked In developerWorks 中国 技术主题 Information Mana