内联汇编
之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。
另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它称为内联汇编。
其实还有另外一种,就是那些技术大牛才能玩得转的方式,将c代码编译为汇编代码后,再修改汇编代码。
什么是内联汇编
内联汇编称为inline assembly,GCC支持在C代码中直接嵌入汇编代码,所以称为GCC inline assembly。大家知道,C语言不支持寄存器操作,汇编语言可以,所以自然就想到了在C语言中嵌入内联汇编提升“战斗力”的方式,通过内联汇编,C程序员可以实现C语言无法表达的功能,这样使开发能力大为提升。
内联汇编按格式分为两大类,一类是最简单的基本内联汇编,另一类是复杂一些的扩展内联汇编,在介绍它们之前,其实还有一点点头疼的事,内联汇编中所用的汇编语言,其语法是AT&T,并不是咱们熟悉的Intel汇编语法,GCC只支持它,所以咱们还得了解下AT&T。
AT&T语法简介
我们在大学所学习的汇编语言大多数都是intel语法,也许这和教学系统都是微软的操作系统dos和windows有关,翻翻过去的教材,一律全是dos下汇编或windows下汇编。linux内核中的汇编代码一般都是AT&T语法,我想,随着linux普及,以后在教学中会越来越多采取AT&T语法啦。
AT&T是汇编语言的一种语法风格、格式。在某一处理器平台上,无论汇编代码是什么语法,其编译出来的机器码是一样的,所以不要误以为AT&T是一种新的机器语言。它仅仅是表达方式不同,意思是一样的,这就像咱们汉语中,比如,“我今天与贺亚涛在食堂吃饭”,“今天在食堂,贺亚涛和我一起吃饭”,都表达的是同一个意思。
AT&T首先在Unix中使用,可当初Unix并不是在x86处理器上开发的,最初是在PDP-11机器上开发,后来又移植到VAX和68000的处理器上,所以AT&T的语法自然更接近于这些处理器的特性。虽然unix后来又移植到x86上了,但还是要尊重unix圈内的习惯,其汇编语法还是接近于那些前辈处理器上的语法,这就是AT&T语法。
无论语法再怎么变,汇编语言中指令关键字肯定不能有太大出入,名字非常接近,只是在指令名字的最后加上了操作数大小后缀,b表示1字节,w表示2字节,l表示4字节。比如压栈指令,intel中是push,AT&T中是pushl,最后这个’l’表示压入4字节(long型大小)。在了解intel汇编指令的情况下,基本上能够看懂AT&T的汇编指令。它们的主要差别是语法风格,咱们对照着看下这两种风格的区别吧。
图1
图1续
好了,下节再说,哥下班回家了。