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。
.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 #调用内核功能运行代码