Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372383
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: 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

阅读(1185) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~