Dev-Cpp/Mingw32环境介绍(13)(转)
上文回顾:
在上一文中,我们了解了如何在Win32下安装GCC的移植版本。那么,从这一章开始。我们将深入GCC的编程世界。不过,有一点我想说明,那就是:当你越深入GCC,你就觉得Win32下的GCC越不够用。所以,Win32下的GCC作为一个开发应用程序的编译器,那当然是足够了。问题是,如果你要将GCC的潜力全部开发出来。那么你就必须在Unix或者类Unix系统上使用。如FreeBSD就是不错的选择。我最近也要迁移到这个系统下了。
第十八章GCC下的汇编应用
这一章中,我将向各位展示GCC下的汇编语言。如果,你是计算机科班出身。那么,请你注意了。你不要以为这里的汇编语言你学过。因为,GCC所使用的汇编风格和在高校中学的有很大的出入。一不小心就会出错。
在开始之前,我先介绍一下汇编的风格问题。汇编语言的风格基本分为两种。第一种是Inter汇编语言风格。第二种是AT&T汇编语言风格。前者,是现在国内高校学习的。后者,是GCC所使用的。相对来说,我个人偏好AT&T,因为不会造成不好的编程习惯,而且Linux内核中的汇编部分也是用这种风格写的。
汇编语言的风格,只是一种格式,对执行没有任何的影响。所以,不论你学的是Inter汇编风格,还是AT&T除了编写部分有不同外。其他的知识都是一样的。
AT&T汇编语言风格,与Inter的风格最大的差异是,他们的操作数是相反的。比如,
//AT&T movb $0x01,%al movw $0x0023,%ax |
这里,我们可以看到。立即数前是 $寄存器前是 %。还有,操作顺序是相反的。这就是AT&T的特点。有关AT&T更多的内容。请到网上查询一下。
下面开始正题。在GCC下使用汇编。因为,我们在中级篇开始,就介绍了许多GCC移植版本的安装。而且,他们的适用范围也不同。所以,在没有特殊的提示前。我们都使用MinGW。
//myas.s .text .global _myas _myas: pushl %ebp movl %esp,%ebp movw $0x0001,%ax popl %ebp ret |
上面是一段汇编代码,在GCC中,汇编代码通常都是以s为后缀名的。这段代码只是返回一个1,不接受任何参数。
.global_myas 这是定义_myas这个函数名。
其他的,我想就不用介绍了。除了操作数顺序不同。其他的和Inter一样。
//main.c #include <stdio.h> #include <stdlib.h> int myas(void); int main(int argc, char *argv[]) { int r; r=myas(); printf(“%d”,r); return(0); } |
上面那段代码,就是把myas的参数打印到终端上。是不是很简单?下面我们看看如何在Win32下将这些文件编译出来。
>gcc -c myas.s -o myas.o >gcc -c main.c -o main.o >gcc -o main.exe main.o myas.o |
这样,我们的代码就算链接成功了。运行一下看看吧。
以上,是在C代码外,使用汇编。在C代码内使用的汇编的方式和平时VC的方式是一样的。使用,
__asm__(“movw $0x0000,%ax\n\t”); |
就可以在C语言中嵌入汇编代码了。方便好用嘛。
如何?这样的话,就可以让你的代码运行效率得到很大的提升了。