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。
as sourcecode.s -o objfile.o // 将汇编源文件编译成目标文件ld objfile.o -o execode // 将目标文件链接成可执行文件
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语法 |
mov eax, 8 | movl $8, %eax |
mov ebx, 0ffffh | movl $0xffff, %ebx |
int 80h | int $0x80 |
Intel语法 | AT&T语法 |
mov eax, [ecx] | movl (%ecx), %eax |
Intel语法 | AT&T语法 |
mov eax, [ebx+5] | movl 5(%ebx), %eax |
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 |
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操作系统的源码
联系客服