导航

linux学习-AT&T

Posted on 2010-11-15 17:04  fxcser  阅读(199)  评论(0)    收藏  举报

最简单的main函数

test1.c

 

#include "stdio.h"  

int main()

{

  
return 0;

}

gcc -S test1.c -o test.s

 

 

代码
.file "test1.c"
.text
.globl main
.type main, @function
main:
leal
4(%esp), %ecx
andl $
-16, %esp
pushl
-4(%ecx)
pushl
%ebp
movl
%esp, %ebp
pushl
%ecx
movl $
0, %eax
popl
%ecx
popl
%ebp
leal
-4(%ecx), %esp
ret
.size main, .
-main
.ident
"GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30)"
.section .note.GNU
-stack,"",@progbits

AT&T语法和intel系列汇编语言有差别

1、指令大小写

  intel大写,AT&T小写

2、指令操作数赋值方向

  intel从右到左:MOV EAX, EBX

  AT&T从左到右:movl %ebx, %eax

3、指令前缀

  intel语法中寄存器和立即数不需要前缀

  AT&T寄存器加前缀“%”,立即数加前缀“$”:movl $1, %eax; 符号常数直接饮用,不加前缀movl value, %ebx; 符号前加$,表示引用符号地址

  movl %value, %ebx

4、间接寻址

  intel中基地址实用[],AT&T中使用()

  intel中segreg:[base+index*scale+disp],AT&T中%segreg:disp(base,index,scale)