二、汇编语言
任何一个操作系统的源代码中都少不了汇编语言,由于目前教学大都在Windows平台上进行���因此大家一般较熟悉的是Intel的汇编语法,但在Linux内核代码中使用的却是AT&T的汇编。AT&T汇编与Intel汇编有几点不同:
1)前缀:Intel汇编语法中,寄存器和立即数没有前缀,但AT&T汇编语法中,寄存器前缀为“%”,立即数前缀为“$”
例:
INTEL AT&T
MOV EAX,1 movl $1,%eax
2)操作数方向:两种汇编操作数方向正好相反,Intel汇编中第一个操作数为目的操作数,第二个为源操作数;而AT&T中第一个为源操作数,第二个为目的操作数
例:
INTEL AT&T
MOV EAX,EBX movl %ebx,%eax
3)操作数位宽:Intel汇编中,由特定字符指定操作数位宽,如用“BYTE PTR”,“WORD PTR”来表示;AT&T中,有操作码最后一个字符来指定操作数位宽
例:
INTEL AT&T
mov al, bl movb %bl,%al
mov ax,bx movw %bx,%ax
mov eax, dword ptr movl (%ebx), %eax
4)间接寻址方式:INTEL 中基地址使用“[”、“] ”,而在AT&T 中使用“(”、“) ”;另外处理复杂操作数的 语法也不同, INTEL 为Segreg:[base+index*scale+disp],而在AT&T 中为 %segreg:disp(base,index,sale),其中segreg,index,scale,disp都是可选的,在指定 index而没有显式指定Scale的情况下使用默认值1。Scale和disp不需要加前缀“&”
例:
INTEL AT&T
Instr instr
foo,segreg:[base+index*scale+disp] %segreg:disp(base,index,scale),foo
5)大小写:Intel格式的指令使用大写字母,而AT&T格式的使用小写字母
例:
INTEL AT&T
MOV EAX,EBX movl %ebx,%eax
6)指令: Intel汇编与AT&T汇编指令基本相同,差别仅在语法上。关于每条指令的语法在此不再赘述,具体可参考技术手册
Linux内核学习笔记(2)
内容版权声明:除非注明,否则皆为本站原创文章。