linux中的汇编语言

linux中的汇编语言

ID:5378353

大小:287.66 KB

页数:15页

时间:2017-12-08

linux中的汇编语言_第1页
linux中的汇编语言_第2页
linux中的汇编语言_第3页
linux中的汇编语言_第4页
linux中的汇编语言_第5页
资源描述:

《linux中的汇编语言》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Linux中的汇编语言在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出现在以.c为扩展名的C文件中,在这种文件中,既有C语言,也有汇编语言,我们把出现在C代码中的汇编语言叫所“嵌入式”汇编。不管这些汇编代码出现在哪里,它在一定程度上都成为阅读源代码的拦路虎。尽管C语言已经成为编写操作系统的主要语言,但是,在操作系统与硬件打交道的过程中,在需要频繁调用的函数中以及某些特殊的场合中,C语言显得力不从心,这时,繁琐但又

2、高效的汇编语言必须粉墨登场。因此,在了解一些硬件的基础上,必须对相关的汇编语言知识也所有了解。读者可能有过在DOS操作系统下编写汇编程序的经历,也具备一定的汇编知识。但是,在Linux的源代码中,你可能看到了与Intel的汇编语言格式不一样的形式,这就是AT&T的386汇编语言。一、AT&T与Intel汇编语言的比较我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix。就Linux所使用的386汇编语言而言,它也是起源于Unix。Unix最初是为PDP-11开发的,曾

3、先后被移植到VAX及68000系列的处理器上,这些处理器上的汇编语言都采用的是AT&T的指令格式。当Unix被移植到i386时,自然也就采用了AT&T的汇编语言格式,而不是Intel的格式。尽管这两种汇编语言在语法上有一定的差异,但所基于的硬件知识是相同的,因此,如果你非常熟悉Intel的语法格式,那么你也可以很容易地把它“移植“到AT&T来。下面我们通过对照Intel与AT&T的语法格式,以便于你把过去的知识能很快地“移植”过来。1.前缀在Intel的语法中,寄存器和和立即数都没有前缀。但是在AT&T中,寄存器前冠以

4、“%”,而立即数前冠以“$”。在Intel的语法中,十六进制和二进制立即数后缀分别冠以“h”和“b”,而在AT&T中,十六进制立即数前冠以“0x”,表2.2给出几个相应的例子。表2.2Intel与AT&T前缀的区别Intel语法AT&T语法moveax,8movl$8,%eaxmovebx,0ffffhmovl$0xffff,%ebxint80hint$0x802.操作数的方向Intel与AT&T操作数的方向正好相反。在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数

5、,第二个数是目的操作数。由此可以看出,AT&T的语法符合人们通常的阅读习惯。例如:在Intel中,moveax,[ecx]在AT&T中,movl(%ecx),%eax3.内存单元操作数从上面的例子可以看出,内存操作数也有所不同。在Intel的语法中,基寄存器用“[]”括起来,而在AT&T中,用“()”括起来。例如:在Intel中,moveax,[ebx+5]在AT&T,movl5(%ebx),%eax4.间接寻址方式与Intel的语法比较,AT&T间接寻址方式可能更晦涩难懂一些。Intel的指令格式是segreg:[b

6、ase+index*scale+disp],而AT&T的格式是%segreg:disp(base,index,scale)。其中index/scale/disp/segreg全部是可选的,完全可以简化掉。如果没有指定scale而指定了index,则scale的缺省值为1。segreg段寄存器依赖于指令以及应用程序是运行在实模式还是保护模式下,在实模式下,它依赖于指令,而在保护模式下,segreg是多余的。在AT&T中,当立即数用在scale/disp中时,不应当在其前冠以“$”前缀,表2.3给出其语法及几个相应的例子。

7、表2.3内存操作数的语法及举例Intel语法AT&T语法指令foo,segreg:[base+index*scale+disp]指令%segreg:disp(base,index,scale),foomoveax,[ebx+20h]Movl0x20(%ebx),%eaxaddeax,[ebx+ecx*2hAddl(%ebx,%ecx,0x2),%eaxleaeax,[ebx+ecx]Leal(%ebx,%ecx),%eaxsubeax,[ebx+ecx*4h-20h]Subl-0x20(%ebx,%ecx,0x4),%

8、eax从表中可以看出,AT&T的语法比较晦涩难懂,因为[base+index*scale+disp]一眼就可以看出其含义,而disp(base,index,scale)则不可能做到这点。这种寻址方式常常用在访问数据结构数组中某个特定元素内的一个字段,其中,base为数组的起始地址,scale为每个数组元素的大小,index为下标。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。