linux内核源代码情景分析 上 读书笔记(二)
在Dos和windows领域中,汇编语言都是采用Intel所定义的格式,我以前学习的汇编语言教科书也是采用Intel格式,然而在Unix/linux领域,采用的却是AT&T的格式,所以一开始看起来还是有点不习惯,那么这两种格式到底有哪些差异了?下面我总结了一下:
1,在Intel格式中一般采用大写字母,然而在AT&T中一般采用小写字母,
2,在AT&T格式中,寄存器名前面需要加上“%”作为前缀,而在Intel格式中不需要,
3,在AT&T格式中,指令的源操作数和目标操作数的顺序正好和Intel格式相反,在Intel中是目标在前,源在后,AT&T中正好相反。
例如: 在Intel中 :MOV EAX,EBX 是把ebx中的值mov到eax中
在AT&T中 : mov %ebx,%eax 实现相同的功能
4,在AT&T的格式中,访存指令的操作数宽度由操作码的后缀也就是操作码的最后一个字母来决定,用作操作码后缀的字母有b(表示8位),w(表示16位),l(表示32位)。而在Intel格式中,则是在表示内存单元的操作数前面加上“BYTE
PTR”,“WORD PTR”,或者“DWORD PTR”.
例如: 在Intel中: MOV AL,BYTE PTR FOO 将FOO所指的内存单元中的字节取入8位寄存器AL中,
在AT&T中: movb FOO %al
5,在AT&T格式中,直接操作数要加上"$"作为前缀,在Intel格式中不带前缀。
例如:在Intel中:PUSH 4
在AT&T中:pushl $4
6,在AT&T格式中,绝对转移和调用指令jmp/call的操作数,要加上“*”作为前缀,而Intel格式中不带。
7,远程的跳转指令和子程序调用指令的操作码,在AT&T格式中是“ljmp”和“lcall”,而在Intel格式中是
“JMP FAR”和“CALL FAR”
8,间接寻址的一般格式:
与Intel的语法比较,AT&T间接寻址方式可能更晦涩难懂一些。
Intel的指令格式是segreg:[base+index*scale+disp],
而AT&T的格式是%segreg:disp(base,index,scale)。
其中index/scale/disp/segreg全部是可选的,完全可以简化掉。
如果没有指定scale而指定了index,则scale的缺省值为1。segreg段寄存器依赖于指令以及应用程序是运行在实模式还是保护模式下,在实模式下,它依赖于指令,而在保护模式下,segreg是多余的。