AT&T 汇编语法格式
1.寄存器引用 Mov %eax, %ebx
2.操作数顺序 mov %eax(源),%ebx(目的).
3.常数/立即数的格式
使用立即数,,要在数前面加$,如 mov $4, %ebx
符号常数直接引用,如 mov value, %ebx
引用符号地址在符号前加$,如 mov $value, %ebx
4.操作数的长度 movw %ax, %bx
5.绝对转移和调用指令(jmp/call)的操作数前要加上’*’作为前缀.
6.远转移指令和远调用指令的操作码,汇编格式为”ljmp”和”lcall”.
ljmp $section, $offset
lcall $section, $offset
远程返回指令
lret $stack_adujst
7.寻址方式
section:disp(base,index,scale)表示,计算方法是 base+index*scale+disp
AT& T嵌入汇编
_asm_(“asm statements” : outputs : inputs : registers-modified);
: outputs : inputs : registers-modified 序号为1---9.
几个例子
1._asm_(“ pushl %%eax /n/t”
“movl $0,%%eax /n/t”
“popl %eax”);
%%,因为GCC编译过程中,会有个中间层.
2.{register char_res;/
asm(*push %%fs /n/t”
“movw %%ax,%%fs /n/t”
“ movb %%fs:%2,%%al /n/t”
“pop %%fs”
:”=a(_res):” 0” (seg),”m”(*(addr)));/
_res;}
3.int main()
{
int a1=10, b1=0;
_asm_(“movl %1,%%eax;/n/r”
“movl %%eax,%%ecx;;”
:”=a”(b1)
:”b”(a1)
:”%eax”);
printf(“Result :%d,%d//n”,a1,b1);
}
输出结果: Result: 10,10
“a” ,”b”,”c”,”d”分别表示寄存器eax,ebx,ecx,edx
“s”和”d”寄存器 esi,edi
“r” 任何寄存器