阅读linux内核源代码时,底层的汇编语言格式使用的是AT&T。AT&T汇编语言格式和我们熟悉的intel的汇编很类似,但是也有很大的不同地方。现将常用的AT&T格式的语法列出如下。
1:寄存器应用
寄存器前加%,如mov %eax, %ebx
2:操作数顺序
操作数的排列从左到右为源到目的,如如mov %eax(源),%ebx(目的)
3:常数/立即数的格式
立即数前加$,如mov$4, %ebx (把立即数4复制到ebx寄存器中)
符号常数直接应用,如mov vaule, %ebx
应用符号地址在符号前加$,如mov $value, %ebx
4:操作数的长度
在指令后的符号表示
b(byte), w(word), l(long), 如movw %ax, %bx
5:绝对转移和调用指令(jmp/call)操作数前加上*,作为前缀
6:远程转移和调用指令为ljmp,lcall.(intel汇编则为jmp far, call far)
ljmp $section, $offset
lcall $section, $offset
7.远程返回指令
iret $stack_adjust
8:寻址方式
section:disp(base, index, scale)-------base+index*scale+disp
而intel格式为section:[base + index*scale +disp]
AT&T格式 intel格式
movl -4(%ebp), %eax mov eax, [ebp-4]
movl arry(, %eax, 4), %eax mov eax, [arry+eax*4]
movb $4, %fs:(%eax) mov fs:eax, 4
9:c语言中嵌入汇编的格式
_asm_("asm statement": outputs :inputs : registers-modified);