Dev-Cpp/MinGW32 环境介绍(13)

<style type="text/css"> &lt;!-- @page { size: 21cm 29.7cm; margin-left: 1.98cm; margin-right: 2cm; margin-top: 2cm; margin-bottom: 2cm } P { margin-bottom: 0.21cm } --&gt; </style>

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语言中嵌入汇编代码了。方便好用嘛。

如何?这样的话,就可以让你的代码运行效率得到很大的提升了。


文外音:

是不是这次的文章好像在结构上好看很多?因为,我原来都是使用写字板编写的。这次使用的是,OpenOffice这个软件。只要将他生成的HTML代码贴到Blog上,就可以了。很方便的。而且,是免费的工具哦。我用的是英文版的,觉得很用着很舒服。

看了中级篇的内容,是否觉得自己有很多不足呢?的确,我们学的东西还很多。不过,当你真正的用GCC时,你就会觉得这些在Win32下的东西有些不够用了。中级篇的内容,将不再是以前那样重点写安装和使用了。而是把重点放在更深一层的应用方面。如果,你觉得在看本文时有什么疑惑,或者想法。可以到我的Blog上发表。

如果,您好转载我的文章。请在文章出处写明,我的Blog地址,以便有疑惑的兄弟们能够及时的提出问题,并得到回答。谢谢。

Blog地址:http://blog.csdn.net/visioncat/




STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

你可能感兴趣的:(编程,c,gcc,C#,FreeBSD)