Linux下用C语言调用GAS汇编——综合实例

紧接上一篇博文,上篇写的是用GAS汇编调用C语言,这次讲用C语言调用GAS汇编。在内核编写中主要用的是前者,但是在日常程序优化中,主要用的是后者。

还是同样的功能,实现两个数值的交换,把参数从C语言传递进汇编,再用C语言接收从汇编函数返回的返回值,返回值又分为普通整数返回值和字符串返回值。

建立三个文件,分别为main.c、retstr.s、swapint.s。其中main.c是C语言文件,也就是主函数所在,swapint.s是汇编函数,用于交换两个变量数值并返回一个整数值给C语言函数,retstr.s也是汇编语言函数,用于演示汇编语言输出屏幕提示,采用了直接写入stdout和调用C库两种方式,之后返回一个字符串给C语言函数。

main.c的代码如下:

#include<stdio.h>
char *retstr();    #C程序默认函数返回值为整数值,这里要声明下,应该是字符串指针。
int main()
{
	int a;
	int b;
	int c;
	char *str;
	a=10;
	b=20;
	c=swapint(&a,&b);
	printf("The ‘swapint‘ return:%d\n",c);
	printf("Now:a=%d;b=%d\n",a,b);
	str=retstr();
	printf("The ‘retstr‘ return:%s",str);
	return 0;
}

swapint.s的代码如下:

.section .text
.globl swapint
.type swapint,@function
swapint:
	pushl %ebp
	movl %esp,%ebp
	pushl %ebx
	movl 8(%ebp),%esi
	movl 12(%ebp),%edi
	movl (%esi),%ebx
	xchg %ebx,(%edi)
	movl %ebx,(%esi)
	movl $2333,%eax
	popl %ebx
	movl %ebp,%esp
	popl %ebp
	ret	

retstr.s的代码如下:

.section .data
msg:
	.asciz "Use syscall:The value has been swapped!\n"
msgend:
	.equ len,msgend-msg
msg2:
	.asciz "Call ‘printf‘ successfully!\n"
retvalue:
	.asciz "It‘s ok!\n"
.section .text
.globl retstr
.type retstr,@function
retstr:
	pushl %ebp
	movl %esp,%ebp
	pushl %ebx
	#using system call
	movl $4,%eax	#the number of syscall
	movl $1,%ebx	#fd
	movl $msg,%ecx	#the pointer of msg
	movl $len,%edx	#the length
	int  $0x80		#call "write"
	#using C library
	pushl $msg2
	call printf
	#return a string
	movl $retvalue,%eax
	#leave
	popl %ebx
	movl %ebp,%esp
	popl %ebp
	ret

写个脚本debug-auto.sh自动编译这些文件,同时附带调试信息,方便GDB调试。

as -o swapint.o swapint.s -gstabs
as -o retstr.o retstr.s -gstabs
gcc -o a.out swapint.o retstr.o main.c -gstabs

之后就是编译运行,结果如下:

这就是在C语言中综合调用GAS汇编函数。

有问题欢迎讨论。

时间: 2024-08-01 17:38:40

Linux下用C语言调用GAS汇编——综合实例的相关文章

linux下的c语言编程删除文件夹

刚刚在学习开始做新项目的时候,学长布置了一项任务,就是在给定一个目录下,要将这个目录下一个星期之前的目录包括里面的文件全部删除,只保留这一个星期内的.百度了好久的资料,终于完成,记录一下防止忘记.(注:文件夹名称默认为日期格式,如20140716) #include<dirent.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #i

在Linux下开始C语言的学习

为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查手册方便,在Linux下如果你不清楚一个库函数的用法,直接man,还锻炼英语了.如果想了解man,那就先man man. OK,let's star! 第一步,打开terminal,先输入vi hello.c新建一个c的源文件 接着我们就进入了VIM编辑器,写一段helloworld的代码吧 输入:

Linux下手动获取当前调用栈

被问到如何手动获取当前的调用栈,之前碰到过一时没记起来,现在回头整理一下. 其原理是:使用backtrace()从栈中获取当前调用各层函数调用的返回地址,backtrace_symbols()将对应地址翻译成对应的符号信息,这两个函数在execinfo.h中声明.详细用法见后面的example.这里强调几处需要注意的地方,在man里头也有说明 1,inline函数无返回地址,因此在结果中不显示 2,需要给linker指定对应的参数,才能保证有对应的符号名称信息,GNU工具链是指定-rdynami

Linux下用c语言实现发送http请求 方式可以Get或者Post例程参考

[1].[代码] Linux下用c语言实现发送http请求 方式可以Get或者Post 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

linux下删除整个文件夹或者文件命令实例

1.linux删除文件夹命令 在用Linux的时候,有时候要删除一个文件夹,往往会提示次此文件非空,没法删除,这个时候,就必须使用rm -rf命令. 2.linux删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 3.linux删除文件实例: rm -f /var/log/httpd/access.log 将会强制删除/var/log/httpd/access.log这个文件 -r 就是向下

Linux下简单C语言小程序的反汇编分析

韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOOC相关课程而写的作业,如有疏漏,还请指出. 选了一门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这里写下一个对一个简单C命令行程序的反汇编分析过程,一方面完成作业,另一方面当作练手.下面开始: 1.编写我们的C语言小程序 这里我们使用简单的例子,代码如下: 1

windows下的c语言和linux 下的c语言以及C标准库和系统API

1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作系统啊!但由于c标准库的封装就实现了接口一样.但是如果往深入,我们就非常清楚了在这层封装上还有一层封装其实就是操作系统对文件操作的封装,也就是文件IO.而我们c语言的封装叫标准IO,他们有什么区别那?显然标准iO是基于文件io的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制. 2.上面

在Linux下运行C语言程序

市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教程以Deepin为例来讲述如何编译C程序. Gedit Gedit是一个简单实用的文本编辑器,拥有漂亮的界面,支持语法高亮,比 Vim 更易上手.本教程将Gedit作为C代码编辑器. Gedit的安装: sudo apt-add-repository ppa:ubuntu-on-rails/ppa

linux下的C语言开发

在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位.作为程序员来说,linux系统为我们提供了很多理想的环境,这其中包括了下面几个方面,        (1)完善的编译环境,包括gcc.as.ld等编译.链接工具