您的位置:首页 >> 编程开发 >> 汇编 >> 汇编技术资料 >> 正文
汇编技术资料 RSS
 

Linux下AT&T汇编语法格式简介

http://www.rdxx.com 08年09月05日 18:10 ChinaUnix 我要投稿

关键词: 汇编 , Linux , 格式 , 语法
一、AT&T 格式Linux 汇编语法格式

在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:
AT&T 格式
 Intel 格式

pushl %eax
 push eax


在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:
AT&T 格式
 Intel 格式

pushl $1
 push 1


AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:
AT&T 格式
 Intel 格式

addl $1, %eax
 add eax, 1


在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来表示的。例如:
AT&T 格式
 Intel 格式

movb val, %al
 mov al, byte ptr val


在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。
远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即:
AT&T 格式
 Intel 格式

ljump $section, $offset
 jmp far section:offset

lcall $section, $offset
 call far section:offset


与之相应的远程返回指令则为:
AT&T 格式
 Intel 格式

lret $stack_adjust
 ret far stack_adjust


在 AT&T 汇编格式中,内存操作数的寻址方式是
section:disp(base, index, scale)


而在 Intel 汇编格式中,内存操作数的寻址方式为:
section:[base + index*scale + disp]


由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:
disp + base + index * scale


下面是一些内存操作数的例子:
AT&T 格式
 Intel 格式

movl -4(%ebp), %eax
 mov eax, [ebp - 4]

movl array(, %eax, 4), %eax
 mov eax, [eax*4 + array]

movw array(%ebx, %eax, 4), %cx
 mov cx, [ebx + 4*eax + array]

movb $4, %fs:(%eax)
 mov fs:eax, 4


二、Hello World!

既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串 "Hello World!",那我们也以这种方式来开始介绍 Linux 下的汇编语言程序设计。

在 Linux 操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用 Linux 内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯,不需要链接诸如 libc 这样的函数库,也不需要使用 ELF 解释器,因而代码尺寸小且执行速度快。

Linux 是一个运行在保护模式下的 32 位操作系统,采用 flat memory 模式,目前最常用到的是 ELF 格式的二进制代码。一个 ELF 格式的可执行程序通常划分为如下几个部分:.text、.data 和 .bss,其中 .text 是只读的代码区,.data 是可读可写的数据区,而 .bss 则是可读可写且没有初始化的数据区。代码区和数据区在 ELF 中统称为 section,根据实际需要你可以使用其它标准的 section,也可以

9 7 3 1 2 3 4 8 :


 
 
标签: 汇编 , Linux , 格式 , 语法 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站