分类: LINUX
2012-07-13 19:39:23
因为我学过Intel汇编,所以主要还是讲讲AT&T与汇编语言的比较,这样理解起来可能会比较容易理解一些。 先说一下基本的概念吧:在LINUX源代码中,大部分是用C语言编写的,但也涉及汇编语言。以.S为扩展名的文件是“纯”汇编语言的文件。有些汇编命令出现在以.C为扩展名的文件C文件中,既有C语言,也有汇编语言,我们把出现在C代码中的汇编语言叫做“嵌入式”汇编。
1.前缀:在AT&T中,寄存器前假%,而立即数前加$.在十六进制的立即数前加0x.
AT&T:movl $8,%eax;
intel: mov eax,8;
2.操作数的方向:在AT&T中,第一个数是源操作数,第二个是目的操作数。在Intel中,第一个是目的操作数,第二个是源操数。
AT&T:movl (%eax),%eax;
intel: mov eax [eax];
3.寻址方式:
(1)直接寻址
AT&T: _booga ;
_booga是一个全局的C变量;注意加上$是表示地址引用,不加是表示值引用.
注:对于局部变量,可以通过堆栈指针引用.
Intel: [_booga]
(2)寄存器间接寻址
AT&T: (%eax)
Intel: [eax]
(3)变址寻址
AT&T: _variable(%eax)
Intel: [eax + _variable]
AT&T: _array(,%eax,4)
Intel: [eax*4 + _array]
AT&T: _array(%ebx,%eax,8)
Intel: [ebx + eax*8 + _array]
4.操作碼的后缀:
l表示长整数(32位)w表示字(16位)b表示字节(8位)。如下面的代码,分别表示传送寄存器eax中的1字节、2字节、4字节到寄存器的bl、bx、ebx中。
AT&T: Intel:
movb %al,%bl mov al,bl
movw %ax,%bx mov ax,bx
movl %eax,%ebx mov eax,ebx