80×86汇编基础(三)——基本语法
本文是继之前写过的两篇8086系列文章的第三篇,主要内容是对8086汇编的基本语法做一个总结与介绍。当前,在Windows平台上,用的大都是Intel的语法,而在Linux平台上,由于早期的GCC中用的是AT&T的语法,所以现在在Linux平台上,用的比较多的是AT&T的语法,Intel的语法在Linux平台上也有用,但是不常见。但是,总的来说,Intel和AT&T的汇编语法,都是目前比较常见的汇编语法,我们都有必要都进行了解一下,下面分别从几个方面通过对比,来介绍两种语法。
1 2 | AT&T: %eax, %ebx, %ecx, %edx Intel: eax, ebx, ecx, edx |
如上所示,AT&T的语法中,寄存器前面要加%号,而Intel的不用。
1 2 | AT&T: movl %eax, %ebx Intel: mov ebx, eax |
如上所示,AT&T的语法中,src在左,dest在右,而在Intel的语法中,src在右,dest在左。上面都是表示将eax中的值复制到ebx中。
1 2 | AT&T: movl $0xd00d, %eax Intel: mov eax, d00dh |
如上所示,AT&T语法中,常数前面要加上$符,而在Intel语法中不需要。
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语法中,不需要显式的指定。
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平台下的汇编相关的大多数问题了。
看到代码就头晕
—独立博客排行榜—已收录您的网站,如果觉得本网站有发展前途,请加本站友情链接!地址:www.blogdq.com
学习一下