AT&T汇编学习

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

猜你喜欢

转载自blog.csdn.net/u014630623/article/details/88913878
今日推荐