AT&T汇编学习

汇编格式主要包括Intel和AT&T汇编格式两种,两种汇编语言的格式在使用上有较大的差别,我们上一章讲解的汇编格式是以intel的风格为例的,但是在Unix和Linux系统中,大部分的汇编语言采用的是AT&T格式。

注:本节中的实例均以i386处理器中汇编指令为例

AT&T汇编与intel汇编格式对比

AT&T intel 说明
pushl %eax push eax 在AT&T格式中,需要在寄存器前面加上%
pushl $1 push 1 在AT&T中使用$作为前缀表示立即数操作
addl $1 %eax add eax 1 AT&T格式的目的操作数和源操作数的顺序与intel格式相反
movl val,%al mov al, byte ptr val AT&T格式操作数的长度由操作符的最后一个字母标识,分别是(movw[word],movl(long)movb[byte])
section:disp(base, index, scale) section:[base + index*scale + disp] 内存寻址方式不同

简单汇编代码分析

下面一段代码的作用是在屏幕上打印helloworld。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.data # 数据段,该段的数据为初始化数据
msg: .string "helloworld" #定义string类型变量msg,并赋初始值helloworld
len = . - msg #使用段的起始地址和msg地址相减的方式计算msg的长度
.text #代码段初始位置
.global _start #使得连接程序看得到该symbol,这样就可以在其他文件中引用
_start:
movl $len,%edx #edx中存储要打印的数据的长度
movl $msg,%ecx #ecx中存储打印为数据内容
movl $1,%ebx #ebx中为文件描述符,其中1为标准输出流的文件描述符
movl $4,%eax #eax中为系统调用号,4表示sys_write
int $0x80 #调用内核功能执行,此段代码执行后屏幕上打印出helloworld
movl $0,%ebx #0标识退出代码
movl $1,%eax #1为系统调用号(sys_exit)
int $0x80 #调用内核功能运行代码