AT&T的语法格式:
1、寄存器的引用:
引用寄存器要在寄存器前加%,如mov %eax,%ebx
2、操作数的顺序:
操作数排列时从源(左)到目的(右),如mov %eax(源),%ebx(目的)
3、常数/立即数的格式
a:使用立即数,要在数前面加$, mov $4, %ebx;把4赋值给ebx
b:符号常量直接引用;入mov value,%ebx;把value所代表的值传递给ebx
c:引用符号地址在符号前加$,如mov $value,%ebx;把value所在的地址付给ebx
4、操作数的长度
操作数的长度用加在指令后的符号表示
b(byte),w(word),l(long),如movw %ax,%bx;表示吧word大小的ax寄存器中的内容放到bx中;如果是字节则用movb...
5、在AT&T汇编格式中,绝对转移和调用指令(jmp/call)的操作数千加上*作为前缀
6、远转移指令和远调用指令的操作码,在AT&T汇编格式中为ljmp/lcall;
例如:ljmp $section,$offset;长跳转到,section偏移为offset的位置;
lcall $section,$offset;调用,section偏移为offset的东西;
远程返回:
lret $stack_adjust
寻址方式:
section:disp(base,index,scale)表示,base+index*scale+disp
例如:
movl -4(%ebp),%eax;把ebp中的内容减去4以后放到eax中
movl array(,%eax,4), %eax;把长度为long的array+4*eax地址中的数传递给eax
movw array(%ebx,%eax,4), %cx;把长度为word的array+ebx+4*eax地址中的数传递给cx
movb $4, %fs:(%ebx);把长度为byte的立即数4传递给段位fs偏移为ebx的地址的位置;
嵌入汇编:
__asm__("asm statements":outputs:inputs:registers-modified)
“asm statements”:汇编命令;
“outputs”:输出参数;
“inputs”:输入参数;
“registers-modified”:修改的寄存器参数;
output和input从0开始计数,一共可以输入到9共10个参数;汇编中以0%-9%表示;
"a","b","c","d"分别表示:eax,ebx和edx;
"S","D" 寄存器:esi、edi
'''r' 任何寄存器;
"0" 与前一个相同的寄存器;