分享

AT&T 汇编语言

 山峰云绕 2023-01-30 发布于贵州

https://m.toutiao.com/is/BLxooRT/ 


Linux是Unix家族的一员,就Linux所使用的386汇编语言而言,它也是起源于Unix。当Unix被移植到i386时,自然也就采用了AT&T的汇编语言格式,而不是Intel的格式。尽管这两种汇编语言在语法上有一定的差异,但所基于的硬件知识是相同的, 下面通过对照Intel与AT&T的语法格式,以便于将intel汇编的知识很快地运用移植到AT&T汇编中来。

在Linux中,以.s(.S)为扩展名的文件是包含汇编语言代码的文件。在Linux下有两种方式对AT&T汇编进行编译链接,一种是使用汇编程序GAS和连接程序LD,一种是使用GCC。

  • 使用汇编程序GAS和连接程序LD(命令是asld):
as sourcecode.s -o objfile.o    // 将汇编源文件编译成目标文件ld objfile.o -o execode         // 将目标文件链接成可执行文件
  • 使用GCC:
gcc -o execode sourcecode.S      //使用GCC编译一步就可以编译成可执行文件

以一个简单的AT&T的汇编hello world程序为例:

.data output: .ascii 'hello world\n' .text .globl _start _start:        movl $4, %eax        movl $1, %ebx movl $output, %ecx movl $12, %edx int $0x80 movl $1, %eax int $0x80

可以看到AT&T的汇编与Intel汇编非常相像,区别主要是一些格式上的区别。

  • 前缀不同在Intel的语法中,寄存器和和立即数都没有前缀。但是在AT&T中,寄存器前需要加上'%',而立即数前需要加上'$'。在Intel的语法中,十六进制和二进制立即数后缀分别是“h”和“b”,而在AT&T中,十六进制立即数前需要加上'0x'。

Intel语法

AT&T语法

mov eax, 8

movl $8, %eax

mov ebx, 0ffffh

movl $0xffff, %ebx

int 80h

int $0x80

  • 操作数方向不同Intel与AT&T操作数的方向正好相反。在Intel语法中,第一个操作数是目的操作数,第二个操作数源操作数。而在AT&T中,第一个数是源操作数,第二个数是目的操作数。

Intel语法

AT&T语法

mov eax, [ecx]

movl (%ecx), %eax

  • 内存单元操作数不同在Intel的语法中,基寄存器用“[]”括起来,而在AT&T中,用“()”括起来。

Intel语法

AT&T语法

mov eax, [ebx+5]

movl 5(%ebx), %eax

  • 寻址方式不同Intel的指令格式是segreg:[base+index*scale+disp],而AT&T的格式是 %segreg:disp(base,index,scale)。其中index/scale/disp/segreg全部是可选的,完全可以简化掉。如果没有指定scale而指定了index,则scale的缺省值为1。当立即数用在scale/disp中时,不应当在其前冠以“$”前缀。

Intel语法

AT&T语法

指令 foo, segreg:[base+index*scale+disp]

指令 %segreg:disp(base,index,scale), foo

mov eax,[ebx+20h]

movl 0x20(%ebx),%eax

add eax,[ebx+ecx*2h]

addl (%ebx,%ecx,0x2),%eax

lea eax,[ebx+ecx]

leal (%ebx,%ecx),%eax

sub eax,[ebx+ecx*4h-20h]

subl -0x20(%ebx,%ecx,0x4),%eax

  • 后缀不同:在AT&T的操作码后面有一个后缀,其含义就是指出操作码的大小。'l'表示长整数(32位),'w'表示字(16位),'b'表示字节(8位)。而在Intel的语法中,则要在内存单元操作数的前面加上byte ptr, word ptr 和 dword ptr。

Intel语法

AT&T语法

mov al,bl

movb %bl,%al

mov ax,bx

movw %bx,%ax

mov eax,ebx

movl %ebx,%eax

mov eax, dword ptr [ebx]

movl (%ebx),%eax

在学习了这些区别之后, 可以更好的学习linux操作系统的源码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多