没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
15页
Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .pdf Linux下的汇编语言学习笔记 .
资源推荐
资源详情
资源评论
Linux
下的汇编语言学习笔记
在阅读
Linux
源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以
.S
为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出
现在以
.c
为扩展名的
C
文件中,在这种文件中,既有
C
语言,也有汇编语言,我们把出
现在
C
代码中的汇编语言叫所“嵌入式”汇编。不管这些汇编代码出现在哪里,它在一定
程度上都成为阅读源代码的拦路虎。
尽管
C
语言已经成为编写操作系统的主要语言,但是,在操作系统与硬件打交道的过
程中,在需要频繁调用的函数中以及某些特殊的场合中,
C
语言显得力不从心,这时,
繁琐但又高效的汇编语言必须粉墨登场。因此,在了解一些硬件的基础上,必须对相关的
汇编语言知识也所有了解。
读者可能有过在
DOS
操作系统下编写汇编程序的经历
,
也具备一定的汇编知识。但是,
在
Linux
的源代码中,你可能看到了与
Intel
的汇编语言格式不一样的形式,这就是
AT&T
的
386
汇编语言。
一、
AT&T
与
Intel
汇编语言的比较
我们知道,
Linux
是
Unix
家族的一员,尽管
Linux
的历史不长,但与其相关的很多事
情都发源于
Unix
。就
Linux
所使用的
386
汇编语言而言,它也是起源于
Unix
。
Unix
最初是
为
PDP
-
11
开发的,曾先后被移植到
VAX
及
68000
系列的处理器上,这些处理器上的汇编
语言都采用的是
AT&T
的指令格式。当
Unix
被移植到
i386
时,自然也就采用了
AT&T
的汇
编语言格式,而不是
Intel
的格式。尽管这两种汇编语言在语法上有一定的差异,但所基
于的硬件知识是相同的,因此,如果你非常熟悉
Intel
的语法格式,那么你也可以很容
易地把它“移植“到
AT&T
来。下面我们通过对照
Intel
与
AT&T
的语法格式,以便于你把
过去的知识能很快地“移植”过来。
1
.前缀
在
Intel
的语法中,寄存器和和立即数都没有前缀。但是在
AT&T
中,寄存器前冠以
“%”,而立即数前冠以“
$”
。在
Intel
的语法中,十六进制和二进制立即数后缀分别
冠以“
h”
和“
b”
,而在
AT&T
中,十六进制立即数前冠以“
0x”
,表
2.2
给出几个相应
的例子。
表
2.2 Intel
与
AT&T
前缀的区别
Intel 语法 AT&T 语法
mov eax,8 movl $8,%eax
mov ebx,0ffffh movl $0xffff,%ebx
int 80h int $0x80
2.
操作数的方向
Intel
与
AT&T
操作数的方向正好相反。在
Intel
语法中,第一个操作数是目的操作数,
第二个操作数源操作数。而在
AT&T
中,第一个数是源操作数,第二个数是目的操作数。由
此可以看出,
AT&T
的语法符合人们通常的阅读习惯。
例如:在
Intel
中,
mov eax,[ecx]
在
AT&T
中,
movl (%ecx),%eax
3
.内存单元操作数
从上面的例子可以看出,内存操作数也有所不同。在
Intel
的语法中,基寄存器用“
[]”括起来,而在
AT&T
中,用“()”括起来。
例如: 在
Intel
中,
mov eax,[ebx+5]
在
AT&T
,
movl 5(%ebx),%eax
4
.间接寻址方式
与
Intel
的语法比较,
AT&T
间接寻址方式可能更晦涩难懂一些。
Intel
的指令格式是
segreg:[base+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
给出其语
法及几个相应的例子。
表
2.3
内存操作数的语法及举例
Intel 语法 AT&T 语法
指令 foo,segreg:[base+index*scale+disp] 指令 %segreg:disp(base,index,scale),foo
mov eax,[ebx+20h] Movl0x20(%ebx),%eax
add eax,[ebx+ecx*2h Addl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx] Leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h] Subl -0x20(%ebx,%ecx,0x4),%eax
从表中可以看出,
AT&T
的语法比较晦涩难懂,因为
[base+index*scale+disp]
一眼就可
以看出其含义,而
disp(base,index,scale)
则不可能做到这点。
这种寻址方式常常用在访问数据结构数组中某个特定元素内的一个字段,其中,
base
为数组的起始地址,
scale
为每个数组元素的大小,
index
为下标。如果数组元素还
是一个结构,则
disp
为具体字段在结构中的位移。
5
.操作码的后缀
在上面的例子中你可能已注意到,在
AT&T
的操作码后面有一个后缀,其含义就是
指出操作码的大小。“
l”
表示长整数(
32
位),“
w”
表示字(
16
位),“
b”
表示字节
(
8
位)。而在
Intel
的语法中,则要在内存单元操作数的前面加上
byte ptr
、
word ptr,
和
dword ptr
,“
dword”
对应“
long”
。表
2.4
给出几个相应的例子。
表
2.4
操作码的后缀举例
剩余14页未读,继续阅读
资源评论
悠闲饭团
- 粉丝: 150
- 资源: 3301
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功