(转)Linux 中的汇编语言

本文详细介绍了 Linux 操作系统中汇编语言的特点,特别是 AT&T 汇编语言与 Intel 汇编语言的差异,包括前缀、操作数方向、内存操作数、间接寻址和操作码后缀等方面的对比。此外,文章还讲解了 GNU 汇编程序 GAS(GNU Assembler)和连接程序 ld 的使用,以及在 Linux 源代码中汇编语言的运用,如节(Section)、汇编指令(Assembler Directive)和 GCC 嵌入式汇编的使用方法,帮助读者理解并掌握 Linux 下的汇编语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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+i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值