由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的。但在Unix和Linux系统中,更多采用的还是AT&T格式,两者在语法格式上有着很大的不同,其实完全可以使用原来汇编的思路解决问题,只要掌握下面两者的不同:

一、在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]

  无论形式如何,都是实现如下的地址计算:(其中base和index必须是寄存器,disp和scale可以是常数)

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,也可以添加自定义section,但一个ELF可执行程序至少应该有一个.text部分。下面给出我们的第一个汇编程序,用的是AT&T汇编语言格式

例1.AT&T格式

#hello.s.data#数据段声明msg : .string "Hello, world!//n" #要输出的字符串len = . - msg#字串长度.text#代码段声明.global _start#指定入口函数_start:#在屏幕上显示一个字符串movl $len, %edx#参数三:字符串长度movl $msg, %ecx#参数二:要显示的字符串movl $1, %ebx#参数一:文件描述符(stdout)movl $4, %eax#系统调用号(sys_write)int$0x80#调用内核功能#退出程序movl $0,%ebx#参数一:退出代码movl $1,%eax#系统调用号(sys_exit)int$0x80#调用内核功能

初次接触到AT&T格式的汇编代码时,很多程序员都认为太晦涩难懂了,没有关系,在Linux平台上你同样可以使用Intel格式来编写汇编程序,建议还是坚持一下,毕竟在linux下at&t才是主流的语言格式

例2.Intel格式


; hello.asmsection .data;数据段声明msg db "Hello, world!", 0xA;要输出的字符串len equ $ - msg;字串长度section .text;代码段声明global _start;指定入口函数_start:;在屏幕上显示一个字符串mov edx, len;参数三:字符串长度mov ecx, msg;参数二:要显示的字符串mov ebx, 1;参数一:文件描述符(stdout)mov eax, 4;系统调用号(sys_write)int 0x80;调用内核功能;退出程序mov ebx, 0;参数一:退出代码mov eax, 1;系统调用号(sys_exit)int 0x80;调用内核功能

上面两个汇编程序采用的语法虽然完全不同。

相同的是: 1、功能却都是调用Linux内核提供的sys_write来显示一个字符串;

      2、调用sys_exit退出程序。在Linux内核源文件/usr/include/asm/unistd.h中,可以找到所有系统调用的定义。

不同的是: 1、程序注释AT&T使用#开始注释,Intel使用;开始注释;

      2、AT&T段的声明直接使用.data和.text即可,Inter使用section .data和section .text;

linux ATT汇编 与 Intel汇编 语法格式对比相关推荐

  1. att格式汇编指令_ATT 汇编语法

    在研华的pc104上使用看门狗要使用汇编.使用汇编来修改CMOS里面的参数.也就是内联汇编. linux下gcc只支持ATT汇编.所以这儿有必要将ATT语法学习学习.以后需要的时候翻出来温习温习. 1 ...

  2. Linux C中内联汇编的语法格式及使用方法

    在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly.本文的笔记试图说明Inline Assembly的基 ...

  3. ATT与Intel汇编代码格式

    ATT(根据"AT&T"命名的,AT&T是运营贝尔实验室多年的公司)格式汇编代码,是GCC.OBJDUMP和其他一些工具的默认格式.其他一些编程工具,包括Micro ...

  4. 一步步编写操作系统 78 intel汇编与ATT汇编语法区别

    本节咱们介绍下intel汇编语法和at&t汇编语法的区别. 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说. 在Intel语法中,立即数就是普通的数字,如果 ...

  5. ATT和Intel汇编杂谈

    作者:小安 博客地址:我的博客 今天,我们来梳理一下这常见的x86/x64平台下汇编语言的格式. 前言 一个高级语言写的程序会编译为二进制文件,但是其中有一个步骤是反汇编,这也是人们所能可以理解最底层 ...

  6. att格式汇编指令_ARM汇编伪指令介绍.

    符号定义( Symbol Definition )伪指令 符号定义伪指令用于定义 ARM 汇编程序中的变量.对变量赋值以及定义寄存器的别名等操作. 常见的符号定义伪指令有如下几种: - 用于定义全局变 ...

  7. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  8. c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump...

    目录 - C语言源码文件:sum.c - gcc 生成的汇编语言文件 sum.s x86-64 AT&T 语法格式 x86-64 Intel格式 - 反汇编 objdump 3.1 输出 AT ...

  9. linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南

    汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的.Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底 ...

最新文章

  1. 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
  2. BZOJ4921「Lydsy1706月赛」互质序列
  3. ubuntu+VsCode+Cmake+eigen 开发eigen应用
  4. 探究Java常量本质及三种常量池(JVM)
  5. boost::geometry::convert用法的测试程序
  6. Effective Java之消除受检警告(二十四)
  7. Java基本语法(13)--条件分支switch-case结构
  8. cocos2d-x学习资源汇总(持续更新。。。)
  9. Java实现阶乘的和
  10. 算法分析-动态规划-01背包
  11. 删除文件批处理delete file.bat
  12. C++使用opencv判断一个点是否在多边形之内
  13. python urllib.parse_Python3 urllib.parse 常用函数示例
  14. win10虚拟服务器安装xp,win10系统安装自带的xp虚拟机的处理技巧
  15. VS2010提示asp.net v4.0 尚未在web服务器上注册
  16. 51单片机连接ESP8266串口WiFi模块
  17. 上位机和下位机有什么区别和关系?常用上位机软件开发工具介绍
  18. Windows驱动开发WDM (2)- 一个简单的WDM驱动程序
  19. 无聊开始玩路由器,入门Tomato固件
  20. hbuilderx安装教程_HBuilderX入门教程

热门文章

  1. 算法(第四版)之快速排序
  2. 机器学习入门-决策树算法
  3. mybatis if标签比较字符串
  4. WP7下巧用MediaElement在雪藏中
  5. 是时候重新定义安全了,阿里云肖力解读安全责任共担模型
  6. Slave: received end packet from server, apparent master shutdown
  7. SqlServer_合并多个递归查询数据(CTE)
  8. Windows下Eclipse和PyDev搭建完美Python开发环境
  9. Go语言连接 zookeeper
  10. apache ab压力测试工具-批量压测脚本