引用自:http://blog.csdn.net/wangshenwq/article/details/4700481
PS:这段时间在研究Linux源代码,遇到了AT&T汇编,故转贴个不错的AT&T汇编贴。
就像软件的真谛——“给我一个标准,我用我的逻辑舞动世界”一样,AT&T 汇编是汇编语言里的另一种标准,这是相对于鼎鼎大名的intel的x86汇编来说。即使对于电子专业的学生来说,一旦掌握了c51单片机的汇编,x86的汇编也已经入门了,但x86毕竟有着强大的寄存器,在串操作指令和操作系统类指令方面,单片机还是望尘莫及的。
下面的两段话就轻易的涉及到了关于前缀、操作数的方向、操作码的后缀这些概念的不同。关于前缀,AT&T 汇编中,寄存器前被冠以“%”,立即数前被冠以“$”,十六进制数前被冠以“0x”。所以,如果gemfield在AT&T 语境中说到386的通用寄存器时,会这样描述:8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp。比如:在stage1.s中,有这么一个定义,#define ABS(x) (x-_start+0x7c00),那么你就会知到0x7c00是个十六进制数(_start函数的入口地址就位于内存的0x7c00处)。
而在设置int 0x13的0x42功能号时,它是这么说的:movb $0x42,%ah 。这句告诉了我们一些不同之处:首先,操作码的后缀l表示的是操作码的大小,l是长整数32位,那么相应的,movw是16位,movb是8位;其次,立即数是用$前缀来表示的,就像$0x42;再次,寄存器的名字是有%前缀的,像例子中的%ah;最后,操作数的方向有点不一样,比如把立即数$0x42放到寄存器%ah中,用的是movb $0x42,%ah,也即源操作数在前,目的操作数在后。