首页 > 程序人生 > 80×86汇编基础(三)——基本语法

80×86汇编基础(三)——基本语法

本文是继之前写过的两篇8086系列文章的第三篇,主要内容是对8086汇编的基本语法做一个总结与介绍。当前,在Windows平台上,用的大都是Intel的语法,而在Linux平台上,由于早期的GCC中用的是AT&T的语法,所以现在在Linux平台上,用的比较多的是AT&T的语法,Intel的语法在Linux平台上也有用,但是不常见。但是,总的来说,Intel和AT&T的汇编语法,都是目前比较常见的汇编语法,我们都有必要都进行了解一下,下面分别从几个方面通过对比,来介绍两种语法。

  • 1. 寄存器的命名
  • 1
    2
    
    AT&T: %eax, %ebx, %ecx, %edx
    Intel: eax, ebx, ecx, edx

    如上所示,AT&T的语法中,寄存器前面要加%号,而Intel的不用。

  • 2. 指令中src与dest的顺序
  • 1
    2
    
    AT&T: movl %eax, %ebx
    Intel: mov ebx, eax

    如上所示,AT&T的语法中,src在左,dest在右,而在Intel的语法中,src在右,dest在左。上面都是表示将eax中的值复制到ebx中。

  • 3. 常数的格式
  • 1
    2
    
    AT&T: movl $0xd00d, %eax
    Intel: mov eax, d00dh

    如上所示,AT&T语法中,常数前面要加上$符,而在Intel语法中不需要。

  • 4. 操作数的大小的指定
  • 1
    2
    3
    4
    
    AT&T: movw %ax, %bx
    Intel: mov bx, ax
    AT&T: movl %eax, %ebx
    Intel: mov ebx, eax

    如上所示,在AT&T的语法中,需要在指令后面加上b/w/l这些后缀,来表明操作数的大小。而在Intel语法中,不需要显式的指定。

  • 5. 内存地址的引用
  • 1
    2
    
    AT&T: immed32(basepointer,indexpointer,indexscale)
    Intel: [basepointer + indexpointer*indexscale + immed32]

    如上所示,在AT&T语法中,引用一个内存地址的语法,和Intel的所采用的格式是不一样的,上面的表达式都表示immed32+basepointer+indexpointer*indexscale这个值为内存地址处的值,这里indexscale的取值为2、4、8。
    以上即是AT&T和Intel语法的主要区别。AT&T汇编和Intel汇编都是基于8086体系的,因此,它们采用的都是相同的指令集,知道了上面的不同,再了解一下8086指令集中常用指令的用法与含义,我们便可以处理windows和linux平台下的汇编相关的大多数问题了。

    分类: 程序人生 标签: , , ,
    1. 2011年7月7日17:10 | #1

      看到代码就头晕

      —独立博客排行榜—已收录您的网站,如果觉得本网站有发展前途,请加本站友情链接!地址:www.blogdq.com

    2. 2011年7月19日09:24 | #2

      学习一下

    1. 本文目前尚无任何 trackbacks 和 pingbacks.
    您必须在 登录 后才能发布评论.