分享
 
 
 

一起学习在linux下使用汇编语言(2)

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

作者:luster

摘要:GNU C/C++编译器(GCC)是一个32-bit的编译器,是GNU计划的核心,能非常好的支持x86体系结构,它支持在C程序里面嵌入汇编代码,这样看来,寄存器可以自己指定也可以留给gcc来分配。GCC可以在多个平台下使用,除了linux,还有*BSD, VSTa, OS/2, *DOS, Win*等等。

3. 汇编器

gcc内嵌编译器

GNU C/C++编译器(GCC)是一个32-bit的编译器,是GNU计划的核心,能非常好的支持x86体系结构,它支持在C程序里面嵌入汇编代码,这样看来,寄存器可以自己指定也可以留给gcc来分配。GCC可以在多个平台下使用,除了linux,还有*BSD, VSTa, OS/2, *DOS, Win*等等。

可以在GNU FTP站点下载GCC。链接是:

ftp://prep.ai.mit.edu/pub/gnu/gcc/

现在GCC已经分裂成两个分支(GCC 2.8和EGCS),但是它们又重新合并了起来,GCC的主页位于:http://gcc.gnu.org.

因为内核头文件中定义的一些汇编例程函数都是extern inline函数,所以GCC必须要加-O(或者-O2,-O3等)编译标志,这样才能使得这些函数可以使用。否则,如果不加-O标志,代码也可以被编译,但是可能link会不正确。

嵌入汇编语言可以通过“-fno-asm”来被禁止。不过通常来说,比较好的编译标志是如下的,这对于大多数的x86平台都是很不错的选择:

gcc -O2 -fomit-frame-pointer -W -Wall

-O2在大部分情况下都是很好的代码优化级别。事实上,使用优化后会带来更多的编译时间,也会产生大一些地代码,而在速度上仅仅有一点点提高。

-fomit-frame-pointer允许产生的代码中跳过一些错误的frame pointer maintenance,这样可以使得代码小一些而且快一些,而且会释放一些寄存器来获得更进一步的优化。

-W ?Wall使得我们可以获得很多有用的warning,这对于我们减少一些愚蠢的编码错误是非常有用的。

我们还可以加一些编译参数来指明目标CPU的类型,这样就允许GCC来产生一些针对特定CPU的优化代码。在编译内核中使用指明CPU类型的参数是非常有用的。具体GCC支持什么类型CPU优化,我们可以参考所使用的GCC的文档。

GCC对宏的支持

GCC允许而且要求你指明你的嵌入汇编代码使用的寄存器,这样编译器的优化器才能知道如何优化。因此,嵌入汇编代码通常是一些patterns,而不是真正的代码(exact code)。因此,通常我们把汇编代码放到CPP的宏定义里面,或者定义成inline函数,这样就可以方便的就像使用C函数或宏一样使用这些代码。Inline函数和宏非常相似,不过inline函数比较起后者,使用起来更清晰。

GAS

GAS是GNU的汇编器,GCC实际上也依赖它。我们可以在任何能下载GCC的地方找到这个实用工具,它通常位于一个名叫binutils的包里面。下面的URL给出了最新的版本:

ftp://ftp.varesearch.com/pub/support/hjl/binutils/.

GAS是一个支持32-bit的unix环境下的汇编编译器,它使用标准的AT&T语法,它使用标准的m68k编译器的语法,这是UNIX world的标准。这个语法和Intel的语法不一样,如果你适应了这种语法,那么你就会发现它也是很好用的。下面是一些GAS语法的主要特点:

? 所有的寄存器的名字都是以“%”最为前缀,所以可能的一些寄存器是%eax,%dl等等,而不是简单的eax,dl等。这样的话可以使得C语言中方便的嵌入一些汇编代码而不会有变量名字方面冲突的担心。

? 操作数的顺序也是相反的。例如要把edx寄存器的内容拷贝到eax寄存器里面的话,GAS的语法是:mov %edx,%eax;而Intel平台下的汇编语句是:mov eax,edx。

? 操作数的尺寸作为一个后缀加在操作名的后面。B表示(8-bit)byte,w表示(16-bit) word,l表示(32-bit) long。例如,上面例子中正确的语法应该是:movl %edx,%eax。不过,GAS并不需要严格的AT&T语法,所以这个后缀可可以省略的,这时候编译器就自己根据操作数判断或者置为缺省的位宽32-bit。

? 立即数需要一个“$”前缀符号,例如:addl $5,%eax。

? 如果没有操作数前缀,则表示它是内存地址,例如:movl $foo,%eax,把变量foo的地址送到了%eax寄存器。但是“movl foo,%eax”则把foo变量的内容送到eax寄存器中。

已经有一些工具可以帮助你把你的使用Intel汇编语法的源程序转换成AT&T语法,或者做相反的转换。

不过,已经有的好消息是Binutils 2.10开始,GAS已经可以支持Intel语法了。

16-bit mode

Binutils (2.9.1.0.25+) 可以全面支持i386PC体系下的16-bit模式(存储器和寻址)。使用“.code16”和“.code32”来切换汇编模式。

还有很多的编译器,我们可以选择,明天再学习把。

昨天晚上美国遭到恐怖袭击,去看电视直播去了。拜拜。今天到此。

luster@linuxaid.com.cn

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有